地址宏定義


在寫嵌入式設備驅動時,需要對寄存器端口進行設置,常常有如下的定義方式:

#define VHPIC_R  *((volatile __u32  *)(0x00 + HPI_R_BASE))

當然後面的 HPI_R_BASE是通過ioremap_nocache函數映射得到的。

      作爲一個宏定義語句,define是定義一個變量或常量的僞指令。首先(volatile __u32  *)的意思是將後面的那個地址強制轉換成 (volatile __u32  *),__u32是無符號32位整形,volatile 是一個類型限定符,如const一樣,當使用volatile限定時,表示這個變量是依賴系統實現的,以爲着這個變量會被其他程序或者計算機硬件修改,由於地址依賴於硬件,volatile就表示他的值會依賴於硬件。

就象大家更熟悉的const一樣,volatile是一個類型修飾符(type specifier)。它是被設計用來修飾被不同線程訪問和修改的變量。如果沒有volatile,基本上會導致這樣的結果:要麼無法編寫多線程程序,或者編譯器無法進行優化。

       volatile   類型是這樣的,其數據確實可能在未知的情況下發生變化。比如,硬件設備的終端更改了它,現在硬件設備往往也有自己的私有內存地址,比如顯存,他們一般是通過映象的方式,反映到一段特定的內存地址當中,這樣,在某些條件下,程序就可以直接訪問這些私有內存了。另外,比如共享的內存地址,多個程序都對它操作的時候。你的程序並不知道,這個內存何時被改變了。如果不加這個voliatile修飾,程序是利用catch當中的數據,那個可能是過時的了,加了voliatile,就在需要用的時候,程序重新去那個地址去提取,保證是最新的。歸納起來如下:

1.   volatile變量可變   允許除了程序之外的比如硬件來修改他的內容   
2.   訪問該數據任何時候都會直接訪問該地址處內容,即通過cache提高訪問速度的優化被取消  

       對於*((volatile __u32  *)(0x00 + HPI_R_BASE))爲隨硬件需要定義的一種地址,前面加上“*”指針,爲直接指向該地址,整個定義約定符號VHPIC_R代替,調用的時候直接對指向的地址寄存器寫內容既可。

發佈了22 篇原創文章 · 獲贊 17 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章