嵌入式中的 *(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的值在這一期間發生了改變,而導致程序結果的錯誤。

(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端口的延時。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM