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

一句话:

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

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

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

3.硬件寄存器变量

问题

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

原因

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

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

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

然而实际上:

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

解决办法

应用场景规范:

  • 内存映射硬件寄存器必须声明为volatile
  • 被多个执行流共享的全局变量(主程序/中断服务程序)声明为volatile
  • 信号处理程序修改的全局变量
相关推荐
不脱发的程序猿2 小时前
在超频单片机时,需要注意哪些稳定性问题?
单片机·嵌入式硬件
sword devil9003 小时前
STM32项目实战:ADC采集
stm32·单片机·嵌入式硬件
-liming-3 小时前
单片机设计_停车场车位管理系统(AT89C52、LCD1602)
单片机·嵌入式硬件·51单片机
不脱发的程序猿3 小时前
单片机超频怎么搞?
单片机·嵌入式硬件·单片机超频
hahaha60164 小时前
uart16550详细说明
stm32·单片机·嵌入式硬件
深圳市青牛科技实业有限公司 小芋圆4 小时前
CS4334:一款高性能的立体声音频数模转换器
科技·嵌入式硬件·音视频·智能家居·新能源·工控主板
赵谨言5 小时前
基于单片机路灯自动控制仪仿真设计
经验分享·单片机·毕业设计
Joshua.X5 小时前
PWM讲解+STM32任意频率、占空比、脉宽生成函数介绍
stm32·单片机·嵌入式硬件·pwm·嵌入式开发·控制·嵌入式软件
YOYO--小天6 小时前
RK3588 ADB使用
linux·嵌入式硬件·adb