2012-10-24 43 views
2

我發現在頭文件這一說法,與微控制器來了,不知道如何評價它這個表達式是如何評估的? (另外,它是什麼?)

#define FIO0SET  (*(volatile unsigned long *)(FIO_BASE_ADDR + 0x18)) 

我沒有foggiest知道這個表情是什麼,所以我無法開始任何有意義的研究。誰能告訴我這個野獸是什麼或者如何評估它?

+7

這是一個宏定義。 –

+0

使用FIO_BASE_ADDR(可能定義爲某個整數),添加0x18(整數,hexa形式),並將其轉換爲指針,然後將其解除引用(從地址FIO_BASE_ADDR + 0x18訪問數據)爲無符號長整型(32位?)。 – nhahtdh

+2

我猜是從內存映射設備訪問一個寄存器? –

回答

8
#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 
+0

'volatile'告訴編譯器該值可以從源代碼之外的外部源更改。 –

+3

@PeterGluck:更具體地說,它告訴編譯器不要緩存該值。每次訪問'FIO0SET'時,編譯器都需要生成執行真實內存訪問的代碼。 –

+0

我添加了一個段落來涵蓋在宏中使用'volatile'限定符。 – ouah

相關問題