Tricore的cache使用仿真实验--Apple的学习笔记
一,前言
理论需要结合实际,这样可以验证对理论的理解是否正确,形成闭环。关于Tricore Memory及访问速度--Apple的学习笔记已经完成了初步的理论理解,所以接着就是做实验及再进行深入的理解。
二,带着问题来看的芯片手册
问题1,Dcache如何设置使能?
答:芯片手册上没找到清晰的步骤描述,我直接example参考代码是有的。
问题2,Dcache的地址段在哪里?
答:手册上可以清晰的找到。
image.png
问题3,某个变量对应的cache地址我怎么才能知道?
答:首先我想到的是类似Linux中的MMU的TBL表作为对应规则,这是猜测的。按计算机组成原理cache和主存有3种地址映射方式(全相关,直接映射,组相关)。但是芯片手册就看到块大小为256字节。具体地址映射规则之后需要研究下。
问题4,coreID怎么有6的,5号没有的?
答:看上去确实是这样,另外CoreID及对应的base地址。这样一看就能背出来,而之前看memoryMap的表内容太多反而记不住重点。下图有利于记忆,很棒。
image.png
三,实验:拿mcal的example代码来调试cache
注释掉原有的example功能,自己添加测试代码。
在如下有bypass的宏定义可以设置值,等于先不开cache。将值写特殊功能寄存器PCON。然后main函数的while(1)循环中添加1000字节数组赋值,然后读取到另外的数组中。
/* Enable/ Disable the caches depending on the configuration. At this point cache are invalidated */
{
Ifx_CPU_PCON0 pcon0;
pcon0.U = 0;
pcon0.B.PCBYP = IFX_CFG_SSW_ENABLE_TRICORE0_PCACHE ? 0 : 1; /* depending on the enable bypass bit is reset/set */
Ifx_Ssw_MTCR(CPU_PCON0, pcon0.U);
Ifx_Ssw_ISYNC();
}
{
Ifx_CPU_DCON0 dcon0;
dcon0.U = 0;
dcon0.B.DCBYP = IFX_CFG_SSW_ENABLE_TRICORE0_DCACHE ? 0 : 1; /* depending on the enable bypass bit is reset/set */
Ifx_Ssw_MTCR(CPU_DCON0, dcon0.U);
Ifx_Ssw_ISYNC();
}
编译后数组的默认地址是core0的DSPR。
打开Dache。定义变量到cache段。编译后看到数组testval保存在了segment8就是0x90000000开始的带cache段。
0x70000000 0x700007cf 2000 g testRead dsram0 .CPU0.bss .bss Objs/Cpu0_Main.o
0x90000000 0x900007cf 2000 g testval cpu0_dlmu .mycache .mycache Objs/Cpu0_Main.o
打开DCON0设置了使能DCACHE。到DCACHE的地址段0xD0000000开始查看到值。说明cache开始使用了。实验成功。
补充说明:但是我又关闭了cache,仅设置DCON0,居然0xD0000000也有数据。这个后续研究,这个cache开关寄存器的理解估计有误。
四,小结
至少cache我可以观察到数据了,又有了进一步的认知,但是还有2个问题,就是cache的映射规则和cache的开关寄存器控制,之后要继续研究下,也可能我是sim仿真所以效果不真实。