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.

c6424 L2缓存设置问题

Other Parts Discussed in Thread: TMS320C6424

想把L2空间一部分设置成缓存,缓存大小为64kb,把DDR上最开始的16M设置成cacheable,我是这样配置的:L2CFG=0x2h;L2INV=1;MAR128=0XFFFFFFFFh;不知这样有没有问题。

我的问题是这样的:

1.不知道L2INV作用是什么,最低位设置成0和1的作用是什么?这点我没有没有看懂文档。

2.我知道要把MAR128寄存器的某个位设置成1,地址8000 0000h~80FF FFFFh区间才会成为cacheable,但不知道应该是哪一位,所以索性把MAR128=0XFFFFFFFFh。请高手指点迷津,给个文档链接。

3.缓存设成了64kb,不太清楚缓存使用了L2空间的哪一部分?是默认采用L2高位地址还是L2地位地址区间或者其他,不甚明了。

等候高手解答。thanks。

  • 这篇文档里有很好的解释:http://www.ti.com/litv/pdf/spru862b

    #1. 就是清一下Cache.

    #2. 最低位。(http://www.ti.com/litv/pdf/spru871k

    #3. 高地址(数字大的)是Cache, L2地址开始部分是RAM。

  • L2INV我还是不太明白。

    文档上说L2INV的最低位:

    0~代表 “normal operation”,

    1~代表“All L2 cache lines are invalidated.”

    我的理解是,“0”时,L2正常缓存外存的内容;“1”时,L2就不再缓存外存的数据,相当于外存的内容跳过L2直接进入L1缓存和DSP内核。

    你能给分别解释下0和1代表的含义不?另外我咋使用这个寄存器?thank you。

  • 你好 Tony Tang,非常感谢你的回答。

    但是L2INV我还是不太明白。

    文档上说L2INV的最低位:

    0~代表 “normal operation”,

    1~代表“All L2 cache lines are invalidated.”

    我的理解是,“0”时,L2正常缓存外存的内容;“1”时,L2就不再缓存外存的数据,相当于外存的内容跳过L2直接进入L1缓存和DSP内核。

    你能给分别解释下0和1代表的含义不?另外我咋使用这个寄存器?thank you。

  • #1. 首先要理解在使用Cache时,什么时候需要做Cache与物理内存的同步。这部分如果不明白我们可以再解释。

    #2. Cache 同步分为4种:

    Write back: 将Cache中更新的内容,写回到物理内存上,这样才可以确保第三方master读取物理内存时是更新过的数据。

     Write back and invalid: 先write back,再将指定内存空间的地址在Cache中清除。

    invalid: 将指定内存空间的地址在Cache中清除。

    invalid All:将Cache中所有地址记录清除。(0:即不操作,1:清除所有),相信明白了#1,就知道何时采用何种同步方式。

    Invalid不是Disable,所以后续的访问继续会Cache。

     

  • thank you,Tony Tang.非常感谢你详细的回答。

    我还有两事不明。

    1.在编写程序时,当某一个计算(比如是对一个大数组的处理)完成时,就需要一个命令把数据从缓存写回到内存,此时可以指定cache 为invalid或者不指定invalid,不知道是不是这样?(是不是也可以解释我以前程序的一个错误:以前我只在程序开头配置了一下缓存,程序中间过程没有对缓存做任何处理,也就是说中间所有的数据都没有写回,因此造成了一些 “中间结果及最终结果”的错误)

    2.当数据处理步骤非常多时,好像不停的写回比较麻烦,是不是这本来就很麻烦,没有捷径?

    《TMS320C64x+ DSP Cache User's Guide》这个文档我研究的还不是很仔细,还要再看看。以后希望有不会的地方再请教您。

    非常感谢你的回答。

  • #1. 要看这个数组是否被其它master访问,比如被EDMA搬到其它地方。如果只是CPU在访问这个数组,就不需要做写回操作。

    #2. 同上,只有当系统中有其它master在访问同一个数组时,才需要考虑做Cache同步操作。简单来说,CPU处理数组,结果在Cache中,如果其它master访问此数组,则可能访问的结果是未处理的原始数据。

  •  To Tony Tang,

    非常感谢你的解释。

  • Tony Tang 你好,
    看了这三个文档后,
    【1】《TMS320C6424.pdf》
    【2】《TMS320C64x+ DSP Megamodule Reference Guide》缓存部分
    【3】《TMS320C64x+ DSP Cache User's guide》全文
    依然不太会配置缓存,希望得到你的指教。问题有些多哈。
    我用的是C6424芯片,c6424的L1P、L1D、L2地址映射如下(L1P、L1D、L2都分为两大部分):
    /*********************************************/
    start end size
    0x0080 0000 0x0081 FFFF 128K L2 RAM/Cache
    0x00E0 8000 0x00E0 FFFF 32K L1P RAM/Cache
    0x00F0 4000 0x00F0 FFFF 48K L1D RAM
    0x00F1 0000 0x00F1 7FFF 32K L1D RAM/Cache

    0x1080 0000 0x1081 FFFF 128K L2 RAM/Cache
    0x10E0 8000 0x10E0 FFFF 32K L1P RAM/Cache
    0x10F0 4000 0x10F0 FFFF 48K L1D RAM
    0x10F1 0000 0x10F1 7FFF 32K L1D RAM/Cache
    /*******************************************/
    我的问题如下:
    问题1:为什么L1P、L1D、L2分了这么多部分?是不是每一部分都可以使用?我试了下,应该没一部分都可以使用,但是如果把程序、数据放到L1P/L1D/L2上,程序总是跑飞,不知道配置时有什么主意事项?
    问题2:对于c6424,设置缓存大小时,cache在高地址、RAM在低地址,如果我配置L1P cache=16KB、L1D cache为16KB、L2 cache为32KB,cache的地址应该是哪一部分(上面的地址区间太多了)?然后我就可以把剩下的memory配置到cmd文件中。
    问题3:另外是先在cmd中配置RAM大小(放程序和数据,且main函数配置的cache地址和cmd中的地址不冲突),然后在main函数中利用没有使用的空间配置cache吗?
    问题4:L1P cache默认大小是多少?起始地址应该是什么呢?
    问题5:L1D cache不在main函数中配置,也能缓存L2和external memory 的程序,和文档【3】不符啊,不知道为什么?
    问题6:这样配置不知道有没有问题?配置如下:
    (L1P、L1D、L2是我定义的int类型数据,因为在文档【3】27页中,有“Read back L1PCFG. This stalls the CPU until the mode change completes.”不太理解,就这样配置了)
    /****************************************************/
    void main( void )
    {
    extern Int16 EVM6424_init();
    EVM6424_init(); //CPU Init

    CACHE_L1PCFG = 0x00000003; // L1P on,
    L1P = CACHE_L1PCFG;
    CACHE_L1PINV = 1; // 1->L1P invalidated

    CACHE_L1DCFG = 0x00000003; // L1D on,
    L1D = CACHE_L1DCFG;
    CACHE_L1DINV = 1; // L1D invalidated


    CACHE_L2CFG = 0x00000004; // 0-cache disabled;1-32k;2-64kb;3-128kb;4-256kb;5~7-maxinum cache
    L2 = CACHE_L2CFG;
    CACHE_L2INV = 1; //1- all L2 cache lines are invalidated, 0-normal operation

    MAR_128=0xFFFFFFFF;
    ......(以下代码省略)
    /*************************************************/
    问题7:请问哪里可以找到cache配置的例程?光看文档也不是很清楚咋配置,急切需要一些例子。
    问题8:由于内存分配或者stack溢出而出现的程序跑飞怎么排查?(这个问题好像有点大了)


    以上问题有些多,回答起来肯定比较麻烦,还是希望您百忙之中给予解答,非常感谢!
    最后,您能不能给我一个您的邮箱,有些截图我无法放当这个帖子中,希望能发邮件给你,Thank you!