金牌会员
- 积分
- 1393
- 威望
- 690
- 贡献
- 439
- 兑换币
- 386
- 注册时间
- 2013-3-6
- 在线时间
- 132 小时
- 毕业学校
- 北京师范大学珠海分校
|
注:基于我用的K60,IAR6.5,讲点我知道的,问些我不懂的。红色字体为问题,望解答。
1.flash断电不丢失(ROM的一种,只读、不可写);ram断电丢失(可读写)。
2.代码运行方式:①存在flash中,并在flash中运行。(节省ram,速度慢)
②存在flash中,上电后拷贝到ram中运行。(消耗ram,速度快)
(注:将代码烧写至ram中的情况不讨论,这种方式主要用来调试代码用。)
3.ARM内存空间(ram)的使用分配:
(摘抄至http://blog.sina.com.cn/s/blog_7e741b830100qe3q.html及http://blog.csdn.net/xiaoweiboy/article/details/6889112)
不管选择什么代码运行方式,都存在将 '变量数据' 从flash中拷贝到ram中的步骤,原因很简单:flash(ROM)是只读的,而变量是需要改变的,在flash上无法实现更改变量的值;所有要拷贝至ram中。那ram是怎么被使用的呢?
在这里就涉及到了“ARM的空间属性”——“程序的空间属性”:程序其本质由代码(text段)和数据组成的,其中数据又细分为 已初始化数据段(data段)和 未初始化数据段(BBS段)。所以在使用ram的时候,ram会被分成两部分:一部分是代码段用于储存代码(如果选择的是在flash中运行,那么ram中就省下了这部分的ram空间),一部分是数据段用来存放变量(data段在前,BBS段在后)。而剩余下来的ram就用来作为 ‘堆’ 和 ‘栈’的空间。
'栈'stack:我们又常称为堆栈,这部分空间主要用来 函数跳转时对“现场信息的保护”。另外函数中定义的局部变量也是使用这片空间的,并不是使用数据段空间。栈的大小是预先设置好的,不可变的。
'堆'heap:这部分空间主要用来动态内存分配。即malloc(),new()等函数申请内存时都是从这里中分配出去的。有人说,设置堆的大小意义不大,设置大小只是为了通过编译而已,在使用的过程中,当堆不足时会自动拿空闲空间补充。这里我不是很理解:既然堆是拿来动态内存分配的,也就是说我们事先根本不知道需要多大,那又怎么说设置堆的大小只是为了通过编译呢?编译器怎么知道堆为多大时才算正确?还有heap的大小真的是可变的吗?有的人说IAR不同于其它的IDE软件,IAR的heap是固定不变的,但是我一直找不到在哪里可以设置到堆和栈的大小,百度上找到的由于IAR版本的不同,好像不通用...我的是IAR6.5的。懂的望 不吝赐教!先谢过..
综上所述,ram从低地址至高地址被分成:
①text段:存放代码,也有可能包含一些只读的常数变量,例如字符串常量等。
②data段:存放已初始化的全局变量 和 任何地方(函数内外)定义的 静态变量。
③BBS段:存放未初始化的 或 初始化为0 的全局变量。
④堆heap:存放动态分配的变量。
⑤栈stack:存放 现场信息 和 局部变量。
模糊的:#defined 的常量 存放在哪个段里?代码段 还是 data段?提供的两个链接内容不会太长,建议看下,有些地方我没说清楚的。
|
|