當(dāng)前位置:首頁(yè) > 通信技術(shù) > 通信技術(shù)
[導(dǎo)讀]1 Cache的原理 Cache即高速緩存,它的出現(xiàn)基于兩種因素:一、CPU的速度和性能提高很快,而主存速度較低且價(jià)格高;二、程序執(zhí)行的局部性特點(diǎn)。將速度較快而容量有限的SRAM構(gòu)成Cache,可以盡可能發(fā)揮CPU的高速度。

1 Cache的原理 

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

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



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

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

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

2 嵌入式編程時(shí)需注意的問(wèn)題

2.1 訪問(wèn)外設(shè)使用Cache的問(wèn)題

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

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

S3C4510B的SYSCFG SFR(特殊功能寄存器)有用來(lái)控制Cache使能或不使能的,通過(guò)對(duì)該SFR的設(shè)置可暫時(shí)禁止Cache或重新恢復(fù)Cache功能。這樣就可以在讀取外設(shè)前禁止Cache,讀取結(jié)束后重新使能Cache,保證了外設(shè)數(shù)據(jù)讀取的正確性。寫(xiě)數(shù)據(jù)到外設(shè)時(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ù)訪問(wèn)內(nèi)存,在此期間寫(xiě)內(nèi)存并且該內(nèi)存在Cache中已有映射(注意,它也是被禁止Cache的,所以它不會(huì)同時(shí)更新Cache數(shù)據(jù)區(qū)的內(nèi)容),那么在Cache重新使能之后Cache數(shù)據(jù)區(qū)的信息已經(jīng)過(guò)時(shí)了,而Cache映射表還是Cache禁止之前的狀態(tài),如果CPU此時(shí)讀數(shù)據(jù)就會(huì)得到過(guò)時(shí)的數(shù)據(jù)。這樣看來(lái),引發(fā)的問(wèn)題范圍更廣了,連內(nèi)存的數(shù)據(jù)讀寫(xiě)正確性都無(wú)法保證。與內(nèi)存泄漏的影響來(lái)比較,內(nèi)存泄漏如果是一顆定時(shí)炸彈,那么Cache問(wèn)題就可以說(shuō)是隨時(shí)隨地都可能踩上的雷區(qū),因?yàn)槌绦蛞坏╅_(kāi)始就可能引發(fā)爆炸。

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



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

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

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


如果沒(méi)有Cache的影響,結(jié)果應(yīng)該是55 aa aa。可見(jiàn),Cache關(guān)閉再打開(kāi)的確可造成Cache數(shù)據(jù)過(guò)時(shí)。

3 其他CPU解決方案

Atmel公司的AT91RM9200和Samsung公司的S3C44B0,用這兩種CPU先后移植過(guò)操作系統(tǒng),且在對(duì)外設(shè)訪問(wèn)的整個(gè)過(guò)程中Cache都是使能的。它們的解決方案是什么呢?

AT91RM9200是ARM9系列帶有MMU的CPU。MMU對(duì)內(nèi)存有分頁(yè)管理功能,可以實(shí)現(xiàn)多個(gè)進(jìn)程的內(nèi)存空間保護(hù)。Cache是通過(guò)MMU管理的,這也是Cache和MMU經(jīng)常同時(shí)存在的原因。

S3C44B0和S3C4510B同樣都是Samsung公司產(chǎn)品,并且都不帶MMU。與S3CA510不同的是,S3C4480自帶的SFR可以配置非緩存范圍,即使Cache使能,所設(shè)置范圍的地址空間訪問(wèn)也不通過(guò)Cache實(shí)現(xiàn)。這樣,可以很方便地實(shí)現(xiàn)內(nèi)存是緩存區(qū),其他外設(shè)是非緩存區(qū)。

這兩種方案對(duì)于S3C4510B都無(wú)法實(shí)現(xiàn)。網(wǎng)絡(luò)上有人用volatile關(guān)鍵字解決外設(shè)訪問(wèn)問(wèn)題。volatile關(guān)鍵字是在源代碼中給編譯器看的,它可能影響編譯器的編譯結(jié)果,但是最終CPU執(zhí)行都體現(xiàn)到匯編語(yǔ)句,如果匯編語(yǔ)句都不能解決Cache問(wèn)題,volatile語(yǔ)句也是不可能解決的。 

