<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 手機與無(wú)線(xiàn)通信 > 設計應用 > 嵌入式編程需注意的Cache機制及其原理

嵌入式編程需注意的Cache機制及其原理

作者: 時(shí)間:2010-06-06 來(lái)源:網(wǎng)絡(luò ) 收藏

1

即高速緩存,它的出現基于兩種因素:一、CPU的速度和性能提高很快,而主存速度較低且價(jià)格高;二、程序執行的局部性特點(diǎn)。將速度較快而容量有限的SRAM構成,可以盡可能發(fā)揮CPU的高速度。CPU與外設交換數據時(shí)經(jīng)常用到buffer(緩沖),這與緩存極其相似,只不過(guò)Cache是為了提高CPU和內存之間的數據交換速度而設計,而buffer是為了提高內存和硬盤(pán)(或其他I/O設備)之間的數據交換速度而設計的。

Baidu快照(cache.baidu.com)就是一個(gè)緩存的例子,其作用與計算機CPU緩存有類(lèi)似之處。 Cache的如圖1所示。



在讀取內存數據的同時(shí)CPU將數據保存到Cache數據區,同時(shí)更新Cache映射表(保存地址信息,表示該地址的數據是否已在Cache數據區,即是否命中)。這樣,CPU再次讀取該地址數據時(shí),就可以直接從Cache提取。讀Cache的時(shí)間遠小于直接讀內存,可提高CPU讀取數據的效率。

Cache數據區有成塊讀取的特性(Cache映射表保存的地址是塊地址,節省空間,也符合程序執行的局部性特點(diǎn))。Cache數據區遠遠小于內存空間,就需要相應的替代算法。比如最近最少使用算法,可將新數據替代使用頻率低的數據,同時(shí)更新映射表信息??梢酝葡?,Cache空間越大,命中率越高。

寫(xiě)內存需要直接更新內存。如果映射表存在該地址信息,還需要同時(shí)更新Cache數據區。這種Cache訪(fǎng)問(wèn)方式就稱(chēng)作“直寫(xiě)”,Samsung公司的ARM7微處理器S3CA510B就是這種方式。以下所討論的Cache問(wèn)題除非特殊說(shuō)明,否則都是“直寫(xiě)”方式。

2 時(shí)需的問(wèn)題

2.1訪(fǎng)問(wèn)外設使用Cache的問(wèn)題

在訪(fǎng)問(wèn)內存時(shí)使用Cache是不會(huì )出現問(wèn)題的,但如果訪(fǎng)問(wèn)數據易變外設(數據不依賴(lài)于CPU寫(xiě)操作而改變)時(shí)使用Cache就可能出現問(wèn)題。問(wèn)題在于外設數據的改變不僅僅依靠CPU寫(xiě)操作,CPU第一次讀取外設數據時(shí)將外設的數據和地址信息保存到Cache,第二次讀取外設數據時(shí)就可能有問(wèn)題出現。這是因為數據直接從Cache提取,而外設的數據可能有改變。

因此,在訪(fǎng)問(wèn)易變外設時(shí)要禁止使能Cache,直接讀取外設數據到CPU,而不經(jīng)過(guò)Cache的任何環(huán)節,即保證不改變Cache映射表和Cache數據區內容。

S3C4510B的SYSCFG SFR(特殊功能寄存器)有用來(lái)控制Cache使能或不使能的,通過(guò)對該SFR的設置可暫時(shí)禁止Cache或重新恢復Cache功能。這樣就可以在讀取外設前禁止Cache,讀取結束后重新使能Cache,保證了外設數據讀取的正確性。寫(xiě)數據到外設時(shí)采用“直寫(xiě)”方式,更沒(méi)有問(wèn)題。

2.2開(kāi)關(guān)Cache引發(fā)的新問(wèn)題

在Cache開(kāi)關(guān)期間,如果有另一個(gè)進(jìn)程/任務(wù)訪(fǎng)問(wèn)內存,在此期間寫(xiě)內存并且該內存在Cache中已有映射(,它也是被禁止Cache的,所以它不會(huì )同時(shí)更新Cache數據區的內容),那么在Cache重新使能之后Cache數據區的信息已經(jīng)過(guò)時(shí)了,而Cache映射表還是Cache禁止之前的狀態(tài),如果CPU此時(shí)讀數據就會(huì )得到過(guò)時(shí)的數據。這樣看來(lái),引發(fā)的問(wèn)題范圍更廣了,連內存的數據讀寫(xiě)正確性都無(wú)法保證。與內存泄漏的影響來(lái)比較,內存泄漏如果是一顆定時(shí)炸彈,那么Cache問(wèn)題就可以說(shuō)是隨時(shí)隨地都可能踩上的雷區,因為程序一旦開(kāi)始就可能引發(fā)爆炸。

如圖2所示,Cache使能時(shí)Cache映射表和Cache數據區保存了內存的數據信息,這是CPU訪(fǎng)問(wèn)內存時(shí)通過(guò)圖中實(shí)線(xiàn)箭頭通路實(shí)現的。內存的信息可以與Cache的信息保持一致。



Cache禁止時(shí)的情況有所變化。由圖2中虛線(xiàn)箭頭通路直接進(jìn)行內存訪(fǎng)問(wèn),且地址0x00處的數據由55變?yōu)锳A,但Cache區的信息仍為之前的狀態(tài)。很明顯,Cache的數據是應該廢棄的,但是Cache映射表仍保存0x00的地址信息。Cache重新使能后,CPU再次讀取0x00地址的數據,由于Cache仍是命中,直接從Cache數據區中提取數據,這樣讀出來(lái)的數據就是0x55了。

由S3C4510B數據手冊第4節的第21頁(yè)可知:通過(guò)對SYSCFG寄存器的CE位置1或清0可使能/關(guān)閉Cache,但是Cache沒(méi)有內容自動(dòng)刷新功能,在重新使能Cache時(shí)需考慮Cache數據的正確性。

為了證實(shí)以上說(shuō)法,循環(huán)執行如下測試程序:

linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)

上一頁(yè) 1 2 下一頁(yè)

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>