最近编写程序调试过程中遇到了一个问题,问题描述如下: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、自己使用的单片机是:STM32F103RET6有FLASH:512K RAM:64K2、查看程序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.644KRAM=RW+ZI=271.736K这样的话我的程序占得空间已经远远超过我的单片机性能了,为什么程序大部分功能还能完成,只有局部变量变化不行。而且当我把局部变量定义为static时,程序还能正常运行。没有加FATFS和RTC之前程序占得空间:Program Size: Code=78492 RO-data=4116 RW-data=1620 ZI-data=6292 FLASH=84KRAM: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,问题还是一样。查看资料:栈:编译器自动释放;堆:程序员自己申请自己释放;(单片机开发中,用到操作系统时需要开辟)全局区(静态区):全局变量或者静态变量;程序代码区:程序的函数等。 通过查阅三个点,没有找到自己的原因在那里?请大神们帮忙找一下谢谢。再者:单片机的:FALSH和RAM空间/编译器生成的:PROGRAMSIZE四个大小/堆和栈静态区的关系是什么?有没有系统的教程推荐一下。芯片选型时如何根据程序量进行评估,编写过程中如何查看能预防类似问题?谢谢
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>