volatile的使用

volatile 的意思是易变的、不稳定的。也许很多人根本没有见过这个关键字,或是不知道它的存在,或许有很多人知道它存在,但是从来没有使用过。其实我在做嵌入式程序以前也是不知道有这个么一个关键字的。

volatile关键字和const一样是一种类型修饰符,用它修饰的变量表示可以被某些编译器未知的因素改变,如操作系统、硬件或其他线程等。编译器在遇到访问这个关键字声明的变量的代码时就不再进行优化了,从而可以提供对特殊地址的稳定访问。

曾经写过这么一段代码:

int mycounter;

int main(void)
{
  mycounter = 100;
  while(mycounter > 0) 
  { 
    //my code… …
  }
  //my code… …
  return 0;
}

在另外一个定时器中断处理程序里这么写

extern int mycounter;

void timer_iqr(void)
{
  if(mycounter > 0)
  {
    mycounter–;
  }
}

结果我的程序一直在while处死循环。为什么会出现这种情况呢?因为我先给mycounter 赋值为100,紧接着我就在做判断,此时编译器认为mycounter值没有发生改变,所以mycounter的值一直为真,其实mycounter的值在定时器中断里作了改变,只是编译器无法识别罢了,如果给int mycounter;前加上volatile就可解决这种问题,volatile关键字告诉编译器mycounter的值随时都会改变,所以每次使用它的时候都必须从内存中取出mycounter的值。这样看来对使用那些端口数据,寄存器变量时我们就要考虑一下是否需要添加volatile关键字了。

菊子曰 用菊子曰写博客,就是爽!

2 thoughts on “volatile的使用

  1. Pingback: volatile干嘛用 怎么用 | post space

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>