STM32启动时RAM空间堆(Heap)和栈(stack)的分配
来源:互联网 发布:硬盘数据彻底删除软件 编辑:程序博客网 时间:2024/05/29 03:04
转载请注明出处,谢谢。
先说结论,STM32再启动的时候RAM首先分配给使用到的全局变量,及调用库占用的一些数据(不太清楚是什么数据)
,然后再将剩余的空间分配给Heap和stack。
以下是网上关于Heap和Stack的说:
(1)栈区(stack):由编译器自动分配和释放,存放函数的参数值、局部变量的值等,其操作方式类似
于数据结构中的栈。
(2)堆区(heap):一般由程序员分配和释放,若程序员不释放,程序结束时可能由操作系统回收。分配
方式类似于数据结构中的链表。
(3)全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态
变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统自动释放。
(4)文字常量区:常量字符串就是存放在这里的。
(5)程序代码区:存放函数体的二进制代码。
一直有疑惑堆区(heap)和全局区是不是在一块呢,今天在研究STM32启动的时候发现STM32的RAM起始MSP和栈的地址时(stm32的栈是向下增长的,栈顶地址是ram分配的最大空间了),结论如上述,下面截图详细说明。
上图是.map文件里看到的Heap和Stack的地址(空间分配),由图看出HEAP一行是堆空间分配的开始(从0x20000188),到STACK一行(0x20003188)结束共0x3000字节 (12K)的空间。
Stack_Mem一行(0x20003188)到栈顶地址__initial_sp(0x20003588)一共是0x400字节(1K)空间。他们的大小正是我在起始文件startup_stm32f10x_md.s文件里分配的大小。如下图:
嗯,是一致的。
按stm32的datasheet上说,其RAM是从0x20000000开始的。下面是datasheet截图:
而我的工程里堆区和栈区是从0x20000188开始的,那么0x20000188前面的空间部分被什么占用了呢。起始从第一个.map文件截图可以看出来,首先是被全局变量占用了一部分0x58=88Byte。
这部分大小正好跟我的工程所用全局变量大小是一直的,如下图编译工程的结果RW-data大小即是工程所用到的全局变量大小
至于0x20000188-0x20000058=剩下的空间是什么,我猜测应该是库占用的。因为后缀是libspace(.bss),请看上图。
至此分析结束2016/12/20
以上个人分析仅作为个人的学习记录分析,各位谨慎参考。如有错误还请指出,Thanks ! (∩_∩)
图片呢?都吞掉了?这网站真是的。。。
- STM32启动时RAM空间堆(Heap)和栈(stack)的分配
- STM32堆(stack)和栈(heap)的理解
- STM32堆和栈(Heap & Stack)的资料理解
- STM32堆和栈(Heap & Stack)的资料理解
- STM32堆和栈(Heap & Stack)的资料理解
- STM32的堆栈(Heap&Stack)空间
- stm32 堆和栈(stm32 Heap & Stack)
- stm32 堆和栈(stm32 Heap & Stack)
- stm32 堆和栈(stm32 Heap & Stack)
- stm32堆和栈 (stm32 Stack & Heap )
- stm32 堆和栈(stm32 Heap & Stack)
- stm32 堆和栈(stm32 Heap & Stack)
- stm32 堆和栈(stm32 Heap & Stack)
- stm32 堆和栈(stm32 Heap & Stack)
- 堆空间独立(Heap),栈空间共享(stack)
- 程序的内存分配 栈区(stack) 堆区(heap
- stm32 堆和栈(stm32 Heap & Stack)【worldsing笔记】
- stm32 堆和栈(stm32 Heap & Stack)【worldsing笔记】
- Loadrunner性能指标分析
- java中 若有多个判断条件 switch比if效率更高
- Android开发框架
- Extjs----comboBox使用
- iReport文字自动换行设置
- STM32启动时RAM空间堆(Heap)和栈(stack)的分配
- javascript经典实例
- wxwidgets 获取系统信息
- 程序的时间和空间复杂度
- Struts2+Spring4+Hibernate4整合系列--(四)StepByStep3
- NIT
- 程序员面试金典: 9.1数组与字符串 7若M*N矩阵中某个元素为0,则将其所在行与列清零
- 基于UIWebView的混合编程
- 测试微信支付接口的恶心事情