我發現在頭文件這一說法,與微控制器來了,不知道如何評價它這個表達式是如何評估的? (另外,它是什麼?)
#define FIO0SET (*(volatile unsigned long *)(FIO_BASE_ADDR + 0x18))
我沒有foggiest知道這個表情是什麼,所以我無法開始任何有意義的研究。誰能告訴我這個野獸是什麼或者如何評估它?
我發現在頭文件這一說法,與微控制器來了,不知道如何評價它這個表達式是如何評估的? (另外,它是什麼?)
#define FIO0SET (*(volatile unsigned long *)(FIO_BASE_ADDR + 0x18))
我沒有foggiest知道這個表情是什麼,所以我無法開始任何有意義的研究。誰能告訴我這個野獸是什麼或者如何評估它?
#define FIO0SET (*(volatile unsigned long *)(FIO_BASE_ADDR + 0x18))
在存儲器地址
FIO_BASE_ADDR + 0x18
轉到和retreive存儲在該位置的32位(如果unsigned long
是32位)字。 FIO0SET
也是一個可修改的左值,所以你可以給它賦值。
請注意,volatile
限定符用於通知編譯器該對象的值可能以未知方式更改。考慮輸入模式下IO寄存器的一個例子:它的值可能會意外地改變,並且編譯器不能假定它的值在讀取後沒有改變。
例如:
unsigned long register_value;
register_value = FIO0SET; // store FIO0SET in register_value object
或
FIO0SET = 0x1122334; // store 0x1122334 value in FIO0SET register
'volatile'告訴編譯器該值可以從源代碼之外的外部源更改。 –
@PeterGluck:更具體地說,它告訴編譯器不要緩存該值。每次訪問'FIO0SET'時,編譯器都需要生成執行真實內存訪問的代碼。 –
我添加了一個段落來涵蓋在宏中使用'volatile'限定符。 – ouah
這是一個宏定義。 –
使用FIO_BASE_ADDR(可能定義爲某個整數),添加0x18(整數,hexa形式),並將其轉換爲指針,然後將其解除引用(從地址FIO_BASE_ADDR + 0x18訪問數據)爲無符號長整型(32位?)。 – nhahtdh
我猜是從內存映射設備訪問一個寄存器? –