OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 1980|回复: 2

STM32F103调用文件系统保存信息时局部变量变化

[复制链接]

12

主题

26

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2013-8-1
在线时间
10 小时
发表于 2018-5-5 21:32:17 | 显示全部楼层 |阅读模式
最近编写程序调试过程中遇到了一个问题,问题描述如下:
void fun1()
{
  int ret;
  ret=fun2();
  printf(“第一次%X”,ret);
  rave();//调用了文件系统中的f_open().f_close();
printf(“第二次%X”,ret);
}
如果调用的save函数:
打印结果如下:
第一次0X300E
第二次0X3000
如果去掉save函数:
打印结果如下:
第一次0X3000E
第二次0X3000E
程序中多个函数中出现类似问题,还有一次在循环中保存传感器数据,保存后i就会从自加的数变为:0
自己的基础不好,分析的过程如下:
1、自己使用的单片机是:STM32F103RET6FLASH:512K RAM:64K
2、查看程序Program Size: Code=100818 RO-data=180866 RW-data=1960 ZI-data=269176
通过网络查询这四个尺寸的含义:
Code:代码占得空间;
RO_data:只读变量空间,const
RW:已经初始化的变量占的空间;(包括全局和局部)
ZI:未初始化或者初始化为0的变量占得空间;(包括全局和局部)
FLASH=CODE+RO+RW=288.644K
RAM=RW+ZI=271.736K
这样的话我的程序占得空间已经远远超过我的单片机性能了,为什么程序大部分功能还能完成,只有局部变量变化不行。而且当我把局部变量定义为static时,程序还能正常运行。
没有加FATFSRTC之前程序占得空间:
Program Size: Code=78492 RO-data=4116 RW-data=1620 ZI-data=6292
FLASH=84K
RAM:7.9K
程序采用裸奔,用的库是正点原子的寄存器库。自己的代码大约有3W行;
查看正点原子的FATFS的例程占空间如下:
Program Size: Code=51114 RO-data=182554 RW-data=580 ZI-data=1094148
这样来看我的移植的FATFS文件系统应该没有很大的问题。
3、网上说是局部变量定义的太多也就是STACK空间不足,查看启动代码:
Stack_Size      EQU     0x00000800
即使将数据调整为0X00001200,问题还是一样。
查看资料:
栈:编译器自动释放;
堆:程序员自己申请自己释放;(单片机开发中,用到操作系统时需要开辟)
全局区(静态区):全局变量或者静态变量;
程序代码区:程序的函数等。
通过查阅三个点,没有找到自己的原因在那里?请大神们帮忙找一下谢谢。
再者:单片机的:FALSHRAM空间/编译器生成的:PROGRAMSIZE四个大小/堆和栈静态区的关系是什么?有没有系统的教程推荐一下。
芯片选型时如何根据程序量进行评估,编写过程中如何查看能预防类似问题?谢谢

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

1155

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7464
金钱
7464
注册时间
2015-1-15
在线时间
1368 小时
发表于 2018-5-7 09:33:24 | 显示全部楼层
高手,都开始研究这个了
一分耕耘一分收获。
回复 支持 反对

使用道具 举报

0

主题

9

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2018-4-27
在线时间
5 小时
发表于 2018-5-7 10:52:46 | 显示全部楼层
为了积分我只能水贴了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-5 12:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表