volatile譯為:易變的。在變數 前加上該關鍵字修飾,確實是告訴編譯器,這個變數是乙個容易改變的變數,不要對它進行優化,每次都要到變數的位址中去讀取變數的資料,但正因為這樣,才是 保持了變數的原樣,因為變數已經發生改變了,你卻操作的是沒有變化時的資料,這樣才讓變數失去了本應該保持的屬性。
eg:int a=1;
a=2;
a=3;
編譯器看到這樣的**,會覺得a的值只有a=3才有意義,所以把a儲存在乙個寄存 器中,每次遇到a都在這個暫存器中去讀取資料,但是a是可能改變,比如中斷或者多執行緒的時候。這個有可能你測試它又是正確的,因為隨著你的優化等級提高, 生成的彙編**會有很大不同,如果基礎不夠紮實,**的魯棒性就會減弱,要想不這樣,那麼需要程式設計師有足夠紮實的基本功。
1.我們先看volatile第乙個應用場景,在中斷服務函式中的使用。
/* main.c */
int flag=0;
int main(void)
if(flag==1)
if(flag==2)
return 0;
/* interrupt*/
void nvic_handler(void)
flag=1;
在這種情況下,編譯器可能會對其做優化,雖然中斷服務函式改變了flag的值,但 是編譯器並沒有在變數記憶體中去讀取,而是在暫存器中讀取了flag之前的快取資料。在中斷函式中的互動變數,一定要加上volatile關鍵字修飾,這樣 每次讀取flag的值都是在其記憶體位址中讀取的,確保是我們想要的資料。
2.多工環境下各任務間共享的標誌應該加volatile。原因其實和上面中斷一樣,要共享標誌,又不想讓編譯器優化了這一點,需要加上該修飾詞。
3.儲存器對映的硬體暫存器通常也要加voliate,因為每次對它的讀寫都可能有不同意義。
c語言中volatile關鍵字
volatile關鍵字是一種型別修飾符,用它宣告的型別變數表示可以被某些編譯器未知的因素更改 比如 作業系統 硬體或者其它執行緒等。遇到這個關鍵字宣告的變數,編譯器對訪問該變數的 就不再進行優化,從而可以提供對特殊位址的穩定訪問。使用該關鍵字的例子如下 int volatile nvint 當要求使...
C語言中volatile關鍵字
一 前言 程式的優化 1 硬體級別上的優化 a.由於記憶體訪問速度遠不及cpu處理速度,為提高機器整體效能,在硬體上引入硬體快取記憶體cache,加速對記憶體的訪問。b.在現代cpu中指令的執行並不一定嚴格按照順序執行,沒有相關性的指令可以亂序執行,以充分利用cpu的指令流水線,提高執行速度。2 軟...
C語言中volatile關鍵字
1.編譯器優化介紹 由於記憶體訪問速度遠不及cpu處理速度,為提高機器整體效能,在硬體上引入硬體快取記憶體cache,加速對記憶體的訪問。另外在現代cpu中指令的執行並不一定嚴格按照順序執行,沒有相關性的指令可以亂序執行,以充分利用cpu的指令流水線,提高執行速度。以上是硬體級別的優化。再看軟體一級...