打印
[STM32F1]

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

[复制链接]
1096|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

  先说结论,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大小即是工程所用到的全局变量大小


使用特权

评论回复
沙发
gwsan| | 2021-2-4 20:56 | 只看该作者
感觉网上的说法都是一样的

使用特权

评论回复
板凳
kxsi| | 2021-2-4 20:56 | 只看该作者
地址好像不是重合的

使用特权

评论回复
地板
nawu| | 2021-2-4 20:58 | 只看该作者
实测的和手册上的不一样 是吗

使用特权

评论回复
5
qcliu| | 2021-2-4 21:00 | 只看该作者
不知道有没有官方手册进行说明

使用特权

评论回复
6
tfqi| | 2021-2-4 21:02 | 只看该作者
会不会是每个厂家的都不一样啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

35

帖子

0

粉丝