volatile相當於告訴編譯器,由它宣告的東西的易變的,不確定的,可能由外部程式(如中斷程式)改變的,禁止編譯器對其讀寫操作進行最佳化,如果定義:
inti;
則編譯器可能會將其最佳化,而放到CPU暫存器中,這在多數情況下是好的,然而在有些情況下,我們會要求一些變數必須在記憶體中(如驅動程式,中斷處理程式等等),這時編譯器這個最佳化就是引起問題,為了避免這種情況,應該這樣定義:
volatileinti;
PS:volatile通常也用來阻止編譯器具最佳化操作,如你有一個非精確延時函式:
voiddelay(unsignedinttimeout)
{
unsignedinti;
for(i=0;i<timeout;i++);
}
有些編譯會足夠聰明地注意到這個函式本質上是什麼也沒幹,會將針對這個函式的呼叫最佳化掉,但這樣是不對的,所以你應該這麼宣告:
volatilevoiddelay(...)
//同上
volatile相當於告訴編譯器,由它宣告的東西的易變的,不確定的,可能由外部程式(如中斷程式)改變的,禁止編譯器對其讀寫操作進行最佳化,如果定義:
inti;
則編譯器可能會將其最佳化,而放到CPU暫存器中,這在多數情況下是好的,然而在有些情況下,我們會要求一些變數必須在記憶體中(如驅動程式,中斷處理程式等等),這時編譯器這個最佳化就是引起問題,為了避免這種情況,應該這樣定義:
volatileinti;
PS:volatile通常也用來阻止編譯器具最佳化操作,如你有一個非精確延時函式:
voiddelay(unsignedinttimeout)
{
unsignedinti;
for(i=0;i<timeout;i++);
}
有些編譯會足夠聰明地注意到這個函式本質上是什麼也沒幹,會將針對這個函式的呼叫最佳化掉,但這樣是不對的,所以你應該這麼宣告:
volatilevoiddelay(...)
{
//同上
}