詳解s3c44b0 cpu 8K cache SRAM的初始化
s3c44b0_flush_cache()函數就這么幾行,代碼如下:
static void s3c44b0_flush_cache(void)
{
volatile int i;
/* flush cycle */
for(i=0x10002000;i0x10004800;i+=16)
{
*((int *)i)=0x0;
}
}
首先莫名的是:計數用的變量i要用volatile來(lái)修飾!也許這就是arm或說(shuō)是嵌入式或說(shuō)是基于硬件的C程序與基于PC的C程序不同之處吧。加volatile是為了防止編譯器把i給合諧掉然后就是賦值句*((int *)i)=0x0:這個(gè)對寫(xiě)過(guò)或是看過(guò)arm程序的都知道吧,不解釋。
關(guān)鍵在于for(i=0x10002000;i0x10004800;i+=16)參看s3c44b0手冊,cache set0:3地址是0x1000000~0x10002000;cache tag0:3+LRU地址是0x10002000~0x10004800。剛開(kāi)始以為刷新cache是要向cache set0:3寫(xiě)0,而其實(shí)應該向且cache tag0:3+LRU空間寫(xiě)入0來(lái)刷新cache。有點(diǎn)意思的是:cache tag和LRU RAM寫(xiě)入的地址。(參看s3c44b0手冊關(guān)于cache tag部分)由于cache tag和LRU RAM是16字節讀寫(xiě)的,故i的增加應該是以16為單位的。
接下來(lái)是設置非緩沖區范圍。
NCACHBE0 = 0xC0000000;
NCACHBE1 = 0x00000000;
完全依據程序員個(gè)人主觀(guān),呵呵 當然是要好的想法:比如不應該把IO地址放入緩沖區,而應該把它放入非緩沖區;不應該不把SDRAM放入非緩沖區,而應該放入緩沖區。所以,這里把除SDRAM地址外的所有映射地址做為非緩沖區。然后依據地址設置NCACHBE0和NCACHBE1。NCACHBE0在在這里是有用的,高地址為0x0c000000,低地址為0x00000000;而 NCACHBE1可以理解為不用它,所以起始和終止地址都設為0
在設置完之后就只要開(kāi)啟cpu cache功能就可以。
reg = SYSCFG;
reg |= 0x00000006; /* 8kB */
SYSCFG = reg;
當然,堅持一慣的風(fēng)格,操作SYSCFG寄存器方式為:讀---操作---回寫(xiě)。這里把8K內部RAM全作為cache
除了s3c44b0_flush_cache()外,其他都很簡(jiǎn)單,呵呵 不是嗎
評論