关于volatile的用法

来源:百度知道 编辑:UC知道 时间:2024/05/30 02:22:06
请问这个问题在<<C语言程序设计>>(谭浩强 第二版)的设计中,是在第几章讲到这个volatile的用法的?
#define flashctrl (*(volatile unsigned *)(memory+0x00)
不明白意思,麻烦给讲一下.

volatile 相当于告诉编译器, 由它声明的东西的易变的, 不确定的, 可能由外部程序 (如中断程序) 改变的, 禁止编译器对其读写操作进行优化, 如果定义:
int i;
则编译器可能会将其优化, 而放到 CPU 寄存器中, 这在多数情况下是好的, 然而在有些情况下, 我们会要求一些变量必须在内存中 (如驱动程序, 中断处理程序等等), 这时编译器这个优化就是引起问题, 为了避免这种情况, 应该这样定义:
volatile int i;

PS: volatile 通常也用来阻止编译器具优化操作, 如你有一个非精确延时函数:
void delay(unsigned int timeout)
{
unsigned int i;
for (i = 0; i < timeout; i++);
}
有些编译会足够聪明地注意到这个函数本质上是什么也没干, 会将针对这个函数的调用优化掉, 但这样是不对的, 所以你应该这么声明:
volatile void delay(...)
{
// 同上
}