这个表达式是如何评估的?(还有,它是什么?)

Tim*_*Tim 2 c

我在带有微控制器的头文件中发现了这个语句,并且不知道如何评估它

#define FIO0SET        (*(volatile unsigned long *)(FIO_BASE_ADDR + 0x18))
Run Code Online (Sandbox Code Playgroud)

我不知道这个表达是什么,所以我没有办法开始任何有意义的研究.谁能告诉我这只野兽是什么或如何评价它?

oua*_*uah 8

#define FIO0SET  (*(volatile unsigned long *)(FIO_BASE_ADDR + 0x18))
Run Code Online (Sandbox Code Playgroud)

转到存储器地址FIO_BASE_ADDR + 0x18并检索unsigned long存储在该位置的32位(如果是32位)字.FIO0SET也是一个可修改的左值,因此您可以为其赋值.

请注意,volatile限定符用于通知编译器对象的值可能以未知的方式更改.考虑一个示例输入模式下的IO寄存器:其值可能会意外更改,并且编译器无法假设其值在读取后未发生更改.

例如:

unsigned long register_value;

register_value = FIO0SET; // store FIO0SET in register_value object
Run Code Online (Sandbox Code Playgroud)

要么

FIO0SET = 0x1122334;      // store 0x1122334 value in FIO0SET register 
Run Code Online (Sandbox Code Playgroud)

  • @PeterGluck:更具体地说,它告诉编译器不要缓存该值.每次访问`FIO0SET`时,编译器都需要生成执行实际内存访问的代码. (3认同)