C語言中volatile關鍵字的作用
阿新 • • 發佈:2018-10-31
本文為轉載總結文章:點選進入原地址
用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也應該如此說明。
上面在中斷中發生的這個例子,我遇到過。因為當時我的程式碼,不是很穩定,不排除跟這個原因有關。