volatile变量声明的用处

  volatile对应的变量可能在你的程序本身不知道的情况下发生改变

 

  比如多线程的程序,共同访问的内存当中,多个程序都可以操纵这个变量

 

  你自己的程序,是无法判定何时这个变量会发生变化

 

  还比如,他和一个外部设备的某个状态对应,当外部设备发生操作的时候,通过驱动程序和中断事件,系统改变了这个变量的数值,而你的程序并不知道。

 

  对于volatile类型的变量,系统每次用到他的时候都是直接从对应的内存当中提取,而不会利用cache当中的原有数值,以适应它的未知何时会发生的变化,系统对这种变量的处理不会做优化——显然也是因为它的数值随时都可能变化的情况。

 

  --------------------------------------------------------------------------------

 

  典型的例子

 

  for ( int i=0; i<100000; i++);

 

  这个语句用来测试空循环的速度的

 

  但是编译器肯定要把它优化掉,根本就不执行

 

  如果你写成

 

  for ( volatile int i=0; i<100000; i++);

 

  它就会执行了

 

  volatile的本意是“易变的”

 

  由于访问寄存器的速度要快过RAM,所以编译器一般都会作减少存取外部RAM的优化。比如:

 

  static int i=0;

 

  int main(void)

 

  {

 

  ...

 

  while (1)

 

  {

 

  if (i) dosomething();

 

  }

 

  }

 

  /* Interrupt service routine. */

 

  void ISR_2(void)

 

  {

 

  i=1;

 

  }

 

  程序的本意是希望ISR_2中断产生时,在main当中调用dosomething函数,但是,由于编译器判断在main函数里面没有修改过i,因此

 

  可能只执行一次对从i到某寄存器的读操作,然后每次if判断都只使用这个寄存器里面的“i副本”,导致dosomething永远也不会被

 

  调用。如果将变量加上volatile修饰,则编译器保证对此变量的读写操作都不会被优化(肯定执行)。此例中i也应该如此说明。

posted on 2012-04-20 13:03  可见光  阅读(1553)  评论(0编辑  收藏  举报

导航