STM32微控制器中,不同类型的变量根据其生命周期和作用域存放在不同的内存区域。
1. 全局变量(Global Variables)
- 存放区域:
.data
段 或.bss
段 - 详细说明:
- 初始化的全局变量存放在**
.data
段**,即程序在启动时被初始化的数据段。这些变量在程序加载时由启动代码将初始值从Flash(ROM)复制到SRAM(RAM)。 - 未初始化的全局变量存放在**
.bss
段**。在程序启动时,这个段会被初始化为零。 - 全局变量的生命周期从程序启动到程序结束,作用域通常为整个程序。
- 初始化的全局变量存放在**
2. 静态变量(Static Variables)
- 存放区域:
.data
段 或.bss
段 - 详细说明:
- 和全局变量类似,初始化的静态变量存放在**
.data
段**,未初始化的静态变量存放在**.bss
段**。 - 静态变量的生命周期从定义开始直到程序结束,即它们在第一次初始化后保持其值。
- 静态局部变量(函数内部定义的静态变量)只在定义它们的函数或代码块中可见,但它们的值在多次函数调用之间保持不变。
- 和全局变量类似,初始化的静态变量存放在**
3. 局部变量(Local Variables)
- 存放区域:栈(Stack)
- 详细说明:
- 局部变量是函数内定义的变量,它们在函数调用时分配内存,并在函数返回时释放内存。
- 这些变量存放在栈中。栈的大小通常由程序的启动文件或操作系统决定,并且会根据函数调用的深度动态增长和缩小。
- 局部变量的生命周期仅限于函数执行期间,函数返回后这些变量的存储空间会被释放。
4. 动态分配的变量(Dynamic Variables)
- 存放区域:堆(Heap)
- 详细说明:
- 动态分配的变量使用C库函数如
malloc()
、calloc()
、realloc()
进行分配,并使用free()
函数释放。 - 这些变量存放在堆中,堆空间是从SRAM中分配的,大小由链接器配置文件(通常在启动文件中配置)或运行时配置。
- 动态分配的变量的生命周期由程序控制,可以在函数间共享,直到显式释放它们。
- 动态分配的变量使用C库函数如
5. 常量(Constants)
- 存放区域:Flash(ROM),
.rodata
段 - 详细说明:
- 常量(
const
修饰的变量或字符串常量等)通常存放在Flash的**.rodata
段**(只读数据段)。 - 常量数据在程序运行期间不会被修改,通常存储在非易失性存储器中以节省SRAM。
- 常量(
6. 中断向量表
- 存放区域:Flash(ROM),
ISR
向量表 - 详细说明:
- 中断向量表通常存储在Flash的固定地址中,系统启动后会被装载到相应的寄存器中。
- 在STM32中,中断向量表的位置通常在启动文件中配置,并且保存在Flash的某个固定区域。
7. 寄存器变量(Register Variables)
- 存放区域:CPU寄存器
- 详细说明:
- 寄存器变量由
register
关键字声明,提示编译器将这些变量尽可能存储在CPU寄存器中以提高访问速度。 - 这些变量不一定实际存储在寄存器中,具体取决于编译器的优化策略和寄存器的可用性。
- 寄存器变量由
内存布局总结
- Flash(ROM):
- 存储程序代码(
.text
段)、常量(.rodata
段)、中断向量表等。
- 存储程序代码(
- SRAM(RAM):
.data
段:存放已初始化的全局变量和静态变量。.bss
段:存放未初始化的全局变量和静态变量。- 栈(Stack):存放局部变量、函数参数、返回地址等。
- 堆(Heap):用于动态内存分配。