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

一句话:

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

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

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

3.硬件寄存器变量

问题

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

原因

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

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

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

然而实际上:

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

解决办法

应用场景规范:

  • 内存映射硬件寄存器必须声明为volatile
  • 被多个执行流共享的全局变量(主程序/中断服务程序)声明为volatile
  • 信号处理程序修改的全局变量
相关推荐
优信电子30 分钟前
基于STM32F103驱动AS5600读取磁体旋转的模拟量/角度数据
stm32·单片机·嵌入式硬件·as5600·磁编码器·磁角度传感器
homelook33 分钟前
【mqtt参数上云和小程序开发】【第5期】hcsr04超声波测距模块调试完成
嵌入式硬件
点灯小铭39 分钟前
基于单片机的PWM三基色LED灯控制器设计与无线调色系统
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
Vae_Mars9 小时前
单片机中的TVS管
单片机·嵌入式硬件
hazy1k11 小时前
51单片机基础-直流电机控制
stm32·单片机·嵌入式硬件·51单片机
小莞尔13 小时前
【51单片机】【protues仿真】基于51单片机智能窗帘系统
c语言·stm32·单片机·嵌入式硬件·物联网·51单片机
我先去打把游戏先15 小时前
ESP32学习笔记(基于IDF):IOT应用——WIFI连接
笔记·单片机·嵌入式硬件·mcu·物联网·学习·esp32
清风66666617 小时前
基于单片机的简易智能衣架控制系统设计
单片机·嵌入式硬件·毕业设计·课程设计
酷飞飞18 小时前
I2C软实现基于GD32F407VE的天空星的配置
单片机·嵌入式硬件
充哥单片机设计18 小时前
【STM32项目开源】基于STM32的人体健康监测系统
stm32·单片机·嵌入式硬件