下面的宏定义是什么意思?
#define REG(x) (*((volatile unsigned int *)(x)))
它转换x
为volatile unsigned int
指针,然后取消引用该指针以获取x
“指向”的值。
请注意,x
实际上不需要将其声明为指针,它也可以是一个文字整数,然后将其视为内存中某处的地址。在嵌入式系统或在固定地址有东西的内核启动代码中很有用。
volatile
关键字大体上意味着编译器应该在每次出现时真正访问和写入合格的数据。
作为一个愚蠢的例子,考虑循环
#define REG(x) (*((volatile unsigned int *)(x)))
for (REG(0x1234)=0; REG(0x1234)<10; REG(0x1234)++)
dosomethingwith(REG(0x1234)*2);
如果您没有放置volatile
关键字,优化编译器可以(假设dosomethingwith
是内联的)在寄存器中加载 0x1234 的内存内容一次(在循环之前)并且可能仅在循环之后更新它,并且只增加和测试的内容寄存器(无需在循环中访问位置 0x1234)。
使用volatile
关键字,编译的二进制代码需要在每个循环中访问 0x1234 位置(可能是硬件端口或设备)。