C语言中volatile关键字的使用

来源:互联网 发布:linux 用户清单 编辑:程序博客网 时间:2024/06/05 15:08

问题来源:程序中       

#define PORTIO_8*(volatile unsigned char *)

#define  PORTA     PORTIO_8(IO_BASE + 0x00)   /* port A */

volatile的含义

    该关键字的含义是提醒编译器它后面的变量随时都有可能改变,因此编译后的程序每次需要存储和读取这个变量的时候,都会直接从变量的地址中读取数据。如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。

    volatile的本意是“易变的”,由于访问寄存器的速度要快过RAM,所以编译器一般都会作减少存取外部RAM的优化。

    一般来说,volatile用在如下的几个地方:

1、终端服务程序中修改的供其他程序检测的变量需要加volatile;

2、多任务环境下各任务间共享的标志应该加volatile;

3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能有不同意义;

    另外,以上这几种情况经常还要同时考虑数据的完整性(相互关联的几个标志读了一半内打断了重写)。

在1中可以通过关断中断来实现;

在2中可以禁止人物调度;

在3中则只能依靠硬件的良好设计了;

    volatile总是与优化有关,编译器有一种技术叫做数据流分析,分析程序中的变量在哪里赋值、在哪里使用、在哪里失效,分析结果可以用于常量合并,常量传播等优化,进一步可以消除死代码。但有时这些优化不是程序所需要的,这时可以用volatile关键字禁止做这些优化。

转载自:http://www.cnblogs.com/yc_sunniwell/archive/2010/06/24/1764231.html