STM32嵌入式的内存管理
- 堆区:由于程序员自主分配的内存空间
- 生命周期:整个程序的运行阶段(直到主动释放)
- 作用域:取决于变量的位置,变量如果在局部的时候需要将数据的地址传递出来
- Notice:堆区是由低地址往上增长的,连续的。
- 栈区:由程序自动为变量所分配的内存空间
- 声明周期:函数结束即自动消亡
- 作用域:所处的函数段
- 特点:LIFO,可用于保存和恢复现场,例如当一个中断发生时候,先将当前PC指针所指向的内存地址压栈(保护现场),再跳转到中断程序中执行中断函数,中断结束后出栈,根据出栈后的地址返回原现场。
- Notice: 栈是由往下减少,连续的。
以上的内容都是在程序运行过程中,根据程序中的代码进行的动态内存分配,即都存储在SRAM中(断电消失)
code/text(代码段):用于存储烧录进来的代码。 这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读(某些架构也允许代码段为可写,即允许修改程序)。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。
- Bss段( Block Started by Symbol )
存放未初始化或初始化为0的全局变量,其中未初始化的全局变量会在开始运行时系统自动将其初始化为0。即此段存放的都是值为0的全局变量,即此段只是记录变量所需要的内存大小。在汇编中体现为一个占位符,有系统来进行初始化,其数据内容并不包含在生成的可执行文件中。 - data段(数据段)
存放初始化不为0的全局变量。由程序在编译阶段为其初始化,并将其数据存储在可执行文件中。
接下来是MDK中下Code、Ro-data、Rw-data、ZI-data这几个段的划分
- code:存储程序代码
- RO-data:存储const常量和汇编指令
- RW-data:存储初始化值不为0的全局变量
- ZI-data:存储初始化为0或未初始化的全局变量 (即BSS段中的内容,由系统为其初始化为0)
- Flash=Code+RO-data-RW-data
- SRAM=RW-data+ZI-data
这些内容是MDK在编译后能得到的每个段的大带下,也就是能够得到在占用在相应的FLASH和SRAM的大小,但是堆和栈这两个数据段在程序运行阶段也会占用SRAM的大小(动态内存分配),具体堆栈的大小在只有在运行之后才能知道。
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Comment