嵌入式編程需注意的Cache機制及其原理
如果沒(méi)有Cache的影響,結果應該是55 aa aa??梢?jiàn),Cache關(guān)閉再打開(kāi)的確可造成Cache數據過(guò)時(shí)。
3其他CPU解決方案
Atmel公司的AT91RM9200和Samsung公司的S3C44B0,用這兩種CPU先后移植過(guò)操作系統,且在對外設訪(fǎng)問(wèn)的整個(gè)過(guò)程中Cache都是使能的。它們的解決方案是什么呢?
AT91RM9200是ARM9系列帶有MMU的CPU。MMU對內存有分頁(yè)管理功能,可以實(shí)現多個(gè)進(jìn)程的內存空間保護。Cache是通過(guò)MMU管理的,這也是Cache和MMU經(jīng)常同時(shí)存在的原因。
S3C44B0和S3C4510B同樣都是Samsung公司產(chǎn)品,并且都不帶MMU。與S3CA510不同的是,S3C4480自帶的SFR可以配置非緩存范圍,即使Cache使能,所設置范圍的地址空間訪(fǎng)問(wèn)也不通過(guò)Cache實(shí)現。這樣,可以很方便地實(shí)現內存是緩存區,其他外設是非緩存區。
這兩種方案對于S3C4510B都無(wú)法實(shí)現。網(wǎng)絡(luò )上有人用volatile關(guān)鍵字解決外設訪(fǎng)問(wèn)問(wèn)題。volatile關(guān)鍵字是在源代碼中給編譯器看的,它可能影響編譯器的編譯結果,但是最終CPU執行都體現到匯編語(yǔ)句,如果匯編語(yǔ)句都不能解決Cache問(wèn)題,volatile語(yǔ)句也是不可能解決的。
對于易變數據的外設使用volatile關(guān)鍵字是應該的,可避免編譯器的優(yōu)化,比如以下語(yǔ)句:

在兩次讀取portAdd地址的數據相同時(shí)等待,可以用到等待信號跳變的程序。如果將volatile關(guān)鍵字去除,有可能經(jīng)編譯器優(yōu)化,Value2不會(huì )從實(shí)際的portAdd地址讀取數據,而是利用Valuel讀取語(yǔ)句的中間寄存器直接獲得。
4 本文解決方案
由S3C4510B手冊上第5節的第4頁(yè)可知,可以通過(guò)兩種方式保證Cache數據的正確:
①對Cache映射表的Tag RAM數據清零。Cache映射表數據一般是通過(guò)上電復位清零的,如果Cache或內存段的設置被修改,則會(huì )造成Cache映射表數據廢棄,這時(shí)就需要通過(guò)程序對Cache映射表數據清0。
②S3C4510B提供非Cache方式訪(fǎng)問(wèn)控制位,控制位ADDR[26](地址線(xiàn)26位)為“1”時(shí),按非Cache方式訪(fǎng)問(wèn)。因此,Cache使能的情況下,地址0x000 0000~0x3FFFFFF按Cache方式訪(fǎng)問(wèn),而0x400 0000~0x7FF FFFF按非Cache方式訪(fǎng)問(wèn)。實(shí)際上,0x000 0000+offset與0x400 0000+offset(offset在0x000 0000~0X3FF FFFF之間)是同一地址,不同的是Cache是否起作用。
可以得到兩種解決方案:
(1)Cache映射表手動(dòng)更新 既然在開(kāi)關(guān)Cache之后內容過(guò)時(shí),并且CPU不會(huì )自動(dòng)刷新,可以通過(guò)手動(dòng)更新的辦法來(lái)拋棄廢舊信息。也就是說(shuō),將Tag RAM區(前面所說(shuō)的Cache映射表)清除,這樣所有Cache數據區的內容都不使能,再次讀取數據時(shí)同時(shí)更新Cache映射表和Cache數據區內容,之后才能使用。清除操作將Tag RAM的1 KB內容清零,需要消耗一定時(shí)間;并且這樣操作后Cache是0命中率的,只有一定訪(fǎng)問(wèn)次數后Cache信息重新填滿(mǎn),才能恢復正常的命中率。因此,頻繁地開(kāi)關(guān)Cache時(shí)采用這種方案是不可取的。
(2)bit26位控制Cache使能
S3C4510B的地址線(xiàn)為26位(bit0~bit25),實(shí)際上CPU可訪(fǎng)問(wèn)空間為32位(bit0~bit31)。一般我們都不使用bit26~bit31,不過(guò)S3C4510B的這些位有著(zhù)特殊的控制功能。通過(guò)bit26的高電平可以禁止該地址的Cache功能,因此將外設的地址由原來(lái)的ADDR_PORT改為(ADDR PORTO(126)),就可以實(shí)現外設訪(fǎng)問(wèn)時(shí)Cache不使能。這樣就不用改為SYSCFG的Cache使能控制位。比較來(lái)看,SYSCFG的Cache使能位是控制整個(gè)CPU訪(fǎng)問(wèn)的Cache使能與否,而bit26只控制當前訪(fǎng)問(wèn)的一個(gè)具體地址的Cache使能與否。采用這種解決方案理論上有依據,并且可以最大程度發(fā)揮CPU的功能。
5 修改程序后的試驗結果
修改Cache解決方案后,可以解決內存訪(fǎng)問(wèn)錯誤的問(wèn)題。經(jīng)過(guò)測試,采用“bit26位控制Cache使能”的方案可以順利訪(fǎng)問(wèn)外設,代碼執行始終是在Cache使能的情況下,并且不影響內存數據。若完全關(guān)閉Cache的程序,執行同樣代碼需要花費5~8倍的時(shí)間。本文引用地址:http://dyxdggzs.com/article/157381.htm linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)
評論