我們在學習C語言的32個關鍵字時,大家都不太注意volatile這個關鍵字,volatile是一個類型修飾符。volatile的中文意思是“易變的”。那麼在程式中我們在什麼情況下才使用他呢?我們在分析核心時經常看到這個關鍵字的使用。舉例如下:
struct task_struct {
volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */
void *stack;
atomic_t usage;
unsigned int flags; /* per process flags, defined below */
unsigned int ptrace;
.......
struct task_struct { volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */ void *stack; atomic_t usage; unsigned int flags; /* per process flags, defined below */ unsigned int ptrace; .......
在應用程式中,volatile主要是被設計用來修飾被不同線程通路和修改的變量。
volatile的變量是說這變量可能會被意想不到地改變,是以編譯器不要進行相應的優化。精确地說就是,優化器在用到這個變量時必須每次都小心地重新讀取這個變量的值,而不是使用儲存在寄存器裡的備份。
例如:
extern int a;//語句1 假設a是一個全局變量
......
int b=a; //語句2
int c=a; //語句3
語句2與語句3中都使用了a的值,優化器在語句3中引用a的值時,認為語句2中已經将a的值讀到寄存器中了,并且在語句2與語句3之間沒有對a進行修改,是以沒必要再到記憶體中去讀a的值,是以直接使用了寄存器中的值。但是如果在語句3執行前,産生了中斷,中斷恰好對a進行了修改。那麼語句3取出來的值就有問題了。
如果上面的全局變量a是被修飾為volatile的話,那麼優化器就不能去優化語句3,要到記憶體中去重新取值。
作為嵌入式系統程式員,volatile一定要知道如何使用。