日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > 芯聞號 > 充電吧
[導(dǎo)讀]先看一個例子:*(volatile?unsigned?int?*)0x500?=?0x10①(unsigned int *)0x500:將地址0x500強(qiáng)制轉(zhuǎn)化為int型指針 ?②(unsigne

先看一個例子:

*(volatile?unsigned?int?*)0x500?=?0x10

①(unsigned int *)0x500:將地址0x500強(qiáng)制轉(zhuǎn)化為int型指針
?②(unsigned int )0x500=0x10:對地址為0x500賦值為0x10

volatile關(guān)鍵字有以下用途:

用來同步,因?yàn)橥粋€東西可能在不同的存儲介質(zhì)中有多個副本,有些情況下會使得這些副本中的值不同,這是不允許的,所以干脆用volatile,讓它只有一個,沒有其他的副本,這樣就不會發(fā)生不同步的問題。

如volatile的意思是告訴編譯器,在編程源代碼時,對這個變量不要使用優(yōu)化。
?在一般的程序設(shè)計(jì)中,如:
?int *a; int b;b = (*a) * (*a);這種情況下通常編譯器為了減少存儲器的讀寫時間,會把代碼優(yōu)化為int *a; int b; int c;
?c = *a;b = c * c;
如果把int *a改為volatile int* a編譯器就不會自動把它優(yōu)化掉了。在整個運(yùn)算過程中,對變量*a的值又讀取了一次。防止因變量*a的值在這一期間發(fā)生了改變,而導(dǎo)致程序結(jié)果的錯誤。

防止編譯器優(yōu)化去掉某些語句

我在arm中見到個寄存器非常奇怪,
?當(dāng)中斷來的時候,相對應(yīng)的位置1,而清0又不能向這位寫0,向這位寫1才是1才是清中斷(清0),
?// 假設(shè)0x560012300 為寄存器地址
?#define INTPAND *(volatile unsigned int *)0x560012300;
?INTPAND = INTPAND; // 清中斷
?像編譯器如果看到有INTPAND = INTPAND;這種看似無用的操作,如果沒有volatile說明,編譯器就很有可能會去掉INTPAND = INTPAND;實(shí)際上有用的東西,卻被編譯器當(dāng)沒用的東西優(yōu)化掉了。

當(dāng)?shù)刂肥莍o端口的時候,讀寫這個地址是不能對它進(jìn)行緩存的,這是相對于某些嵌入式中有cache才有這個。

比如寫這個io端口的時候,如果沒有這個volatile,很可能由于編譯器的優(yōu)化,會先把值先寫到一個緩沖區(qū),到一定時候
?再寫到io端口,這樣就不能使數(shù)據(jù)及時的寫到io端口,有了volatile說明以后,就不會再經(jīng)過cache,write buffer這種,而是直接寫到io端口,從而避免了讀寫io端口的延時。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除( 郵箱:macysun@21ic.com )。
換一批
延伸閱讀
關(guān)閉