1. 程式人生 > >C語言中volatile關鍵字的作用

C語言中volatile關鍵字的作用

本文為轉載總結文章:點選進入原地址

用volatile修飾變數的時候,意指系統總是重新從它所在的記憶體讀取資料。遇到這個關鍵字宣告的變 量,編譯器對訪問該變數的程式碼就不再進行優化,從而可以提供對特殊地址的穩定訪問。
舉一個容易理解的例子:

volatile int i=10; 
int j = i; 
... 
int k = i; 

由於編譯器發現兩次從i讀資料的程式碼之間的程式碼沒有對i進行過操作,它會自動把上次讀的資料放在k中。而不是重新從i裡面讀。

再比如下面這個例子:

static int i=0;
int main(void)
{
     ...
     while
(1) { if (i) SOME_THING(); } } /* 中斷服務函式 */ void ISR_2(void) { i=1; }

程式的本意是希望ISR_2中斷產生時,在main函式中呼叫SOME_THING函式,但是,由於編譯器判斷在main函式裡面沒有修改過i,因此可能只執行一次對從i到某暫存器的讀操作,然後每次if判斷都只使用這個暫存器裡面的“i副本”,導致SOME_THING永遠也不會被呼叫。如果將變數加上volatile修飾,則編譯器保證對此變數的讀寫操作都不會被優化(肯定執行)。此例中i也應該如此說明。

上面在中斷中發生的這個例子,我遇到過。因為當時我的程式碼,不是很穩定,不排除跟這個原因有關。