1. 程式人生 > >c語言volatile關鍵字在微控制器中的作用

c語言volatile關鍵字在微控制器中的作用

volatile 的意思是“易失的,易改變的”。這個限定詞的含義是向編譯器指明變數的內容可能會由於其他程式的修改而變化。通常在程式中申明瞭一個變數時,編譯器會盡量把它存放在通用暫存器中,例如ebx。當CPU把其值放到ebx中後就不會再關心對應記憶體中的值。若此時其他程式(例如核心程式或一箇中斷)修改了記憶體中它的值,ebx中的值並不會隨之更新。為了解決這種情況就建立了volatile限定詞,讓程式碼在引用該變數時一定要從指定位置取得其值。

程式碼如下:
int square(volatile int *ptr)
{
int a,b;
a = *ptr;
b = *ptr;
return a * b;
}

由於*ptr的值可能被意想不到地該變(比如某個暫存器),因此a和b可能是不同的。結果,這段程式碼可能返不是你所期望的平方值!正確的程式碼如下:
程式碼如下:
long square(volatile int *ptr)
{
int a;
a = *ptr;
return a * a; }


volatile的本意是“易變的”
  
由於訪問暫存器的速度要快過RAM,所以編譯器一般都會作減少存取外部RAM的優化。比如:
程式碼如下:
static   int   i=0;
int   main(void)
{
        ...
        while   (1)
        {
                if   (i)   dosomething();
        }
}
/*   Interrupt   service   routine.   */
void   ISR_2(void)
{
          i=1;
}

程式的本意是希望ISR_2中斷產生時,在main當中呼叫dosomething函式,但是,由於編譯器判斷在main函式裡面沒有修改過i,因此
可能只執行一次對從i到某暫存器的讀操作,然後每次if判斷都只使用這個暫存器裡面的“i副本”,導致dosomething永遠也不會被呼叫。如果將將變數加上volatile修飾,則編譯器保證對此變數的讀寫操作都不會被優化(肯定執行)。此例中i也應該如此說明。
一般說來,volatile用在如下的幾個地方:
1、中斷服務程式中修改的供其它程式檢測的變數需要加volatile;
2、多工環境下各任務間共享的標誌應該加volatile;
3、儲存器對映的硬體暫存器通常也要加volatile說明,因為每次對它的讀寫都可能由不同意義; 

本文轉自http://www.jb51.net/article/37489.htm