stm32全局变量怎么存储再flash里面而不是rom里面
时间: 2024-09-09 19:14:23 浏览: 33
在STM32微控制器上,全局变量默认存储在闪存(Flash)里,除非它们被声明为`__attribute__((section(".rodata")))` 或者 `__attribute__((section(".data")))` 类型的常量数据(`.rodata`用于只读数据,`.data`用于可更改数据)。如果你想将全局变量放在ROM(非易失性只读内存)中,你需要使用`__attribute__((section(".text.init")))`将它们标记为初始化区,以便在程序启动时一次性加载到RAM中,然后不再修改。
以下是示例:
```c
extern const uint32_t myGlobalVar __attribute__((section(".rodata"))); // 存储在.rodata区
extern uint32_t myWritableVar __attribute__((section(".data"))); // 存储在.data区
// 如果你想将其放到ROM中,并在程序启动时初始化
static uint32_t myRomVar __attribute__((section(".text.init"))); // 存储在.text.init区
```
要确保这样做不会影响其他依赖于该变量的功能,你需要确保程序的其他部分能够正确处理这部分变量不在RAM的情况。
相关问题
stm32局部变量和全局变量存储位置
STM32微控制器中的局部变量和全局变量在内存中的存储位置有所不同。
1. 局部变量(Local Variables):当你在函数内部声明的变量是局部变量。它们被存放在栈(stack)中。每当函数被调用时,会为其分配一块内存,函数结束时,这块内存就会自动释放。因此,局部变量的作用域仅限于所在的函数内。
2. 全局变量(Global Variables):这些变量在整个程序范围内可见,并通常定义在.c文件的开始部分或外部函数之外。全局变量被存储在数据段(data segment)或BSS (Block Started by Symbol)区域。数据段一般用于存放初始化过的全局变量,而未初始化的全局变量会被置零,并存储在BSS区。
总结一下:
stm32全局变量中断
全局变量在中断中的使用需要注意一些问题。首先,中断中使用的全局变量在其他函数内使用时,需要进入临界区(关闭中断)。这是因为中断可能会在任何时候发生,如果在中断处理过程中访问全局变量,而其他函数也在同时访问该全局变量,就会导致数据不一致的问题。所以,在其他函数内使用全局变量时,需要先进入临界区,确保中断不会干扰到全局变量的访问。\[1\]
其次,全局变量的大小只会影响到占用SRAM的大小,而不会影响目标代码的大小。目标代码的大小与程序中所申请的全局变量大小无关,只与代码段和只读数据段有关。目标代码会包含全局变量的分配空间的信息,比如起始地址、空间大小、是否要用0初始化等信息,但不会包含实际的存储空间。全局变量的分配是在程序复位中断执行后,进入main函数之前进行的,由开发环境提供的C运行时库提供的代码来完成。\[2\]
在使用全局变量时,需要注意不同文件之间的变量声明和定义。如果在main.c文件中声明了一个全局变量,比如u8 biaozhi=0,然后在stm32f10x_it.c文件中再次声明了一个同名的全局变量,volatile u8 biaozhi,这样两个文件就可以共享同一个变量biaozhi。但是需要注意的是,这种共享全局变量的方式可能会导致数据不一致的问题,因为中断和主循环可能会同时访问该全局变量。所以,在使用共享全局变量时,需要谨慎处理数据同步的问题,确保数据的一致性。\[3\]
#### 引用[.reference_title]
- *1* [STM32中,关于中断函数调用全局变量的问题](https://blog.csdn.net/leo_liu006/article/details/79334905)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item]
- *2* [STM32全局变量占用程序存储空间吗](https://blog.csdn.net/weixin_35896299/article/details/117096817)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item]
- *3* [stm32中断函数改变全局变量值](https://blog.csdn.net/wds2435629591/article/details/56481854)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item]
[ .reference_list ]