嵌入式中的 *(volatile unsigned int *)0x500 解釋

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的值在這一期間發生了改變,而致使程序結果的錯誤。it

(2)防止編譯器優化去掉某些語句,像我在arm中見到個寄存器很是奇怪,當中斷來的時候,相對應的位置1,而清0又不能向這位寫0,向這位寫1纔是1纔是清中斷(清0), io

// 假設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端口的延時。

相關文章
相關標籤/搜索