vuywsdfwf 发表于 2018-7-31 06:15
L1D, L1P也是按照高地址来划分的,在下面的文档里有说明。
L1P cache converts memory from RAM to cache by starting at the top of the L1P memory map and working downwards.
在对C6748程序尝试优化处理时,发现官方C6748_StarterWare_1_20_04_01 system_configc674xcache.c内函数CacheEnable实现由异常。
原型:void CacheEnable (unsigned int memCfg)
实例:CacheEnable(L1PCFG_L1PMODE_32K | L1DCFG_L1DMODE_32K | L2CFG_L2MODE_0K);
其中宏定义:
L1PCFG_L1PMODE_32K:(0x4 << (((0x1 << 0) >> 1) * 4))
L1DCFG_L1DMODE_32K:(0x4 << (((0x1 << 1) >> 1) * 4))
L2CFG_L2MODE_32K:(0x4 << (((0x1 << 2) >> 1) * 4))
可以观察到CacheEnable输入参数memCfg实际为L1P,L1D与L2三者CACHE配置参数的拼接字,具体如下:
memCfg[3:0]为L1P的CACHE配置参数;
memCfg[7:4]为L1D的CACHE配置参数;
memCfg[11:8]为L2的CACHE配置参数;
原函数实现如下图(L1D的配置处理),红色椭圆部分宏定义DSPCACHE_L1DCFG_L1DMODE为0x7,导致配置给L1DCFG寄存器的实际为memCfg中L1P部分。类似的,在L2配置中存在相同问题。
经过分析是缺少移位操作,做如下调整后可修正。