C语言 volatile

一、 定义    

        volatile用于声明一个变量,告诉编译器该变量值容易发生改变,在编译、读取、存储该变量的时候都不要做任何优化,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取存储数据,不做优化,在做嵌入式开发的时候,因为有时变量地址有可能是系统的一个外设地址,他的值的变化并不在程序控制范围内,随时有可能变化,因此需要对他进行声明,每次读取或者存储直接对地址进行操作

        变量如果加了 volatile 修饰,则会从内存重新装载内容,而不是直接从寄存器拷贝内容

        volatile 的作用 是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。

二、 使用volatile 的情况

        

1、并行设备的寄存器(例如状态寄存器)

        存储器映射的硬件寄存器通常加volatile。

        设备寄存器会在你的程序不知道或者不介入的时候发生改变,那是因为设备寄存器可以被外设硬件修改,相反,变量中的不会变。设备寄存器的内容是易失的,或者在不注意的时候被修改,当声明指向设备寄存器的指针时一定要用volatile,它会告诉编译器不要对存储在这个地址的数据进行假设,编译器在优化这个变量时应该把它看作编译时未知的。
 

2、一个中断服务子程序中会访问到的非自动变量


3、多线程应用中被几个任务共享的变量

volatile 常见问题


1、一个参数可以是const还可以是volatile吗?

可以。比如只读的状态寄存器。它是volatile因为它可能被意想不到的改变,它是const因为 程序不应该试图去修改它。

2、一个指针可以是volatile吗?

可以。当一个服务中子程序修改一个指向buffer的指针时

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值