ARM存儲器之:高速緩沖存儲器Cache
(2)指令Cache
當系統中采用分離的數據Cache和指令Cache時,下面的幾種情況可能造成指令不一致情況的發生。
①地址為A1的指令被預取,該指令的數據行被取到Cache中。
②和A1同在一個數據行的地址為A2的數據被一條存儲器寫操作修改。這個數據寫操作可能影響數據Cache中、寫緩存中和主存的地址為A2的存儲單元內容,但不影響指令Cache中地址為A2的存儲單元中的內容。
③如果地址A2存放的是指令,當該指令執行時,就可能發生指令不一致問題。如果地址A2所在的行還在指令Cache中,系統將執行修改前的指令;如果地址A2所在的行不在指令Cache中,地址將執行修改后的指令。
為了避免這種指令不一致的情況發生,要在地址A2的數據被修改前執行一些防護性的操作。也就是說,在步驟①和②之間插入下面必要的操作。
·如果系統中使用的數據、指令統一的Cache,程序跳到步驟②繼續執行。
·對于使用數據和指令分離Cache的系統,使指令Cache的內容無效。
·對于使用數據和指令分離Cache的系統,如果數據Cache是寫回類型的,清空數據Cache。
上述操作系列可作為一種標準,應用于一些典型的場合。
注意 | 當可執行文件加載到主存中后,在程序跳轉到入口點處開始執行之前,先執行上述操作序列,以保證新加載的可執行代碼正確執行。 |
(3)DMA造成的數據不一致
DMA操作直接訪問內存,不更新Cache和寫緩存區中相應內容,這樣就很可能造成數據不一致。
為了避免DMA造成的數據不統一,根據系統情況,執行下面操作的一種和幾種。
·將DMA訪問的存儲器設置成非緩存的
·將DMA訪問的存儲區所涉及的數據Cache中的行設置成無效,或者清空數據Cache。
·清空寫緩存區(將寫緩存區中延時操作全部執行)。
·在DMA訪問期間限制存儲器訪問DMA所訪問的存儲區域。
15.3.9Cache初始化子程序示例
下面給出了一段例子代碼,此代碼以ARM740T芯片為參考,顯示了Cache初始化的標準過程。
;下面代碼必須運行于處理器的特權模式下。
AREAINIT740,CODE,READONLY ;設置段屬性
ENTRY
EXPORTCache_Init ;以便作為子程序被其他程序使用
Cache_Init
;禁止MMU/MPU
;清理數據Cache
;
;
MRCp15,0,r0,c1,c0,0 ;讀CP15寄存器c1到r0
BICr0,r0,#0x1 ;清除bit[0]
MCRp15,0,r0,c1,c0,0 ;將設置的新值寫回
MOVr0,#0 ;準備禁止其他域
MCRp15,0,r0,c6,c1,0
MCRp15,0,r0,c6,c2,0
MCRp15,0,r0,c6,c3,0
MCRp15,0,r0,c6,c4,0
;MCRp15,0,r0,c6,c5,0
;MCRp15,0,r0,c6,c6,0
;MCRp15,0,r0,c6,c7,0
;
;區域0:背景區:從0x0地址開始的4GB存儲空間
;區域1:SRAM區:從0x0地址開始的0x4000字節存儲空間
;區域2:FLASH:從0x24000000開始的0x02000000字節存儲空間
;區域3:外設區:從0x10000000地址開始的0x10000000字節存儲空間
;開啟region0
MOVr0,#2_111111
MCRp15,0,r0,c6,c0,0 ;region0區域0
;開啟region1
MOVr0,#2_100011
MCRp15,0,r0,c6,c1,0 ;region1區域1
;開啟region2
LDRr0,=2_110001+0x24000000
MCRp15,0,r0,c6,c2,0 ;region2區域2
;開啟region3
LDRr0,=2_110111+0x10000000
MCRp15,0,r0,c6,c3,0 ;region3區域3
;開啟Cache/寫緩存
MOVr0,#2_0110
MCRp15,0,r0,c2,c0,0 ;Cache
MCRp15,0,r0,c3,c0,0 ;寫緩存
;開啟access允許
MOVr0,#2_11111100
MCRp15,0,r0,c5,c0,0 ;允許訪問
;
;設置全局配置
;
MRCp15,0,r0,c1,c0,0 ;讀CP15寄存器到r0
ORRr0,r0,#(0x12) ;開啟Cache
ORRr0,r0,#0x1 ;開啟MPU
存儲器相關文章:存儲器原理
評論