li a2, CFG_CACHE_LINE_SIZE /*16K*/
/* kseg0 mem address 这里就跟注释不一样,这里给的是物理地址啊,书上用的都是虚拟地址*/
li a1, 0
/* total number of lines */
li a3, CFG_CACHE_LINE_NO * CFG_CACHE_NO_WAYS /*4路 128行*/
1:
/* store tag (invalid, not locked) */
cache 0x8, 0(a1) /*第二个不懂的地方为什么用0x8 index_Store_tag_I I CACHE前面有初始化代码啊*/
cache 0x9, 0(a1) /*这里是第一轮D cache clear tag 顺便说一下tag那几个cp0寄存器最前面已经清0了*/
add a3, -1
bne a3, zero, 1b
add a1, a2
mfc0 a0, CP0_ECC
li a1, ECC_WST
or a0, a1
mtc0 a0, CP0_ECC
li a0, K0BASE
move a2, t3 # dcacheSize
move a3, t5 # dcacheLineSize
move a1, a2
CACHEOP(a0,a1,a2,a3,Index_Store_Tag_D)
/*
宏定义LOOP 相当于
for(addr-kseg0;addr
Index_Store_Tag_D(addr)
*/
/* Clear WST bit */
mfc0 a0, CP0_ECC
li a1, ~ECC_WST
and a0, a1
mtc0 a0, CP0_ECC
到这里为止DCACHE初始化就完成了。
这一段就是我不明白的第三个部分,书上说2路组相连由于怕对同一路初始化了两次所以需要用一个junk循环来miss D cache
for(addr-kseg0;addr
junk=*addr
还有就是用点灯判断,在开了CACHE后执行一条从0x90000000地址读东西的指令后就会死掉。如果开CACHE并用0xb0000000的flash地址后正确执行到vxworks shell起来后输入个d 0x90000000 的shell命令,结果这样:
-> d 0x90000000
90000000:
Data bus error
Exception Program Counter: 0x8008778c
Status Register: 0x0000ff01
Cause Register: 0x0000001c
Error address: 0xffffffff, Error ID: 0x0000
/* cache line size */
li a2, CFG_CACHE_LINE_SIZE
/* kseg0 mem address */
li a1, 0
/* total number of lines */
li a3, CFG_CACHE_LINE_NO * CFG_CACHE_NO_WAYS
1:
/* store tag (invalid, not locked) */
cache 0x8, 0(a1)
cache 0x9, 0(a1)