本文为转载总结文章:点击进入原地址
用volatile修饰变量的时候,意指系统总是重新从它所在的内存读取数据。遇到这个关键字声明的变 量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。
举一个容易理解的例子:
volatile int i=10;
int j = i;
...
int k = i;
由于编译器发现两次从i读数据的代码之间的代码没有对i进行过操作,它会自动把上次读的数据放在k中。而不是重新从i里面读。
再比如下面这个例子:
static int i=0;
int main(void)
{
...
while (1)
{
if (i)
SOME_THING();
}
}
/* 中断服务函数 */
void ISR_2(void)
{
i=1;
}
程序的本意是希望ISR_2中断产生时,在main函数中调用SOME_THING函数,但是,由于编译器判断在main函数里面没有修改过i,因此可能只执行一次对从i到某寄存器的读操作,然后每次if判断都只使用这个寄存器里面的“i副本”,导致SOME_THING永远也不会被调用。如果将变量加上volatile修饰,则编译器保证对此变量的读写操作都不会被优化(肯定执行)。此例中i也应该如此说明。
上面在中断中发生的这个例子,我遇到过。因为当时我的代码,不是很稳定,不排除跟这个原因有关。