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中分配的,大小由链接器配置文件(通常在启动文件中配置)或运行时配置。
动态分配的变量的生命周期由程序控制,可以在函数间共享,直到显式释放它们。
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):用于动态内存分配。
作者:小肖恩i