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