volatile關鍵字可以用來提醒編譯器它後面所定義的變數可能隨時改變。
●有volatile:
程式每次需要存儲或讀取這個變數的時候,都會直接從變數地址中讀取數據。
●沒有volatile:
則編譯器可能優化讀取和存儲,可能暫時使用暫存器中的值,如果這個變量由別的程序更新了的話,將出現不一致的現象。
Keil官方說明:volatile
編譯器可能會這樣優化程式:
1. I/O, 假設有一程式片斷如下
u8 a,b,c;
Port =(U8*)0x4000;
a=*Port;
b=*Port;
c=*Port;
以上的a,b,c很有可能被compiler最佳化而導致產生
a=b=c=*Port
也就是說只從Port讀取一次, 而產生a=b=c的結果, 但是原本的程式的目的是要從同一個I/O port讀取3次的值給不同的變數,a,b,c的值可能不同(例如從此I/O port 讀取氣溫), 因此a=b=c的結果不是我們所要的。
所以 將 u8 *Port; 改為volatile u8 *Port;告訴compiler,Port變數具有揮發性的特性, 所以與它有關的程式碼請不要作最佳化動作,請真正的重做三次以下動作:
b=*Port;
c=*Port;
2.multithreaded program
TBC..
沒有留言:
張貼留言