對(duì)于易變數(shù)據(jù)的外設(shè)使用volatile關(guān)鍵字是應(yīng)該的,可避免編譯器的優(yōu)化,比如以下語(yǔ)句: 



在兩次讀取portAdd地址的數(shù)據(jù)相同時(shí)等待,可以用到等待信號(hào)跳變的程序。如果將volatile關(guān)鍵字去除,有可能經(jīng)編譯器優(yōu)化,Value2不會(huì)從實(shí)際的portAdd地址讀取數(shù)據(jù),而是利用Valuel讀取語(yǔ)句的中間寄存器直接獲得。

4 本文解決方案

由S3C4510B手冊(cè)上第5節(jié)的第4頁(yè)可知,可以通過(guò)兩種方式保證Cache數(shù)據(jù)的正確:

①對(duì)Cache映射表的Tag RAM數(shù)據(jù)清零。Cache映射表數(shù)據(jù)一般是通過(guò)上電復(fù)位清零的,如果Cache或內(nèi)存段的設(shè)置被修改,則會(huì)造成Cache映射表數(shù)據(jù)廢棄,這時(shí)就需要通過(guò)程序?qū)ache映射表數(shù)據(jù)清0。 

②S3C4510B提供非Cache方式訪問(wèn)控制位,控制位ADDR[26](地址線26位)為“1”時(shí),按非Cache方式訪問(wèn)。因此,Cache使能的情況下,地址0x000 0000~0x3FFFFFF按Cache方式訪問(wèn),而0x400 0000~0x7FF FFFF按非Cache方式訪問(wèn)。實(shí)際上,0x000 0000+offset與0x400 0000+offset(offset在0x000 0000~0X3FF FFFF之間)是同一地址,不同的是Cache是否起作用。 

可以得到兩種解決方案: 

(1)Cache映射表手動(dòng)更新  既然在開(kāi)關(guān)Cache之后內(nèi)容過(guò)時(shí),并且CPU不會(huì)自動(dòng)刷新,可以通過(guò)手動(dòng)更新的辦法來(lái)拋棄廢舊信息。也就是說(shuō),將Tag RAM區(qū)(前面所說(shuō)的Cache映射表)清除,這樣所有Cache數(shù)據(jù)區(qū)的內(nèi)容都不使能,再次讀取數(shù)據(jù)時(shí)同時(shí)更新Cache映射表和Cache數(shù)據(jù)區(qū)內(nèi)容,之后才能使用。清除操作將Tag RAM的1 KB內(nèi)容清零,需要消耗一定時(shí)間;并且這樣操作后Cache是0命中率的,只有一定訪問(wèn)次數(shù)后Cache信息重新填滿,才能恢復(fù)正常的命中率。因此,頻繁地開(kāi)關(guān)Cache時(shí)采用這種方案是不可取的。

(2)bit26位控制Cache使能

S3C4510B的地址線為26位(bit0~bit25),實(shí)際上CPU可訪問(wèn)空間為32位(bit0~bit31)。一般我們都不使用bit26~bit31,不過(guò)S3C4510B的這些位有著特殊的控制功能。通過(guò)bit26的高電平可以禁止該地址的Cache功能,因此將外設(shè)的地址由原來(lái)的ADDR_PORT改為(ADDR PORT∣(1<<26)),就可以實(shí)現(xiàn)外設(shè)訪問(wèn)時(shí)Cache不使能。這樣就不用改為SYSCFG的Cache使能控制位。比較來(lái)看,SYSCFG的Cache使能位是控制整個(gè)CPU訪問(wèn)的Cache使能與否,而bit26只控制當(dāng)前訪問(wèn)的一個(gè)具體地址的Cache使能與否。采用這種解決方案理論上有依據(jù),并且可以最大程度發(fā)揮CPU的功能。

5 修改程序后的試驗(yàn)結(jié)果

修改Cache解決方案后,可以解決內(nèi)存訪問(wèn)錯(cuò)誤的問(wèn)題。經(jīng)過(guò)測(cè)試,采用&ldquo;bit26位控制Cache使能&rdquo;的方案可以順利訪問(wèn)外設(shè),代碼執(zhí)行始終是在Cache使能的情況下,并且不影響內(nèi)存數(shù)據(jù)。若完全關(guān)閉Cache的程序,執(zhí)行同樣代碼需要花費(fèi)5~8倍的時(shí)間。

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

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開(kāi)發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