volatile 这个ANSI C 关键字在经典的C 教程中很少提及,高层编程的人也可能永远都
不会用到,但是作为嵌入式开发者来说,这个关键字使用频率应该很高。volatile 的字面意
思为“不稳定的,易变的”。一般用它定义一些IO 端口的变量。现在假定我们要对一个设备
进行初始化,此设备的某一个寄存器地址为0xff800000。我们先看一段程序:
int *output = (int *)0xff800000; /* 定义一个IO 端口*/
int init(void)
{
int i;
for(i=0; i<10; i++)
{
*output = i;
}
}
一般的编译器都带有优化功能,那么这段代码被优化会是什么结果呢?编译器认为前面
循环半天都是废话,对最后的结果毫无影响,因为最终只是将output 这个指针赋值为9,所
以编译器最后给你编译的代码结果相当于为:
int init(void)
{
*output = 9;
}
试想一下,如果你对此外部设备进行初始化的过程是必须是像上面代码一样顺序的对其
赋值,显然优化后的程序并不能达到目的。反之如果你不是对此端口反复写操作,而是反复
读操作,其结果是一样的,编译器在优化后,也许你的代码对此地址的读操作了只做了一次。
然而从代码角度看是没有任何问题的。这时候就是volatile 出场的时候了,volatile 就是通知
编译器,这个声明的变量是一个不稳定的,在遇到此变量时候不要优化。对于上面的代码只
需在声明时加上volatile 即可。
volatile int *output = (volatile int *)0xff800000; /* 定义一个IO 端口*/