[应用相关]

(转)STM32内存的一点理解

[复制链接]
954|3
手机看帖
扫描二维码
随时随地手机跟帖
guanjiaer|  楼主 | 2018-8-18 14:01 | 显示全部楼层 |阅读模式
一个小的项目,在测试时间和产品量稍微大一些之后,出现了一些莫名其妙的非逻辑错误的Bug(最头疼的是不能每次都能复制出来)。经过修改后,最近一个月的测试都没有出现。本人在这里得到了原子哥和其他朋友的很多帮助,也把自己的一些经验分享给各位,也欢迎大家指正。

1. 程序偶尔会出现一些Bug,经过output串口信息发现一些堆栈的临时变量被莫名其妙的修改。
stm32103rbt6的内存是20K,算比较小了,看到程序出错的那个函数申请了很多零时变量,也需要访问很多全局变量。猜想是内存被其他操作更改所致。
解决ram被使用过多的一个方法是尽量少用全局变量,能用const就用一定用const变量,因为这样会放在flash,而不是ram.
我的程序未将全局变量修改成const变量之前,编译出来
Program Size: Code=40998 RO-data=8702 RW-data=3724 ZI-data=3260
尽量将全局变量修改成const变量之后,编译出来
Program Size: Code=35778 RO-data=13470 RW-data=108 ZI-data=2060     
大大减少了RW-data,这个问题就再也没出现了。

相关资料:
Code为程序代码部分
RO-data 表示 程序定义的常量 const temp;
RW-data 表示 已初始化的全局变量
ZI-data 表示 未初始化的全局变量
Total RO  Size (Code + RO Data)
Total RW  Size (RW Data + ZI Data)
Total ROM Size (Code + RO Data + RW Data)
初始化时RW-data从flash拷贝到RAM

2. 程序莫名其妙死机,
猜想因为申请了很多零时变量,可能需要调整Stack_Size
在STM32F10x.s文件中
修改Stack_Size      EQU     0x00000200
成Stack_Size      EQU     0x00000400
就再没出现死机的情况。
keaibukelian| | 2018-8-18 15:04 | 显示全部楼层
对的 一般都这样处理

使用特权

评论回复
dingbo95| | 2018-8-19 19:53 | 显示全部楼层
一般是修改堆栈的大小

使用特权

评论回复
磨砂| | 2018-8-20 10:27 | 显示全部楼层
不是很知道分配情况 一般自己都是小修小改

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

72

主题

3836

帖子

2

粉丝