久久ER99热精品一区二区-久久精品99国产精品日本-久久精品免费一区二区三区-久久综合九色综合欧美狠狠

新聞中心

EEPW首頁 > 嵌入式系統 > 設計應用 > ARM存儲器之:高速緩沖存儲器Cache

ARM存儲器之:高速緩沖存儲器Cache

作者: 時間:2013-09-30 來源:網絡 收藏

本文引用地址:http://cqxgywz.com/article/257011.htm

(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初始化子程序示例

下面給出了一段例子代碼,此代碼以740T芯片為參考,顯示了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

存儲器相關文章:存儲器原理




評論


相關推薦

技術專區

關閉