关于STM32内存,堆栈等问题恳请原子哥和各位大牛指导~~~

2019-07-20 19:35发布

本帖最后由 liuchang 于 2016-6-2 15:42 编辑

小弟昨晚拜读了原子哥的帖子,感觉很有收获,但是也带来了新的疑惑,恳请指教~~~
http://www.openedv.com/forum.php ... digest%26digest%3D1

问题1:这里的RW-data和ZI-data指的是"堆"+"栈"的总内存了吗?也就是整个RAM吗?
可是我看网上有人说:RW-data和ZI-data分别指已经初始化和未初始化的全局变量.
难道RAM只是包含全局变量?局部变量,函数调用栈消耗,动态内存分配消耗的堆内存都忽略了???


问题2:如果MSP=0x20000758,Stack_Size EQU 0x00000400,那么栈的活动空间大小就是0x20000758~0x20000358吗(向下增长)?
                                        Heap_Size EQU 0x00000200,那么堆的活动空间大小就是0x20000000~0x20000200吗(向上增长)?   可以这样理解吗?


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
zmingwang
1楼-- · 2019-07-20 21:23
1.默认情况下,堆和栈都是ZI-data.
  ZI-data就是初始化为0的数据,也就是你定义的全局变量和静态变量,没有赋初始值,或者初始值为0的那些,比如 int a; static int b;
  RW-data就是非0初始化的数据,也是全局变量和静态变量,但是初始化值不为0,比如int c=5; static int d = 10;等等,RW数据的初始化值是右存放在ROM里的.
  动态变量消耗的是堆空间,堆空间是提前分配好的ZI-data,局部变量消耗的是栈空间,也是提前分配好的ZI-data.就是已经定义好了的两个数组,uint8_t heap[512];和uint8_t stack[1024];
2.栈是向下增长的,这可以通过PUSH指令看出来,MSP或PSP中的值是当前栈顶,如果有压栈动作,MSP或PSP会减小.
  堆就不存在向上向下增长的说法了,因为堆的数据结构是链表,堆是在__main中调用的C库函数初始化的,由malloc和free维护链表.注意堆链表结构是在堆空间里的,所以,应用程序不可能分配到整个堆大小的空间,比如堆定义时分配了512字节,应用程序最多可能只能分配到480字节.
最后给你看下一个应用程序只有堆栈占用内存的情况. QQ截图20160603005936.png
liuchang
2楼-- · 2019-07-21 03:14
 精彩回答 2  元偷偷看……
huojugege
3楼-- · 2019-07-21 04:16
 精彩回答 2  元偷偷看……
不吃鱼的老鼠
4楼-- · 2019-07-21 06:22
顶,学习!

一周热门 更多>