檢視標頭檔案中是否有預定義
#define __IO volatile /*!
volatile的作用隨便一搜索都有
volatile 影響編譯器編譯的結果,指出,volatile 變數是隨時可能發生變化的,與volatile變數有關的運算,不要進行編譯最佳化,以免出錯,(VC++ 在產生release版可執行碼時會進行編譯最佳化,加volatile關鍵字的變數有關的運算,將不進行編譯最佳化。)。
例如:
volatile int i=10;
int j = i;
...
int k = i;
volatile 告訴編譯器i是隨時可能發生變化的,每次使用它的時候必須從i的地址中讀取,因而編譯器生成的可執行碼會重新從i的地址讀取資料放在k中。
而最佳化做法是,由於編譯器發現兩次從i讀資料
的程式碼之間的程式碼沒有對i進行過操作,它會自動把上次讀的資料放在k中。而不是重新從i裡面讀。這樣以來,如果i是一個暫存器變數或者表示一個埠資料就容易出錯,所以說volatile可以保證對特殊地址的穩定訪問,不會出錯。
檢視標頭檔案中是否有預定義
#define __IO volatile /*!
volatile的作用隨便一搜索都有
volatile 影響編譯器編譯的結果,指出,volatile 變數是隨時可能發生變化的,與volatile變數有關的運算,不要進行編譯最佳化,以免出錯,(VC++ 在產生release版可執行碼時會進行編譯最佳化,加volatile關鍵字的變數有關的運算,將不進行編譯最佳化。)。
例如:
volatile int i=10;
int j = i;
...
int k = i;
volatile 告訴編譯器i是隨時可能發生變化的,每次使用它的時候必須從i的地址中讀取,因而編譯器生成的可執行碼會重新從i的地址讀取資料放在k中。
而最佳化做法是,由於編譯器發現兩次從i讀資料
的程式碼之間的程式碼沒有對i進行過操作,它會自動把上次讀的資料放在k中。而不是重新從i裡面讀。這樣以來,如果i是一個暫存器變數或者表示一個埠資料就容易出錯,所以說volatile可以保證對特殊地址的穩定訪問,不會出錯。