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.

C6670的DDR读入cache问题

定义的外部变量#pragma DATA_SECTION(SucceedFlag, ".externalMEM");  int SucceedFlag[3]; 在core0上使用CACHE_wbL2( SucceedFlag,3*sizeof(int),CACHE_WAIT)将cache的数值存入DDR后,外部变量声明过了。在core1,core2,core3核上无法将SucceedFlag从DDR中读入cache,使用CACHE_invL2(SucceedFlag,3*sizeof(int),CACHE_WAIT)语句也不可以。

请问这个问题如何解决?

  • 无法读入是什么意思?访问不了还是值不对,如果值不对,那这三个核看到的值是一样的吗?你可以接仿真器看看这个具体地址。

    另外多核同步的flag最好是放到非cache的区域会更方便些。

  • 你好,我们用的是外部变量,DDR上的数据传过去啦,就是cache读不出来,该怎么解决呢?

  • 对于你这种多核通过共享标志位的方式,建议将共享标志所在memory定义为non cacheable,这样就不需要维护cache一致性。

    如果所在memory cacheable,则需要保证地址及长度cache line对齐,即128B对齐,然后在写完之后需要write back L2 cache,在读之前需要invalid L2 cache。

  • 我也与遇到了该问题,请问128B对齐是指128字节对齐吗,还有就是如何把memory设置成 non cacheable?

  • 你好,如果改为non cacheable,标志位的数值是正确啦,但是以标志位为条件的判断从核的运行就会慢,也就是说从核会多运行的好多次上一个标志位数值的函数,请问怎么解决?感觉从核貌似好长时间才能意识到标志位数值的改变

  • 只是一个标志放在non cache并不会对代码的性能产生影响。

    如果一定要设为cache enable,上面已经说了如何维护cache一致性保证数据的读写可靠。

    设置为non cache的方法是配置相应的memory attribute寄存器中的相应bit,可查看corepac手册中关于MAR寄存器的描述,在STK中所以测试例子main函数入口都会对MAR进行配置。

    STK:http://www.deyisupport.com/question_answer/dsp_arm/c6000_multicore/f/53/t/47664.aspx

  • 从核从memory读入数据为什么很慢...我空跑了好长的时间才能读到?即使是改成non cache,也是同样的~~

    定义成外部变量128B对齐是不是下面这样的?

    #pragma DATA_SECTION(SucceedFlag, ".externalMEM");
    int SucceedFlag[3];//三个捕获成功标志
    #pragma DATA_ALIGN(SucceedFlag,CACHE_L2_LINESIZE);//128B对齐

    还是下面这样的?

    #pragma DATA_SECTION(SucceedFlag, ".externalMEM");
    int SucceedFlag[3*CACHE_L2_LINESIZE/sizeof(int)];//三个捕获成功标志
    #pragma DATA_ALIGN(SucceedFlag,CACHE_L2_LINESIZE);//128B对齐

  • 各个DSP读写shared memory的效率是一样的,你说的读入数据很慢应该跟你的软件有关,把读数的代码发上来看看。

    长度和地址都最好128byte对齐。

  • thank you!终于发现..还是自己的多个msgQ的时序搞错啦~~