C中Volatile的用法
Volatile只是C里的一个关键字,为什么需要这个关键字?它有什么作用?一般的讲,只要把一个变量声明为Volatile,也就表示这个变量会出现意想不到的改变,这个时候编译器就不会去假设该变量的值,从而,优化器每次读入的时候都需要重新读取它的值。
Volatile一般用于以下的情况中:
1.并行设备的硬件寄存器中(状态寄存器)。
2.中断服务程序访问到的非自动变量(全局变量)。
3.多线程里的几个任务共享到的变量。
一般的变量,存储位置在内存中,或者存储在 处理器寄存器中。只要寄存器的内容没有被修改,程序中访问的时候就不再在内存里访问,直接在寄存器里读取。例如下面的例子:
Int temp,a,b;
Temp=(unsigned int *)0x0040;
A=*temp;
B=*temp;
在有的编译器里,这段代码很可能被优化成:
Int temp,a,b;
Temp=(unsigned int *)0x0040;
A=*temp;
B=a;
这样的话,第一次读操作后(a=*temp),*temp的内容有可能更新变化,b的值读的是新变化的值,可是被优化后的程序两次读的结果是一样的,这就是很大的隐患。要想消除这样的隐患,就需要把temp声明Volatile关键字。Temp=( Volatile unsigned int *)0x0040;
程序出现的异常操作是由于程序段的“非原子操作”,在运行中程序被外部中断,后续语句没有继续执行。在嵌入式中,硬件操作的一些寄存器属于收发功能的寄存器,这样为了避免发生错误,一般都要加上Volatile声明。
只要一个电话
我们免费为您回电