[经验分享] 嵌入式C编程中volatile 的使用规则

[复制链接]
64|34
olivem55arlowe 发表于 2026-8-18 20:34 | 显示全部楼层
如果不加 volatile,编译器可能会认为“既然代码里没有修改它,它的值肯定没变”,从而将读取操作优化掉,导致程序陷入死循环。
saservice 发表于 2026-8-20 11:14 | 显示全部楼层
在ADC采样中,volatile 如何影响数据读取?
tifmill 发表于 2026-8-20 12:54 | 显示全部楼层
用于任务间同步(应使用原子操作或屏障)、频繁访问且无副作用时(防止过度优化)。
wangdezhi 发表于 2026-8-20 14:18 | 显示全部楼层
外设寄存器、ISR共享变量、内存映射IO必须用volatile
linfelix 发表于 2026-8-20 16:14 | 显示全部楼层
映射到非易失性存储、特殊IO空间的变量,必须用volatile修饰,保证读写操作直接作用于对应硬件地址。
pentruman 发表于 2026-8-20 17:46 | 显示全部楼层
volatile 访问强制走内存,相比寄存器读写明显增加 CPU 开销,高速循环大量使用会降低性能、增加功耗
robincotton 发表于 2026-8-20 21:58 | 显示全部楼层
MCU 外设寄存器的值由硬件逻辑改变,不是由你的 C 代码赋值改变的。
macpherson 发表于 2026-8-21 13:09 | 显示全部楼层
不要用 volatile 替代信号量 / 互斥锁解决 RTOS 多线程竞争
10299823 发表于 2026-8-21 13:43 | 显示全部楼层
如果要让指针指向的地址内容不被优化,需写成volatile uint8_t *p_reg;如果要让指针本身的地址值不被优化,需写成uint8_t * volatile p_ptr。
pl202 发表于 2026-8-21 14:42 | 显示全部楼层
外设的状态寄存器、控制寄存器必须用volatile修饰,防止编译器把连续的寄存器读写优化掉,导致硬件操作失效。
robertesth 发表于 2026-8-22 09:55 | 显示全部楼层
编译器在编译主循环时,可能会把该变量加载到 单片机 寄存器中,导致主循环***感知不到中断里的修改。
abotomson 发表于 2026-8-22 15:06 | 显示全部楼层
volatile仅保证变量单次读写不被优化,对i++这类非原子的组合操作,无法保证操作的完整性,仍需额外的原子操作保护。
claretttt 发表于 2026-8-22 16:41 | 显示全部楼层
volatile 只解决编译器优化问题,不解决硬件/系统层面的并发问题。
sanfuzi 发表于 2026-8-22 18:18 | 显示全部楼层
主循环与中断服务函数共同访问的全局变量,必须添加volatile修饰,避免编译器在主循环中把变量缓存到寄存器,无法感知中断中对变量的修改。
fengm 发表于 2026-8-22 20:18 | 显示全部楼层
**双重volatile**修饰指向易失内存的指针
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部
0