新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 詳解s3c44b0 cpu 8K cache SRAM的初始化

        詳解s3c44b0 cpu 8K cache SRAM的初始化

        作者: 時間:2012-08-31 來源:網絡 收藏
        關于的cpu內部8Kcache 問題。主要是因為cpu_init()調用了icache_enable()函數,而該函數又調用了_flush_cache()而引發的問題

         _flush_cache()函數就這么幾行,代碼如下:

        static void s3c44b0_flush_cache(void)
        {
        volatile int i;
        /* flush cycle */
        for(i=0x10002000;i0x10004800;i+=16)
        {
        *((int *)i)=0x0;
        }
        }

        首先莫名的是:計數用的變量i要用volatile來修飾!也許這就是arm或說是嵌入式或說是基于硬件的C程序與基于PC的C程序不同之處吧。加volatile是為了防止編譯器把i給合諧掉點擊瀏覽下一頁然后就是賦值句*((int *)i)=0x0:這個對寫過或是看過arm程序的都知道吧,不解釋。

        關鍵在于for(i=0x10002000;i0x10004800;i+=16)參看s3c44b0手冊,cache set0:3地址是0x1000000~0x10002000;cache tag0:3+LRU地址是0x10002000~0x10004800。剛開始以為刷新cache是要向cache set0:3寫0,而其實應該向且cache tag0:3+LRU空間寫入0來刷新cache。有點意思的是:cache tag和LRU RAM寫入的地址。(參看s3c44b0手冊關于cache tag部分)由于cache tag和LRU RAM是16字節讀寫的,故i的增加應該是以16為單位的。

        接下來是設置非緩沖區范圍。

        NCACHBE0 = 0xC0000000;
        NCACHBE1 = 0x00000000;

        完全依據程序員個人主觀,呵呵 當然是要好的想法:比如不應該把IO地址放入緩沖區,而應該把它放入非緩沖區;不應該不把SDRAM放入非緩沖區,而應該放入緩沖區。所以,這里把除SDRAM地址外的所有映射地址做為非緩沖區。然后依據地址設置NCACHBE0和NCACHBE1。NCACHBE0在在這里是有用的,高地址為0x0c000000,低地址為0x00000000;而 NCACHBE1可以理解為不用它,所以起始和終止地址都設為0

        在設置完之后就只要開啟cpu cache功能就可以。

        reg = SYSCFG;
        reg |= 0x00000006; /* 8kB */
        SYSCFG = reg;

        當然,堅持一慣的風格,操作SYSCFG寄存器方式為:讀---操作---回寫。這里把8K內部RAM全作為cache

        除了s3c44b0_flush_cache()外,其他都很簡單,呵呵 不是嗎



        關鍵詞: s3c44b0 SRAM 初始化

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 密山市| 深州市| 三台县| 南陵县| 通州市| 安宁市| 安阳市| 遵义县| 林甸县| 彭泽县| 德保县| 巫溪县| 广汉市| 思南县| 镇远县| 东兰县| 阳谷县| 汨罗市| 新余市| 武宣县| 孝感市| 泽州县| 永仁县| 仁化县| 定州市| 贵州省| 兰考县| 米泉市| 古丈县| 台南县| 谷城县| 南部县| 襄汾县| 六盘水市| 新巴尔虎左旗| 临夏市| 建德市| 马鞍山市| 南澳县| 崇州市| 郁南县|