|
|
前往: |
| Keil编程环境下STM32内存管理研究[转载] |
| 发表人 | 内容 | |
|---|---|---|
| 2011/01/04 20:58 |
|
|
|
[楼主位] flywin
等级:
注册时间:![]() 2010/12/16 23:47 文章: 41 离线 |
看似简单的问题,其实还是很有学问的,有时莫名其妙的很棘手的问题,就是在似懂非懂中埋下的祸根…… 特推荐下文。 非常简单的一个工程,没有用到任何IO操作,与STM32有关的仅仅只有芯片的选择,即其SRAM大小有区别。图1是工程示意图,从图中可以看出,除了自己编写的代码外,仅仅增加了2个文件,即system_stm32f10x.c和startup_stm32f10x_hd.s,其中为了对startup_stm32f10x_hd.s进行修改,将其从库文件夹复制到了项目文件夹中。 ![]()
代码1 int main() { int a,b,c,d; a=10;b=20; c=a+b; for(;;); } myex1.c(3): warning: #550-D: variable "c" was set but never used linking... Program Size: Code=796 RO-data=336 RW-data=20 ZI-data=1636 FromELF: creating hex file... "myex1.axf" - 0 Error(s), 1 Warning(s). 代码2int main() { const int x=16; int a,b,c,d; a=10;b=20; c=a+b; for(;;); } myex1.c(2): warning: #177-D: variable "x" was declared but never referenced myex1.c(3): warning: #550-D: variable "c" was set but never used linking... Program Size: Code=800 RO-data=336 RW-data=20 ZI-data=1636 FromELF: creating hex file... "myex1.axf" - 0 Error(s), 2 Warning(s). 说明: (1)Code增加了4字节 (2)其余没有任何变化 代码3int main() { const int x=16; int myArry[100]; int i; int a,b,c,d; a=10;b=20; c=a+b; for(i=0;i<100;i++) myArry[i]=i; for(;;); }
myex1.c(2): warning: #177-D: variable "x" was declared but never referenced myex1.c(3): warning: #550-D: variable "myArry" was set but never used myex1.c(5): warning: #550-D: variable "c" was set but never used myex1.c(5): warning: #177-D: variable "d" was declared but never referenced linking... Program Size: Code=816 RO-data=336 RW-data=20 ZI-data=1636 FromELF: creating hex file... "myex1.axf" - 0 Error(s), 4 Warning(s). 分析:程序中增加了数组myArry,Code增加为816字节,但是RO-data等仍未变化 代码4int main() { const int x=16; int myArry[100]={1,2,3,4,5,6}; int i; int a,b,c,d; a=10;b=20; c=a+b; for(i=0;i<100;i++) myArry[i]=i; for(;;); } myex1.c(2): warning: #177-D: variable "x" was declared but never referenced myex1.c(3): warning: #550-D: variable "myArry" was set but never used myex1.c(5): warning: #550-D: variable "c" was set but never used myex1.c(5): warning: #177-D: variable "d" was declared but never referenced linking... Program Size: Code=1024 RO-data=360 RW-data=20 ZI-data=1636 FromELF: creating hex file... "myex1.axf" - 0 Error(s), 4 Warning(s). 分析: (1)由于myArry作了初始化,因此RO-data增加了 360-336=24字节。原因是32位机中int型变量是32位的,占4字节,所以初始6个值后,增加了24字节。 (2)再增加初始化变量的数量,则RO-data随之增加,而Code不再变化,也就是Code由代码3的816字节增加到1024字节,是增加了初始化处理的代码量。 根据以上分析,似乎与已知资料有冲突。 *************************************************** RO是程序中的指令和常量 **************************************************** 如果按此说明,增加变量应该增加RO,但从代码1到代码2的变化来看,仅是增加了Code,却没有增加RO。 初始化变量时,应该增加RW,但是从代码2~代码4,RW却没有任何变化。 看来这个说法只能适用于ARM芯片,即运行时需要将代码调入RAM运行的芯片,对于STM32这类芯片并不完全适用。 以下再作研究: 当使用 int myArray[300]时: ![]()
当使得int myArray[100]时: ![]()
应该是向下生成的?? 而且与芯片无关,无论选择6K RAM还是48K RAM都是如此,且当数组再大时,就会将地址置于小于0x2000000的地址,但编译并不报错。 当使得int myArray[450]时: ![]()
当然,执行是错误的。 当int myArray[409]时:正指向0x2000000 去掉其他变量,对于这个地址没有影响! 代码5int myArray[400]={1,2,3,4,5,6,7,8,9,10,11,12,13,14}; int main() { const int x=16; int a,b,c,d; int i; a=10;b=20; c=a+b; for(i=0;i<100;i++) myArray[i]=i; for(i=0;i<100;i++) c+=myArray[i]; d+=x; for(;;); } 编译结果: compiling myex1.c... linking... Program Size: Code=876 RO-data=336 RW-data=1620 ZI-data=1636 FromELF: creating hex file... "myex1.axf" - 0 Error(s), 0 Warning(s). 分析: 本段程序将数组作为全局变量来定义,情况立即发生了变化。RW-data变成了1620。其中的1600应该是这个数组增加的4*400=1600,而20则是代码1~代码4中一直都有的。 经查验资料,局部变量是放在栈中的,如果栈定义得较小,那么变量数就很少。因此当数组在main内部定义时,是作为局部变量从栈中分配内存给它。所以在代码1~代码4的实验中还发现,即便更改芯片,从6KB RAM的C4到48KB RAM的VC,编译的结果不发生变化,其原因就在于不论哪种芯片,给它分配的栈是固定的。栈的大小应该在启动代码中修改。 ![]()
更改这个:startup_stm32f10x_hd.s可以更改栈的大小。 改成500后的编译结果如下: linking... Program Size: Code=1048 RO-data=392 RW-data=20 ZI-data=1892 FromELF: creating hex file... "myex1.axf" - 0 Error(s), 0 Warning(s). 说明:注意到ZI-ddata已发生了变化。 至此可以明白RO-data ZI-data应该是针对栈来说的。即栈中的只读数据和零数据??但是RW-data似乎又有所不同,这里还应该再次探究。 |
|
|
为STM32的精彩而激动! |
||
|
||
| 2011/01/04 21:50 |
|
|
|
[1楼] 正点原子
等级:
注册时间:![]() 2010/12/02 10:41 文章: 8089 来自: 湖南 在线 |
经典。
|
|
|
我的淘宝小店:http://shop62103354.taobao.com |
||
|
||
| 2011/01/05 11:24 |
|
|
[2楼] 张洋
等级:
注册时间:![]() 2010/12/14 10:47 文章: 337 来自: 广州 离线 |
这个对于初学者极为有意义;
经典! |
|
|
希望openedv能给大家提供一个友好的技术交流平台! |
||
|
||
| 2011/01/08 20:25 |
|
|
|
[3楼] 小虾
等级:
注册时间:![]() 2011/01/08 20:21 文章: 2 离线 |
好 牛人
|
|
|
||
| 2011/01/19 20:55 |
|
|
|
[4楼] pluto55
等级:
注册时间:![]() 2011/01/19 20:33 文章: 2 离线 |
学习了,谢谢楼主
|
|
|
||
| 2011/11/12 15:28 |
|
|
|
[5楼] Admin
等级:
注册时间:![]() 2010/12/14 00:44 文章: 59 来自: 广州 离线 |
这个对初学者相当有用!!!!!
|
|
|
||
| 2011/11/14 19:23 |
|
|
|
[6楼] Tardis
等级:
注册时间:![]() 2011/07/17 14:35 文章: 621 离线 |
mark!!!
好帖~~~ |
|
|
Time And Relative Dimension In Space. |
||
|
||
| 2011/11/14 22:23 |
|
|
|
[7楼] 提刀上马
等级:
注册时间:![]() 2011/08/02 16:15 文章: 91 离线 |
哦呜
|
|
|
||
| 2012/02/15 16:29 |
|
|
|
[8楼] jonathan
等级:
注册时间:![]() 2012/02/15 16:13 文章: 6 来自: 北京 离线 |
好好,我就遇到过局部变量异常的问题,看了楼主的分析,终于明白了,原来是栈的大小限制了局部变量啊....
|
|
|
||
| 2012/02/15 21:49 |
|
|
|
[9楼] trochili
等级:
注册时间:![]() 2011/02/11 20:24 文章: 142 离线 |
这些确实很细节了
这篇文章被编辑了 1 次. 最近一次更新是在 2012/02/15 21:49 |
|
|
||
| 2012/02/16 21:03 |
|
|
|
[10楼] 纯风/ST
等级:
注册时间:![]() 2012/02/16 20:28 文章: 18 来自: 湖北 离线 |
回复【1楼】 正点原子 :
-------------------------------张洋 正点原子 不是同一个人嘛? |
|
|
自学成才 |
||
|
||
| 2012/02/17 13:40 |
|
|
|
[11楼] lhy111lhy
等级:
注册时间:![]() 2012/02/16 09:51 文章: 6 离线 |
受益匪浅……
|
|
|
||
| 2012/02/17 15:01 |
|
|
|
[12楼] 正点原子
等级:
注册时间:![]() 2010/12/02 10:41 文章: 8089 来自: 湖南 在线 |
回复【10楼】 纯风/ST :
--------------------------------- 不是 |
|
|
我的淘宝小店:http://shop62103354.taobao.com |
||
|
||
| 2012/02/19 12:24 |
|
|
|
[13楼] 提刀上马
等级:
注册时间:![]() 2011/08/02 16:15 文章: 91 离线 |
回复【1楼】 正点原子 :
--------------------------------- Program Size: Code=1048 RO-data=392 RW-data=20 ZI-data=1892 个人理解的是:Code+RO-data是放到flash里面的,而 RW-data+ZI-data 是放到SRAM中的 请问原子哥我理解的对吗 ?????~~~ 一直对那个ZI-data (未初始化的)不知道是放在哪里的~~ |
|
|
||
| 2012/02/19 16:31 |
|
|
|
[14楼] 正点原子
等级:
注册时间:![]() 2010/12/02 10:41 文章: 8089 来自: 湖南 在线 |
论坛有帖子讨论的.你看看.
|
|
|
我的淘宝小店:http://shop62103354.taobao.com |
||
|
||
| 2012/03/18 21:03 |
|
|
|
[15楼] linziying
等级:
注册时间:![]() 2012/01/26 20:12 文章: 15 来自: 广州 离线 |
在实验室一直以为撞鬼的问题,找不出原因,看了这篇文章,估计找到了!
|
|
|
||
| 2012/03/18 21:11 |
|
|
|
[16楼] lixupeng
等级:
注册时间:![]() 2011/04/07 18:53 文章: 100 来自: 河北 离线 |
好mark
|
|
|
||
| 2012/03/19 12:42 |
|
|
|
[17楼] Pony279
等级:
注册时间:![]() 2012/02/08 19:13 文章: 438 离线 |
学习了
|
|
|
决定从此潜心搞好功课,闲时玩玩板子,逛逛论坛... |
||
|
||
| 2012/03/20 13:40 |
|
|
|
[18楼] walkboy
等级:
注册时间:![]() 2011/10/24 21:47 文章: 9 来自: 北京 离线 |
收藏了!!
|
|
|
love it, do it! |
||
|
||
| 2012/04/18 21:17 |
|
|
|
[19楼] 葱花鱼
等级:
注册时间:![]() 2011/09/06 18:35 文章: 96 离线 |
谢谢分享!
|
|
|
事无巨细 循序渐进 |
||
|
||
|
|
||
|
| 前往: |