C語言中*(volatile unsigned int *)0x500的解釋:
如下;
(unsigned int *)0x500:將地址0x500強制轉化為int型指針
*(unsigned int *)0x500=0x10:對地址為0x500賦值為0x10
其中volatile關鍵字有以下用途:
(1)用來同步,因為同一個東西可能在不同的存儲介質中有多個副本,有些情況下會使得這些副本中的值不同,這是不允許的,所以干脆用volatile,讓它只有一個,沒有其他的副本,這樣就不會發生不同步的問題。
如下所示:
volatile的意思是告訴編譯器,在編程源代碼時,對這個變量不要使用優化。在一般的程序設計中,如:
int *a; int b;
b = (*a) * (*a);
這種情況。通常編譯器為了減少存儲器的讀寫時間,會把代碼優化為:
int *a; int b; int c;
c = *a;
b = c * c;
如果把int *a改為volatile int* a編譯器就不會自動把它優化掉了。在整個運算過程中,對變量*a的值又讀取了一次。防止因變量*a的值在這一期間發生了改變,而導致程序結果的錯誤。
(2)防止編譯器優化去掉某些語句,像我在arm中見到個寄存器非常奇怪,當中斷來的時候,相對應的位置1,而清0又不能向這位寫0,向這位寫1才是1才是清中斷(清0),
// 假設0x560012300 為寄存器地址
#define INTPAND *(volatile unsigned int *)0x560012300
INTPAND = INTPAND; // 清中斷
像編譯器如果看到有INTPAND = INTPAND;這種看似無用的操作,如果沒有volatile說明,編譯器就很有可能會去掉INTPAND = INTPAND;實際上有用的東西,卻被編譯器當沒用的東西優化掉了。
(3)當地址是io端口的時候,讀寫這個地址是不能對它進行緩存的,這是相對於某些嵌入式中有cache才有這個。比如寫這個io端口的時候,如果沒有這個volatile,很可能由於編譯器的優化,會先把值先寫到一個緩沖區,到一定時候再寫到io端口,這樣就不能使數據及時的寫到io端口,有了volatile說明以后,就不會再經過cache,write buffer這種,而是直接寫到io端口,從而避免了讀寫io端口的延時。