先说结论,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一行是堆空间分配的开始(从0x20000160),到STACK一行(0x20000360)结束共0x200字节 (512B)的空间。Heap Stack_Mem一行(0x20000360)到栈顶地址__initial_sp(0x20000760)一共是0x400字节(1K)空间。他们的大小正是我在起始文件startup_stm32f10x_md.s文件里分配的大小。如下图:
嗯,是一致的。 按stm32的datasheet上说,其RAM是从0x20000000开始的。下面是datasheet截图:
而我的工程里堆区和栈区是从0x20000160开始的,那么0x20000160前面的空间部分被什么占用了呢。起始从第一个.map文件截图可以看出来,首先是被全局变量占用了一部分.data.bss等等占用
这部分大小正好跟我的工程所用全局变量大小是一直的,如下图编译工程的结果RW-data大小即是工程所用到的全局变量大小
|