C語言之volatile關鍵字
阿新 • • 發佈:2018-12-09
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變數快取在暫存器中