volatile作为一个关键字,用来修饰变量,在程序设计中,使用该关键字声明的变量或对象通常拥有和优化或多线程相关的特殊属性。
volatile作为指令关键字最主要的作用就是,确保被修饰的指令不会因为编译器的优化而省略,并且要求每次直接读值。简洁的来说,就是为了防止编译器对代码进行优化而设计的关键字。
是因为有些程序中的变量在编译的时候或许会因为一些外界的原因发生意想不到的改变,这样编译器就不会去假设这个变量的值了,也就是说,优化器在用到这个变量的时候必须每次都小心的重读取这个变量的值,而不是使用保存在寄存器里面的备份
先介绍一下几个用到volatile变量的例子
(1) 并行设备的硬件寄存器,如状态寄存器
(2)中断服务子程序中会访问到的非自动变量
(3)多线程应用中被几个任务共享的变量
嵌入式系统程序员会经常同硬件,中断,等打交道,所有的这些都要求使用volatile变量,因为如果你不懂得volatile变量,将会给你的工作带来毁灭性的打击哦。
再介绍几个经常会问到的问题,聪明的你,看看是否已经对volatile这个关键字充分的了解了
1 一个参数即可以是const还可以是volatile吗? 说说这是为什么。
是的,例如只读的状态寄存器。他是volatile,因为它可能被意想不到的改变。它是const是因为程序不应该去修改一个被const修饰的变量。
2 一个指针可以是volatile吗? 为什么。
是这样的,尽管你见到的很少,但是还是有的,比如当一个中断服务子程序修改一个指向一个buffer的指针时。
那么通常在哪些地方会用到volatile呢?
首先,多任务环境下各任务间共享的标志应加上volatile。
还有中断服务程序中修改的供其它程序检测的变量需要加上。
存储器映射的硬件寄存器常常也要加上volatile来修饰,因为每次对它的读写都可能有不同的意义哦
原文地址:http://blog.csdn.net/u011401496/article/details/41412003