stm32局部变量和全局变量存储位置
时间: 2024-08-14 08:06:20 浏览: 107
STM32微控制器中的局部变量和全局变量在内存中的存储位置有所不同。
1. 局部变量(Local Variables):当你在函数内部声明的变量是局部变量。它们被存放在栈(stack)中。每当函数被调用时,会为其分配一块内存,函数结束时,这块内存就会自动释放。因此,局部变量的作用域仅限于所在的函数内。
2. 全局变量(Global Variables):这些变量在整个程序范围内可见,并通常定义在.c文件的开始部分或外部函数之外。全局变量被存储在数据段(data segment)或BSS (Block Started by Symbol)区域。数据段一般用于存放初始化过的全局变量,而未初始化的全局变量会被置零,并存储在BSS区。
总结一下:
相关问题
STM32F103局部变量,全局变量的区别以及各自申请空间的大小
在STM32F103嵌入式系统中,局部变量和全局变量的主要区别在于它们的作用范围、生命周期以及存储位置。
**局部变量**:
- **作用范围**:局部变量只在函数内部声明,当函数执行结束后,该变量会被自动销毁,其存储空间在栈上分配。
- **生命周期**:局部变量仅在其所在的函数范围内有效,一旦离开这个函数,变量就会消失。
- **空间大小**:栈空间的大小通常是有限的,所以局部变量一般占用较小的存储空间,取决于编译器设置的栈深度。
例如:
```c
void myFunction() {
uint8_t localVar; // 局部变量,占1字节
// ...其他操作...
}
```
栈空间大小取决于编译器配置,一般几KB到几十KB不等。
**全局变量**:
- **作用范围**:全局变量在整个程序文件中可见,无论在哪里调用都可以访问。
- **生命周期**:全局变量从程序开始直到结束都存在,除非显式地改变它的值或在特定条件下清零。
- **空间大小**:全局变量存储在数据段(Data Segment),相对于栈来说,其大小没有限制,但在一些资源紧张的应用中,过多大尺寸的全局变量可能会影响程序的效率。
例如:
```c
uint8_t globalVar; // 全局变量,占1字节
```
数据段的空间大小取决于实际的编译选项和链接器配置。
stm32单片机那些关键词可以保证变量存储在ram中
在STM32单片机中,如果你想确保一个变量存储在RAM(随机访问内存)而不是 Flash 存储器里,可以使用关键字 `__attribute__((section(".bss")))` 或 `__attribute__((section(".data")))`。这里有几个关键点:
1. **`.bss`**: 这用于未初始化的数据,如全局静态变量。当你声明这样的变量时,编译器会预留空间,但在程序运行前不会分配实际值。因此,它们默认位于RAM区域。
```c
extern uint32_t my_bss_variable __attribute__((section(".bss")));
```
2. **`.data`**: 这通常用于存放初始化过的数据,包括全局静态常量和局部静态变量。这些变量在程序开始时会被初始化。
```c
static uint32_t my_data_variable __attribute__((section(".data")));
```
请注意,虽然上述方法能确保变量起始位置在RAM,但实际的物理存储可能会因为内存布局优化而有所不同。如果你需要完全控制变量的具体位置,可能需要配合其他内存管理技巧或底层库。
阅读全文