volatile的本意是「易失的,易改變的」。在c語言中,這個限定詞的含義是向編譯器指明變數的內容可能會由於其它程式的修改而變化。
通常,在程式中申明了乙個變數時,編譯器會盡量把它放在通用暫存器中,例如ebx。當cpu把其值放到ebx中後就不會再關心對應記憶體中的值。若此時其它程式(例如核心程式或乙個中斷)修改了記憶體中它的值, ebx中的值並不會隨之更新。為了解決這種情況就建立了volatile限定詞,讓**在引用該變數時一定要從指定位置取得其值。
int square(volatile int *ptr)
由於*ptr的值可能被意想不到的改變(比如某個暫存器),因此a和b可能是不同的。結果,這段**可能返回的不是你所期望的平方值。
正確**如下:
long square(volatile int *ptr)
由於訪問暫存器的速度要快過ram,所以編譯器一般都會做減少訪問外部ram的優化。比如:
static int i = 0;
int main(void)
}/* interupt service routine */
void isr_2(void)
程式的本意是希望isr_2中斷產生時,在main函式中呼叫dosomething函式,但是,由於編譯器判斷在main函式裡面沒有修改i,因此,可能只執行一次對從i到某暫存器的讀操作,然後每次if判斷都只使用這個暫存器裡面的「i副本」,導致dosomething永遠也不會被呼叫。如果將變數volatile修飾,則編譯器保證對此變數的讀寫操作都不會被優化(肯定執行)。此例中i也應該如此說明。
一般說來,volatile用在如下幾個地方:
中斷服務程式中修改的供其它程式檢測的變數需要加volatile;
多工環境下各任務間共享的標誌應該加volatile;
儲存器對映的硬體暫存器通常也要加volatile說明,因為每次對它的讀寫都可能有不同意義。
reference:
C語言volatile關鍵字
volatile 是易變的 不穩定的意思。很多人根本就沒見過這個關鍵字,不知道它的存在。也有很多程式設計師知道它的存在,但從來沒用過它。我對它有種 楊家有女初長成,養在深閨人未識 的感覺。volatile 關鍵字和const 一樣是一種型別修飾符,用它修飾的變數表示可以被某些編譯器未知的因素更改,比...
C語言關鍵字volatile
volatile修飾變數表示該變數易受外界影響發生改變,volatile強烈要求編譯器每次對變數進行訪問都要從記憶體中進行 int a 10 b a c b 當編譯器掃到第一行時10賦給了a 自後a變數的值沒有發生改變,a賦給了b,b賦給了c 由於cpu訪問記憶體的速度較慢,編譯器為了提高效率,直接...
C語言關鍵字 volatile
volatile關鍵字 用法 1 告訴編譯器不做任何優化 2 表示用volatile定義的變數會在程式外被改變,每次都必須要從記憶體中讀取,而不能把它放在cache或暫存器中重複使用 volatile是告訴編譯器對它所修飾的物件別執行優化。volatile在進行多執行緒程式設計時要注意,而在單執行緒...