volatile作爲一個關鍵字,用來修飾變量,在程序設計中,使用該關鍵字聲明的變量或對象通常擁有和優化或多線程相關的特殊屬性。
volatile作爲指令關鍵字最主要的作用就是,確保被修飾的指令不會因爲編譯器的優化而省略,並且要求每次直接讀值。簡潔的來說,就是爲了防止編譯器對代碼進行優化而設計的關鍵字。
是因爲有些程序中的變量在編譯的時候或許會因爲一些外界的原因發生意想不到的改變,這樣編譯器就不會去假設這個變量的值了,也就是說,優化器在用到這個變量的時候必須每次都小心的重讀取這個變量的值,而不是使用保存在寄存器裏面的備份
先介紹一下幾個用到volatile變量的例子
(1) 並行設備的硬件寄存器,如狀態寄存器
(2)中斷服務子程序中會訪問到的非自動變量
(3)多線程應用中被幾個任務共享的變量
嵌入式系統程序員會經常同硬件,中斷,等打交道,所有的這些都要求使用volatile變量,因爲如果你不懂得volatile變量,將會給你的工作帶來毀滅性的打擊哦。
再介紹幾個經常會問到的問題,聰明的你,看看是否已經對volatile這個關鍵字充分的瞭解了
1 一個參數即可以是const還可以是volatile嗎? 說說這是爲什麼。
是的,例如只讀的狀態寄存器。他是volatile,因爲它可能被意想不到的改變。它是const是因爲程序不應該去修改一個被const修飾的變量。
2 一個指針可以是volatile嗎? 爲什麼。
是這樣的,儘管你見到的很少,但是還是有的,比如當一箇中斷服務子程序修改一個指向一個buffer的指針時。
那麼通常在哪些地方會用到volatile呢?
首先,多任務環境下各任務間共享的標誌應加上volatile。
還有中斷服務程序中修改的供其它程序檢測的變量需要加上。
存儲器映射的硬件寄存器常常也要加上volatile來修飾,因爲每次對它的讀寫都可能有不同的意義哦