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