volatile.md 1.4 KB

volatile

判别规则(核心)

  • 变量可能被"程序控制之外的上下文"(中断 / 硬件 / 其他线程)修改 → 加 volatile
  • 否则 → 不加

抽象描述

告诉编译器:这个变量的值可能被程序控制之外的地方改变,读它时不要缓存优化、每次都真读。

易混对比

volatile const 关键区别
值可能外部改变 值不应被修改 volatile 禁缓存优化,const 允许优化
用于中断/硬件/多线程共享变量 用于只读数据 语义相反但可共存
const volatile 合法 只读硬件寄存器场景 既只读又可能被硬件改变

变体验证(3 题,全过=学会)

  1. 中断里置位、主循环读取的全局标志 → 。依据:中断是程序控制外上下文,编译器不知道它改
  2. const volatile uint32_t *reg = ... 合法吗? → 合法。依据:只读硬件寄存器(如状态寄存器)
  3. 纯软件状态机变量,全部修改都在同一函数 → 不要。依据:无外部上下文改写

口述要点

"volatile 告诉编译器别对这个变量做缓存优化,因为它可能被中断、硬件或别的线程修改。我项目里光敏传感器中断里更新的标志就加了 volatile,否则主循环可能读到缓存里的旧值。"

学习日期

2026-08-02