C語言中關鍵字 volatile
阿新 • • 發佈:2018-12-11
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];
}
}