2016年12月1日 星期四

[C51/ARM] 關鍵字: volatile


volatile關鍵字可以用來提醒編譯器它後面所定義的變數可能隨時改變

●有volatile:
程式每次需要存儲或讀取這個變數的時候,都會直接從變數地址中讀取數據。

●沒有volatile:
則編譯器可能優化讀取和存儲,可能暫時使用暫存器中的值,如果這個變量由別的程序更新了的話,將出現不一致的現象。

Keil官方說明:volatile

編譯器可能會這樣優化程式:
 









1. I/O, 假設有一程式片斷如下

u8 *Port;
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;告訴compilerPort變數具有揮發性的特性所以與它有關的程式碼請不要作最佳化動作,請真正的重做三次以下動作:
a=*Port;
b=*Port;
c=*Port;

2.multithreaded program

TBC..



資料來源3
#Keil#8051#MCU#關鍵字#volatile

沒有留言:

張貼留言