C语言中volatile关键字的作用

本文为转载总结文章:点击进入原地址

用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也应该如此说明。

上面在中断中发生的这个例子,我遇到过。因为当时我的代码,不是很稳定,不排除跟这个原因有关。

猜你喜欢

转载自blog.csdn.net/qq_26039331/article/details/76649785