打印

stm32 RAM分配及占有(转)

[复制链接]
935|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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
就再没出现死机的情况。

使用特权

评论回复
5
jack888518| | 2015-5-11 13:57 | 只看该作者
这个不错

使用特权

评论回复
6
vivilzb1985| | 2015-5-14 21:26 | 只看该作者
这个是针对不同的芯片的,其flash大小的也不相同的,其对应的程序地址的都不一样。

使用特权

评论回复
7
shenmu2012| | 2015-5-17 13:29 | 只看该作者
解决ram被使用过多的一个方法是尽量少用全局变量,能用const就用一定用const变量,因为这样会放在flash,而不是ram.

使用特权

评论回复
8
firstblood| | 2015-5-17 16:40 | 只看该作者
haolaishi 发表于 2015-4-27 15:41
1. 程序偶尔会出现一些Bug,经过output串口信息发现一些堆栈的临时变量被莫名其妙的修改。
stm32103rbt6的 ...

这个我下去的也试试的啊,,看来节省了很大的内存空间的。

使用特权

评论回复
9
comeon201208| | 2015-5-19 22:22 | 只看该作者
tm32103rbt6的内存是20K,算比较小了,看到程序出错的那个函数申请了很多零时变量,也需要访问很多全局变量。

使用特权

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

本版积分规则

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

243

主题

1996

帖子

12

粉丝