C語言 volatile的作用與使用場景

2021-09-25 23:09:12 字數 1325 閱讀 3039

今天完成公司的任務,突然想起來在除錯過程中遇到了乙個問題是這樣的:「我在主函式裡面寫了乙個while(x)的迴圈,想在中斷裡面去改變這個變數x,以達到主函式裡面退出while迴圈的目的。但是結果並不是這樣的,我的**一直停在了while迴圈裡面。後面我諮詢了一位大哥,然後他告訴我在變數i前面加上乙個volatile。果然,**執行和我的預期一樣了」。**如下

void main()

}void usart1_irqhandler(void)

那麼volatile到底是做什麼的呢?查閱了幾篇部落格,總算是明白了其中的道道。

看兩個例子:

1、如果你的程式是這樣的。

int num = 0 ;

num = 1;

num = 2;

如上,你的編譯器就會去去優化你的**,可能被優化成這樣:

int num = 0 ;

num = 2;

結果「num = 1;」這條指令就丟失了。

但是如果你加上了volatile,你的**變成了這樣:

volatile int num = 0 ;

num = 1;

num = 2;

那麼你的編譯器就不再會去優化你的**,你編譯出來的指令還是三條。

2、當你遇到博主上面的情況時,你也應該加上volatile。第二種使用volatile的情況就是,在某個函式中定義的變數可能在函式外面被改變的情況,你就應該加上volatile,保證每次都必須從記憶體中讀取資料,而不能重複使用放在cache或暫存器中的備份。

這種情況,尤其是在微控制器程式,需要在中斷程式中,改變某個變數的時候,用的特別多。

3、當然還有其他一些使用volatile的情況,如,儲存器對映的硬體暫存器通常也要加voliate,因為每次對它的讀寫都可能有不同意義。

#define __i volatile const /*!< defines 'read only' permissions */

#define __o volatile /*!< defines 'write only' permissions */

#define __io volatile /*!< defines 'read / write' permissions */

你看你很少見到volatile,但是你肯定見到過__o、__i、__io,被這三個定義的變數,都是必須從記憶體中去讀值的。

好,說完了。一句話總結一下,volatile到底有什麼用。它的作用就是叫編譯器不要偷懶,去記憶體中去取值

C語言 volatile關鍵字的作用

volatile意思是 易變的 應該解釋為 直接訪問原始記憶體位址 比較合適。作用 volatile的作業的是告訴編譯器不要對該變數進行優化,這個變數可能會有意向不想的改變,然後都會直接從變數記憶體位址中讀取資料,從而可以提供對特殊位址的穩定訪問。如果沒有volatile宣告,則編譯器可能優化讀取和...

C 中volatile的作用

volatile的語法和const的是一樣的,但是volatile的意思是 在編譯器認識的範圍外,這個資料可以改變 環境正在改變資料 可能通過多工 多執行緒或者中斷處理 所以,volatile告訴編譯器不要擅自做出有關該資料的任何假定,優化期間尤其如此。volatile的本意是一般有兩種說法 1.暫...

C語言中volatile關鍵字的作用

1.編譯器優化介紹 由於記憶體訪問速度遠不及cpu處理速度,為提高機器整體效能,在硬體上引入硬體快取記憶體cache,加速對記憶體的訪問。另外在現代cpu中指令的執行並不一定嚴格按照順序執行,沒有相關性的指令可以亂序執行,以充分利用cpu的指令流水線,提高執行速度。以上是硬體級別的優化。再看軟體一級...