- 论坛徽章:
- 0
|
关键字volatile是什么声明?
将一个变量说明为volatile表示这个变量是“易变的”。如果一个变量会被其它引用改
变,或在其它并行的任务中会被改变(例如中断服务程序),都要显式地说明为“volatile”,否则在编译器优化阶段会作出错误的判断,例如将这个变量
读入寄存器以后,在没有对这个变量赋值以前,会一直使用寄存器中的值,而实际上这个变量的值可能已经被一个指针引用改变了,或者是在中断服务程序中被改变
了,下面这个例子说明这种错误:
有一个变量T,在定时中断中每隔一个固定时间减一,然后在主程序中等待它减到0
unsigned char T;
void T0_int(void) interrupt 1
{
...
T--;
...
}
void main(void)
{
...
T=10;
while (T!=0); /* 这在某些编译器中将成为一个死循环,而不是预想的等待一段时间 */
...
}
正确的写法应该是将第一句改为:
volatile unsigned char T;
*注:这个例子并不是针对特定的编译器,所以可能在有些编译器中能正确编译。但作为一个健壮的程序,一定要注意这一点,否则即使能得到正确结果,也会给程序移植或升级带来意想不到的问题。
一般说来,volatile用在如下的几个地方:
1、中断服务程序中修改的供其它程序检测的变量需要加volatile;
2、多任务环境下各任务间共享的标志应该加volatile;
3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能由不同意义;
另外,以上这几种情况经常还要同时考虑数据的完整性(相互关联的几个标志读了一半被打断了重写),在1中可以通过关中断来实现,2中可以禁止任务调度,3中则只能依靠硬件的良好设计了。
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/73410/showart_1088957.html |
|