1. 程式人生 > >C語言之volatile關鍵字

C語言之volatile關鍵字

volatile:

volatile提醒編譯器它後面的定義隨時可能改變,因此編譯後的程式每次需要儲存或讀取這個變數時,都會直接從變數地址讀取資料。因此CPU訪問暫存器的速度要快過RAM,所以編譯器一般為了提高效率,會將變數放在暫存器中,通過訪問暫存器來讀取變數。但是這樣會造成一些問題,暫存器中保留的變數的值是暫時的,此時如果這個變數由別的程式更新了,將出現一些意料不到的現象。

//舉個栗子
int i;

int main()
{
  while(1)
  {
    if(i==1)
    do_something();
  }
}

void ISR()
{
   i=1;
}  

程式本意是中斷產生時,在main中呼叫do_something函式。但是由於編譯器判斷在mian函式裡面沒有修改過i,因此自行進行優化。執行一次對從i到暫存器的操作,之後if判斷都讀取這個暫存器中i的副本,導致do_something函式從沒被呼叫。如果此時變數加上volatile修飾,則可以避免這個問題。

一般來說,volatile用在如下幾個地方。

  • 中斷服務程式中修改的供其他程式檢測的變數需要加volatile
  • 多工環境下各任務共享的標識應該加volatile
  • 儲存器對映的硬體暫存器通常也要加volatile說明,因此每次對它的讀寫都可能有不同的意義。

volatile的作用:

volatile不會將volatile變數快取在暫存器中