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 Comments:

  1. hehe,解释的不清哦。编译器怎么会知道程序的运行呢?volatile 的功能应该是使cache失效,把内存数据重新读到cache 中。具体实现arm 上应该是调用协处理器指令。这样在读这个数据时,虽然也是从cache读取,但已经是更新过的了。

    rock said on: September 3, 2009 11:26
  2. 我认为关键字是用来提示编译器的,编译器在编译过程中会根据volatile关键字的提示来决定是否对该段代码进行优化,可能具体实现是如你所说的那样,但是是否调用协处理器的指令也是通过编译器生成代码的,毕竟咱们写程序的时候并没有主动的去调用协处理器的指令啊。

    admin said on: September 7, 2009 23:15

Post a Comment

Your email is never published nor shared. Required fields are marked *

*

*

Type your comment out: