|
@@ -0,0 +1,32 @@
|
|
|
|
|
+# volatile
|
|
|
|
|
+
|
|
|
|
|
+## 判别规则(核心)
|
|
|
|
|
+
|
|
|
|
|
+- 变量可能被"程序控制之外的上下文"(中断 / 硬件 / 其他线程)修改 → 加 `volatile`
|
|
|
|
|
+- 否则 → 不加
|
|
|
|
|
+
|
|
|
|
|
+## 抽象描述
|
|
|
|
|
+
|
|
|
|
|
+告诉编译器:这个变量的值可能被程序控制之外的地方改变,读它时不要缓存优化、每次都真读。
|
|
|
|
|
+
|
|
|
|
|
+## 易混对比
|
|
|
|
|
+
|
|
|
|
|
+| volatile | const | 关键区别 |
|
|
|
|
|
+|----------|-------|---------|
|
|
|
|
|
+| 值可能外部改变 | 值不应被修改 | volatile 禁缓存优化,const 允许优化 |
|
|
|
|
|
+| 用于中断/硬件/多线程共享变量 | 用于只读数据 | 语义相反但可共存 |
|
|
|
|
|
+| `const volatile` 合法 | 只读硬件寄存器场景 | 既只读又可能被硬件改变 |
|
|
|
|
|
+
|
|
|
|
|
+## 变体验证(3 题,全过=学会)
|
|
|
|
|
+
|
|
|
|
|
+1. 中断里置位、主循环读取的全局标志 → **要**。依据:中断是程序控制外上下文,编译器不知道它改
|
|
|
|
|
+2. `const volatile uint32_t *reg = ...` 合法吗? → **合法**。依据:只读硬件寄存器(如状态寄存器)
|
|
|
|
|
+3. 纯软件状态机变量,全部修改都在同一函数 → **不要**。依据:无外部上下文改写
|
|
|
|
|
+
|
|
|
|
|
+## 口述要点
|
|
|
|
|
+
|
|
|
|
|
+"volatile 告诉编译器别对这个变量做缓存优化,因为它可能被中断、硬件或别的线程修改。我项目里光敏传感器中断里更新的标志就加了 volatile,否则主循环可能读到缓存里的旧值。"
|
|
|
|
|
+
|
|
|
|
|
+## 学习日期
|
|
|
|
|
+
|
|
|
|
|
+2026-08-02
|