
許多程序員都無法正確理解C語言關鍵字?volatile,這并不奇怪。因為大多數C語言書籍通常都是一兩句一帶而過,本文將告訴你如何正確使用它。
RTOS的任務獨立運行正常–直到生成了其他任務
?
聲明一個變量為volatile,可以在數據類型之前或之后加上關鍵字volatile。下面的語句,把foo聲明一個volatile的整型。
volatile?int?foo;
int?volatile?foo;volatile?uint8_t?*?pReg;
uint8_t?volatile?*?pReg;int?*?volatile?p;最后,如果你再struct或者union前使用volatile關鍵字,表明struct或者union的所有內容都是volatile。如果這不是你的本意,可以在struct或者union成員上使用volatile關鍵字。
只要變量可能被意外的修改,就需要把該變量聲明為volatile。在實際應用中,只有三種類型數據可能被修改:
在多線程、多任務應用中,全局變量被多個任務讀寫
接下來,我們將分別討論上述三種情況。
嵌入式系統包含真正的硬件,通常會有復雜的外設。這些外設寄存器的值可能被異步的修改。舉個簡單的例子,我們要把一個8-bit狀態寄存器的地址映射到0x1234。在程序中循環查看該狀態寄存器的值是否變為非0。




在中斷服務程序中,經常會修改一些全局變量值,來作為主程序中的判斷條件。例如,在串口中斷服務程序中,可能會檢測是否接收到了ETX(假如是消息的結束標識符)字符。如果接收到了ETX,ISR設置一個全局標志位。

在實時系統中,盡管有想queues,pipes等這些同步機制,使用全局變量實現兩個任務共享信息的做法依然很常見。即使在你的程序中加入了搶占式調度器,你的編譯器依然無法知道什么是上下文切換,或何時發生上下文切換。因此從概念上講,多任務修改全局變量的做法與中斷服務程序中修改全局變量的做法是相同的。
因此,所有這類全局變量都應該聲明為 volatile。
?

往期推薦
來都來了,點個?在看?再走吧~~~
