volatile常用于多線程共享資源和嵌入式軟件的中斷。
?
(一)嵌入式軟件中斷中volatile的應用
volatile unsigned short g_timer3_count = 0;void TIM3_IRQHandler(void)
{if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET){TIM_ClearITPendingBit(TIM3, TIM_IT_Update);g_timer3_count++;}
}
TIM3_IRQHandler是定時器3的中斷服務函數。定時器3配置為每1ms進入一次中斷,每次進入全局變量g_timer3_count自加1。
在另一個.c里調用g_timer3_count。
extern volatile unsigned short g_timer3_count;void func(void)
{if(3000 == g_timer3_count){//do something...}
}
如果不使用volatile修飾g_timer3_count的話,很有可能永遠進入不了if(3000 == g_timer3_count)的判斷里,因為判斷里的g_timer3_count的值可能為固定的某個值。
造成這種現象的原因有兩種:
1、編譯器優化掉了。編譯器認為這個變量不會有變化,但實際上在硬件或者多線程中已經改變了。所以要加volatile來告訴編譯器這個變量不需要優化,變量的值每次直接從內存讀取;
2、變量在其他地方改變,而cash里的值沒有改變,每次從cash里面獲取。因此也要加volatile,每次不用cash而直接從內存讀取。
?
volatile關鍵字表示每次讀寫該內存單元中的數據時都要到內存單元處去取,而不是讀取寄存器中的備份值。