C語言中的關鍵字“ volatile”的用法

iDotNetSpace發表於2009-02-17
volatile 這個ANSI C 關鍵字在經典的教程中很少提及,高層程式設計的人也可能永遠都
不會用到,但是作為嵌入式開發者來說,這個關鍵字使用頻率應該很高。volatile 的字面意
思為不穩定的,易變的。一般用它定義一些IO 埠的變數。現在假定我們要對一個裝置
進行初始化,此裝置的某一個暫存器地址為0xff800000。我們先看一段程式:
int *output = (int *)0xff800000; /* 
定義一個IO */
int init
void
{
int i;
for(i=0; i<10; i++)
{
*output = i;
}
}
一般的編譯器都帶有優化功能,那麼這段程式碼被優化會是什麼結果呢?編譯器認為前面
迴圈半天都是廢話,對最後的結果毫無影響,因為最終只是將output 這個指標賦值為9,所
以編譯器最後給你編譯的程式碼結果相當於為:
int init
void
{
*output = 9;
}
試想一下,如果你對此外部裝置進行初始化的過程是必須是像上面程式碼一樣順序的對其
賦值,顯然優化後的程式並不能達到目的。反之如果你不是對此埠反覆寫操作,而是反覆
讀操作,其結果是一樣的,編譯器在優化後,也許你的程式碼對此地址的讀操作了只做了一次。
然而從程式碼角度看是沒有任何問題的。這時候就是volatile 出場的時候了,volatile 就是通知
編譯器,這個宣告的變數是一個不穩定的,在遇到此變數時候不要優化。對於上面的程式碼只
需在宣告時加上volatile 即可。
volatile int *output = (volatile int *)0xff800000; /* 
定義一個IO */

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-553558/,如需轉載,請註明出處,否則將追究法律責任。

相關文章