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

一句话:

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

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

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

3.硬件寄存器变量

问题

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

原因

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

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

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

然而实际上:

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

解决办法

应用场景规范:

  • 内存映射硬件寄存器必须声明为volatile
  • 被多个执行流共享的全局变量(主程序/中断服务程序)声明为volatile
  • 信号处理程序修改的全局变量
相关推荐
嵌入式老牛2 小时前
HC32F460_ADC驱动(三)
单片机·嵌入式硬件
秀秀更健康3 小时前
stm32: 系统时钟如何配置为72Mhz
stm32·单片机·嵌入式硬件
QAQ小菜鸟6 小时前
一、安装Altium Designer 26.1
嵌入式硬件
嵌入式-老费7 小时前
esp32开发与应用(用面包板去学模块)
嵌入式硬件
归零鸟8 小时前
WD Elements移动硬盘能识别出盘但不能出盘的修复记录
stm32·单片机·嵌入式硬件
追兮兮9 小时前
MCUQuickStart v1.1.0发布,一键生成Keil工程+RTOS模板
stm32·单片机·嵌入式硬件·freertos·gd32·keil5
国科安芯9 小时前
ASP7A84AS与主流架构兼容替代及系统级电源完整性解决方案的深度研究
单片机·嵌入式硬件·架构
kaikaile19959 小时前
STC8单片机实现简单花样DMX512控制器
单片机·嵌入式硬件
szxinmai主板定制专家9 小时前
RK3568 + CODESYS+实时系统运动控制器PLC,支持 AI 视觉目标检测,预测性维护,混合多系统部署,多路模拟量采集
arm开发·人工智能·嵌入式硬件·fpga开发
rit84324999 小时前
STM32移植NES模拟器指南
stm32·单片机·嵌入式硬件