volatile關鍵字是一種類型修飾符,用它聲明的類型變量表示可以被某些編譯器未知的因素更改,比如操作系統(tǒng)、硬件或者其它線程等。遇到這個關鍵字聲明的變量,編譯器對訪問該變量的代碼就不再進行優(yōu)化,從而可以提供對特殊地址的穩(wěn)定訪問。
volatile區(qū)分C程序員和嵌入式系統(tǒng)程序員的最基本的問題。搞嵌入式的家伙們經(jīng)常同硬件、中斷、RTOS等等打交道,所有這些都要求用到volatile變量。
不懂得volatile的內(nèi)容將會帶來災難。
int volatile nVint; 當要求使用volatile 聲明的變量的值時,系統(tǒng)總是重新從它所在的內(nèi)存讀取數(shù)據(jù),即使它前面的指令剛剛從該處讀取過數(shù)據(jù)。而且讀取的數(shù)據(jù)立刻被保存。
由于訪問寄存器的速度要快過RAM,所以編譯器一般都會作減少存取外部RAM的優(yōu)化,對于變量, 編譯器發(fā)現(xiàn)兩次從i讀數(shù)據(jù)的代碼之間的代碼沒有對i進行過操作,它會自動把上次讀的數(shù)據(jù)放在b中。而不是重新從i里面讀取. 這樣以來,如果i是一個寄存器變量或者表示一個端口數(shù)據(jù)就容易出錯,所以說volatile可以保證對特殊地址的穩(wěn)定訪問。
volatile 指出 i是隨時可能發(fā)生變化的,每次使用它的時候必須從i的地址中讀取. •;存儲器映射的硬件寄存器通常也要加volatile說明,因為每次對它的讀寫都可能由不同意義,如并行設備的硬件寄存器(如:狀態(tài)寄存器) •;中斷服務程序中修改的供其它程序檢測的變量需要加volatile,如一個中斷服務子程序中會訪問到的非自動變量(Non-automatic variables) •;多任務環(huán)境下各任務間共享的數(shù)據(jù),如多線程應用中被幾個任務共享的變量