在寫嵌入式裝置驅動時,需要對暫存器埠進行設定,常常有如下的定義方式:
#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代替,呼叫的時候直接對指向的位址暫存器寫內容既可。
vxworks一些巨集定義位址
ram high adrs記憶體起始位址 boot執行位址 ram low adrs vxworks執行位址 user reserved mem使用者保留記憶體區域 熱啟動可以保留除錯資訊 local mem local adrs記憶體起始位址 加入元件memory show routine就可用s...
abs int 巨集定義 巨集定義和巨集方法
巨集定義和巨集方法 定義機型 define is iphone5 uiscreen instancesrespondtoselector selector currentmode cgsizeequaltosize cgsizemake 640,1136 uiscreen mainscreen cu...
C 巨集定義 巨集定義求面積
學過c語言的讀者,對巨集定義應該不陌生,同樣在c 中,也可以用巨集定義命令將乙個指定的識別符號來代表乙個字串,巨集定義的作用一般是用乙個短的名字代表乙個長的字串。一般形式為 define 識別符號 字串定義pi的符號常量 define pi 3.14在c 中還可以用 define命令定義帶引數的巨集...