This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

C6748 L1P与L1D 的CACHE与SRAM地址划分

在TMS320C674x DSP Cache User's Guide内对L2的不同配置下CACHE与SRAM地址划分有介绍,如下图:

L2分配为cache的区间是从高地址来时的。

对应的L1D和L1P内CACHE与SRAM地址划分是按什么原则进行?

  • L1D, L1P也是按照高地址来划分的,在下面的文档里有说明。

    L1P cache converts memory from RAM to cache by starting at the top of the L1P memory map and working downwards.

     The L1D cache converts L1D memory to cache starting at the highest L1D memory address in L1D region 1 and working downwards.

    http://www.ti.com/lit/ug/sprufk5a/sprufk5a.pdf

  • 在对C6748程序尝试优化处理时,发现官方C6748_StarterWare_1_20_04_01\ system_config\c674x\cache.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配置中存在相同问题。

    经过分析是缺少移位操作,做如下调整后可修正。

  • L2部分也要做类似修改

  • StarterWare也不再更新了,这些bug真是大坑
  • 我以前推算过一回,好像是个bug,我建议用户直接配置寄存器,更加简单明了。