C语言开发笔记(二)volatile
生活随笔
收集整理的這篇文章主要介紹了
C语言开发笔记(二)volatile
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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關鍵字表示每次讀寫該內存單元中的數據時都要到內存單元處去取,而不是讀取寄存器中的備份值。
總結
以上是生活随笔為你收集整理的C语言开发笔记(二)volatile的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: STM32F1笔记(十三)SPI
- 下一篇: C语言开发笔记(一)自动转换和强制转换