OpenEdv-开源电子网

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

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

[复制链接]

12

主题

26

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2013-8-1
在线时间
10 小时
发表于 2018-5-5 21:41:05 | 显示全部楼层 |阅读模式
90金钱
最近编写程序调试过程中遇到了一个问题,问题描述如下:
void fun1()
{
  int ret;
  ret=fun2();
  printf(“第一次%X”,ret);
  save();//调用了文件系统中的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劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2018-5-6 01:44:08 | 显示全部楼层
关键看你的save函数到底做了什么事情。如果save占用的堆栈太多,就可能出现这种情况。你不信可以把save搞成一个空函数,看还这样么?
回复

使用道具 举报

12

主题

26

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2013-8-1
在线时间
10 小时
 楼主| 发表于 2018-5-8 09:02:21 | 显示全部楼层
正点原子 发表于 2018-5-6 01:44
关键看你的save函数到底做了什么事情。如果save占用的堆栈太多,就可能出现这种情况。你不信可以把save搞成 ...

搞成孔就不出了,save里面是f_open,直接COPY的战舰代码
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2018-5-9 01:50:13 | 显示全部楼层
mrxiaocui 发表于 2018-5-8 09:02
搞成孔就不出了,save里面是f_open,直接COPY的战舰代码

吧堆栈设置大一点试试
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

10

主题

196

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
390
金钱
390
注册时间
2018-3-20
在线时间
80 小时
发表于 2018-5-9 07:11:54 来自手机 | 显示全部楼层
如果你的 fs和 fnew 都是在save里声明的,那栈至少要1.05k,还有其他局部变量继续扩大
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 02:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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