volatile 英文意思“挥发,挥发物,易变的”。
意思是这个关键词修饰的变量是易变的,提示编译器不要优化它(优化从Cache中取数据),而从它原始的地方拿数据。
volatile关键词注意的地方主要是:
1、中断服务程序中修改过,而其它程序也需要用到的变量需要加volatile;
2、多任务环境下各任务间共享的变量应该加volatile,如信号量等;
3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能有不同意义;
另外,以上这几种情况经常还要同时考虑数据的完整性(相互关联的几个标志读了一半被打断了重写),在1中可以通过关中断来实现,2中可以禁止任务调度,3中则只能依靠硬件的良好设计了。
static volatile U32 trapValue1 = TRAP_VALUE_1;
static volatile U32 trapValue2 = TRAP_VALUE_2;
……
while (trapValue1 != TRAP_VALUE_1 || trapValue2 != TRAP_VALUE_2) {
sysPrintf("trapped!/n");
}
在一段程序中设置trap检查,……中的程序没有改动过着两个TRAP_VALUE_1和TRAP_VALUE_2,但是如果发生了陷入,则可能改动这两个值,可以用来检查是否程序运行正常。
1情况:
volatile int changableValue=1;
int main(){
(1)
int b=changeableValue*2;//(2)
}
在(1)处发生中断:
int_sr(){
changableValue=0;
}
如果不加volatile则b=1*2=2; 如果加了volatile则 b=0*2=0。
如果不加volatile但是想防止,就应该在(2)前面关中断,在(2)执行完后开中断。
-------------------------------------------------------------------------
2情况:
task A如下
volatile int shareSamp=1;
int main()
{
if(shareSamp)
print("1");
else
print("0");
}
task B 如下
extern volatile int shareSamp;
int main()
{
shareSamp=0;
}
如果taskB先执行,不加Volatile 则为1,;加了的话则为0。
----------------------------------------------