volatile關鍵字

volatile關鍵字
(1)用來同步,因爲同一個東西可能在不同的存儲介質中有多個副本,有些情況下會使得這些副本中的值不同,這是不允許的,所以乾脆用volatile,讓它只 有一個,沒有其他的副本,這樣就不會發生不同步的問題。
(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端口的延時
發佈了48 篇原創文章 · 獲贊 19 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章