1. 程式人生 > >C語言中關鍵字 volatile

C語言中關鍵字 volatile

1、volatile 

     volatile關鍵字在c語言中用於表示變數是易變的,告訴編譯器不快取該變數,也就是每次訪問改變數都要去記憶體訪問,不會訪問該變數在快取中的副本,也就是CPU的一級二級三級等等快取,改變的時候也是直接寫回記憶體的,不會放到快取裡,一個定義為volatile的變數是說這變數可能會被意想不到地改變,這樣,編譯器就不會去假設這個變數的值了。精確地說就是,優化器在用到這個變數時必須每次都小心地重新讀取這個變數的值,而不是使用儲存在暫存器裡的備份。

      在嵌入式環境中用volatile關鍵字宣告的變數,在每次對其值進行引用的時候都會從原始地址取值,而不會將值儲存在棧或其他位置。

例如:

uint8_t *ptr =...; //裝置地址 
*ptr = 1; //第一個指令 
*ptr = 0; //第二個指令 

以上程式編譯器可能做優化而成:

int *ptr = ...; 
*ptr = 0; 

就會導致第一個指令丟失。如果用關鍵字volatile,那麼編譯器就會保證程式的原意,微控制器庫函式中對於IO暫存器的對映都會使用關鍵字volatile。

volatile uint8_t *addr = ...; 
*addr = 1; 
*addr = 0; 

2.在多工環境下各任務間共享的標誌也應該加volatile。

3.儲存器對映的硬體暫存器通常也要加voliate,因為每次對它的讀寫都可能有不同意義。

例如:

假設要對一個裝置進行初始化,此裝置的某一個暫存器為0xXXXXXX。

int *uartSendRegist= (unsigned  int *)0xXXXXXXXXX;//定義一個串列埠資料暫存器地址;
int init(void)
{
   int i;
   for(i=0;i< 10;i++)
   {
 delaySomeTime();
     *uartSendRegist= data[i];
   }
}