历史上的今天
今天是:2024年10月21日(星期一)
2018年10月21日 | STM32学习之:RAM的分配和占用
2018-10-21 来源:eefocus
一个小的项目,在测试时间和产品量稍微大一些之后,出现了一些莫名其妙的非逻辑错误的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
就再没出现死机的情况。
史海拾趣
|
首先来说一个高级程序员并非靠自己读几本书写几万行代码就能练就的,我更关注于低层的环境,也就是程序员实实在在的工作环境。因为程序员的高低还得从实际的工作来衡量,而非其它。所以我想说的是,中国的软件公司的性质直接导致程序员的水平的高低 ...… 查看全部问答> |
|
看了jiao430发的《LM3S8962通过网页控制硬件运行》 我认为大多数人还不知道为什么会这样,jiao430为大家发了他的软件包, 其实在TI的软件基础上只需要改一句话而已。 就是把原来的动态IP改成静态,IP地址自己设置就好了, lwIPInit(pucMACArray ...… 查看全部问答> |
|
我最近做一个项目,首先要看懂wince 5.0 下的oak下usbfn文件夹里的程序,即USB的从驱动。 因为以前没搞过这方面的知识,所以看起来很吃力,那位仁兄高手能给一些这方面的讲解资料啊,英文的也可以。 或者有过这方面开发经验的给个学习思路,晚 ...… 查看全部问答> |
|
我用simulink做的扩频通信仿真,直扩和跳频的都做了。老师希望用TI的DSP板子(型号TMS320C6474)实现其中的一种。小弟之前从未接触过TI的板子,也没有相关的编程经验,希望哪位大哥可以回答以下几个问题,给一些启发:1,据说simulink可以直接生成D ...… 查看全部问答> |




