volatile关键字是一种类型的修饰符,用它声明变量表示可以被某些编译器更改,volatile变量影响编译器的输出结果。
一般来说,volatile用在如下的几个地方:
1 、中断服务程序中修改的供其它程序检测的变量需要加volatile;
2、多任务环境下各种任务间共享的标志应该加volatile
3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都有可能是不同的意义;
volatile关键字声明的变量,编译器(compiler)对访问该变量的代码就不再不做任何的优化,从而达到对特殊地址的稳定访问。
例如:
void main(void){
volatile int i ;
int j;
i = 1;(不被优化)
i = 2;(不被优化)
j = 1;(被优化)
j = 2;
}
优化的结果如下:
void main(void){
volatile int i ;
int j;
i = 1;
i = 2;
j = 2;
}
有结果可知,j = 1 指令丢失,如果是使用volatile则compiler就不会做任何的优化,从而保证程序的原意。
使用volatile定义的变量在程序外被改变,每次都要从内存中读取.
例如:
volatile int a;
a= 0;
while(!a){
..........
}
do_something();
如果没有volatile的时候,当while函数里a的值被改变时,do_something函数也不会执行,因为a的值没有从内存中读取,所以a的值没有改变,一直是0。当有volatile的时候,当while函数里a的值被改变时,使用时都要从a的内存地址中读取,从而跳出while循环体,执行do_something函数。