STM32启动时RAM空间堆(Heap)和栈(stack)的分配

转载请注明出处,谢谢。

  先说结论,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 ! (∩_∩)

图片呢?都吞掉了?这网站真是的。。。

阅读更多
换一批

没有更多推荐了,返回首页