新聞中心

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

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

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

        本文引用地址:http://www.104case.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

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




        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 沾化县| 根河市| 巫溪县| 公安县| 星座| 溧阳市| 湘潭县| 内黄县| 安仁县| 陇南市| 永川市| 嫩江县| 台中县| 自贡市| 杭州市| 新和县| 石城县| 阿拉尔市| 麻城市| 汉沽区| 晴隆县| 盘山县| 松阳县| 彭州市| 合阳县| 锡林浩特市| 湟中县| 平利县| 乌恰县| 普定县| 九寨沟县| 峨山| 彝良县| 花垣县| 四平市| 锦屏县| 澄迈县| 修文县| 海城市| 天祝| 宿松县|