stm32 RAM分配及占有(转)

[复制链接]
 楼主| haolaishi 发表于 2015-4-27 15:39 | 显示全部楼层 |阅读模式
一个小的项目,在测试时间和产品量稍微大一些之后,出现了一些莫名其妙的非逻辑错误的Bug(最头疼的是不能每次都能复制出来)。经过修改后,最近一个月的测试都没有出现。本人在这里得到了原子哥和其他朋友的很多帮助,也把自己的一些经验分享给各位,也欢迎大家指正。
 楼主| haolaishi 发表于 2015-4-27 15:41 | 显示全部楼层
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,这个问题就再也没出现了。
 楼主| haolaishi 发表于 2015-4-27 15:44 | 显示全部楼层
相关资料:
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
 楼主| haolaishi 发表于 2015-4-27 15:44 | 显示全部楼层
2. 程序莫名其妙死机,
猜想因为申请了很多零时变量,可能需要调整Stack_Size
在STM32F10x.s文件中
修改Stack_Size      EQU     0x00000200
成Stack_Size      EQU     0x00000400
就再没出现死机的情况。
jack888518 发表于 2015-5-11 13:57 | 显示全部楼层
这个不错
vivilzb1985 发表于 2015-5-14 21:26 | 显示全部楼层
这个是针对不同的芯片的,其flash大小的也不相同的,其对应的程序地址的都不一样。
shenmu2012 发表于 2015-5-17 13:29 | 显示全部楼层
解决ram被使用过多的一个方法是尽量少用全局变量,能用const就用一定用const变量,因为这样会放在flash,而不是ram.
firstblood 发表于 2015-5-17 16:40 | 显示全部楼层
haolaishi 发表于 2015-4-27 15:41
1. 程序偶尔会出现一些Bug,经过output串口信息发现一些堆栈的临时变量被莫名其妙的修改。
stm32103rbt6的 ...

这个我下去的也试试的啊,,看来节省了很大的内存空间的。
comeon201208 发表于 2015-5-19 22:22 | 显示全部楼层
tm32103rbt6的内存是20K,算比较小了,看到程序出错的那个函数申请了很多零时变量,也需要访问很多全局变量。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:不忘初心,积极乐观,勤且道义!

243

主题

1996

帖子

12

粉丝
快速回复 在线客服 返回列表 返回顶部