c语言中的volatile修饰符

volatile用于阻止编译器优化,确保每次读取都是从内存中获取最新值。适用于多线程中的全局变量和被ISR改变的全局变量。不使用volatile可能导致开启优化后代码不按预期运行。例如在手机触摸传感器驱动程序中,volatile确保读取到的触控坐标是最新的。
摘要由CSDN通过智能技术生成

Summarize 总结

  1. 声明为volatile的变量,阻止compiler的任何优化,因为变量会以compiler无法预测的方式改变。
  2. 每次都读取内存(主内存)中的值,而不是CPU的Register(寄存器、高速缓冲、工作内存),即使CPU运行的指令是对 同一variable操作

Literally 语义

  • volatile: 挥发物;易挥发的,反复无常的
    • in program context: 数值易于改变的变量

使用场景

那什么情景 变量以 compiler无法预测的形式改变呢?

  1. 多线程应用中的 全局变量。和上文一样,也是register中缓存导致。导致线程之间 数据不一致。
  2. 全局变量 被超出scope(范围、作用域)的ISR(Interrupt Service Routine 中断式服务程序)改变)。
    • 例如:全局变量是 data port(数据端口,通常是 memory mapped 的全局指针),且该data port可动态更新。 必须将data port声明为volatile,以便获读取data port的最新数据。 否则,编译器会 只读取一次数据,并存入register中,然后使用register中的数值 来加速程序(速度优化)。 但通常,ISR会在中断发生时改变数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值