STM32八股【9】-----volatile关键字

一句话:

主要是为了防止编译器优化导致无法得到最新的值。主要用于以下三处:

1.在中断中修改访问的变量。

2.多任务(线程)共享的变量。

3.硬件寄存器变量

问题

嵌入式程序中常出现变量值改变但代码未正确响应的现象

原因

编译器优化策略导致异常行为:

  • 将频繁访问的变量缓存在寄存器中
  • 删除看似冗余的内存读取操作
  • 对循环中的变量进行推测性优化
c 复制代码
uint32_t* status_reg = 0x40021000;
while (*status_reg & 0x01) {  // 编译器可能只读取一次寄存器值
    // 等待状态位变化
}

编译器默认假设变量内容在单线程内不会自发改变

然而实际上:

  • 外部中断或其他线程可能改变状态位
  • 设备自动更新寄存器内容
  • 多核系统中其他处理器可能修改

解决办法

应用场景规范:

  • 内存映射硬件寄存器必须声明为volatile
  • 被多个执行流共享的全局变量(主程序/中断服务程序)声明为volatile
  • 信号处理程序修改的全局变量
相关推荐
林内克思17 分钟前
stm32Cubmax的配置
stm32·单片机·嵌入式硬件
互联科技报30 分钟前
重振索尼复古微型电脑——计划以OrangePi CM5 作为主板升级
单片机·嵌入式硬件·电脑
天天爱吃肉82183 小时前
从零到一:深度解析汽车标定技术体系与实战策略
python·嵌入式硬件·自动化·汽车
编程墨客15 小时前
STM32F103C8T6单片机内部执行原理及启动流程详解
stm32·单片机·嵌入式硬件
Wangshanjie_9816 小时前
【STM32】-SPI通讯
stm32
qq_4112624217 小时前
整体无需占用任何硬件 UART,即可新增一条全双工软串口
单片机·嵌入式硬件
XINVRY-FPGA19 小时前
XCZU47DR-2FFVG1517I Xilinx FPGA AMD ZynqUltraScale+ RFSoC
人工智能·嵌入式硬件·fpga开发·信息与通信·信号处理·射频工程·fpga
Cyrus_柯19 小时前
单片机基础(STM32-DAY2(GPIO))
单片机·嵌入式硬件
吃货界的硬件攻城狮20 小时前
【STM32 学习笔记】SPI通信协议
笔记·stm32·学习
努力的小帅20 小时前
STM32单片机_3
stm32·单片机·嵌入式硬件·学习·stm32c8t6