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.

c674x DSP一致性问题

Other Parts Discussed in Thread: SYSBIOS

Hello 您好,

C674x 开发算法,并进行优化。

数据从DDR3-->L2(SRAM,没有cache使能)-->DDR3.

所有的DDR3内存通过MARn cache使能。

数据从L2到DDR3的搬移都是通过EDMA3来实现。

当我将EDMA搬移变成memcpy()时,程序能得到正常的结果。

但是当用EDMA3进行数据搬移的时候,程序不能得到正常的运行结果。

因此,问题出现是与EDMA3,操作有关。

但是我单步跟踪EDMA3搬移程序,没有发现程序有问题。

因此我怀疑问题发生在由于EDMA3进行数据搬移时,cache的不一致性所致。


如何保持cache的一致性,在这样的数据流

DDR3(cached)-->L2(SRAM,没有cache使能)-->DDR3(cached).

是否能提供这方面的例子。

非常感谢!

BRS,
Meng

  • 感觉上面描述的有些不完全。DDR3上的buffer是不是CPU访问过,是在什么时候访问的,还有DDR3上的buffer的数据源是从哪里来的?我觉得问题在这里。

    cache一致性操作参考文档sprufk5a. MARn只是控制是否可被Cache,一致性维护要操作Cache的寄存器。

    还有L2是都配置成RAM了吗?还是部分Cache?

  • Hello Tony,

    DDR3上的buffer是在EDMA之前,算法处理的中间结果。

    L2 是部分是配置成SRAM,部分配置成了Cache。我用的部分是被配置成SRAM的,DDR3是被MARn 寄存器 cache使能。

    是的,我知道cache的控制需要自己L1P,L1D,L2控制寄存器来完成,MARn 只是将相应的DDR3段,设置成是否被L2 cache。

    如我下面代码段中,将DMA_transfer() 换成memcpy是没有任何问题的,DSP程序能正常工作,得到期望的结果,但是换成EDMA数据搬移,则不行。

    EDMA_transfer(),单步跟踪代码是没有任何问题,数据能正常传输。但是全速运行,就会出现问题。

    顺便问一下,L1p,L1D,L2 的cache操作,Cache_Inv(),Cache_Wb(),Cache_WbInv()操作对应的地址,是L1地址,L2地址 or DDR3的地址?

    下面是code,自己也写了cache操作函数(应该不正确)。

     附件fft_cache_functions.c是我写的cache代码,及包含DDR3-->L2-->DDR3的代码,请帮检查。

    非常感谢!

    BRS,

    Meng

  • Lingcon Meng 说:
    顺便问一下,L1p,L1D,L2 的cache操作,Cache_Inv(),Cache_Wb(),Cache_WbInv()操作对应的地址,是L1地址,L2地址 or DDR3的地址?

    是DDR的地址,Cache是没有地址的,Cache只是记录Cache了什么外部地址。

    从上面代码来看,是刚刚CPU对DDR3上的buffer tmpAddr0, tmpAddr1做了处理,就调用EDMA将之搬到L2,这时tmpAddr0/1的数据还在Cache里,所以搬到L2的数据有可能是没更新的,所以你的判断是正确的。

    这里只需要在上面Cache操作处加上Cache writeback and invalid操作即可。

    后面一个对L2的write back是什么意思?而且是在EDMA操作后调用的。


  • Hello Tony,

    非常感谢您的回复。

    也就是说所有的cache操作都是基于DDR的地址的,与L1,L2的具体地址没有关系。


    Tony:后面一个对L2的write back是什么意思?而且是在EDMA操作后调用的。

    EDMA数据搬移,将L2 SRAM的内容回写到DDR3。按照您的意思,应该地址参数是DDR地址,而不是L2的地址?


    那么我以前对cache_inv() 和 cache_wb()理解是有偏差的。

    因此我自己写的cache_Inv() 和 cache_wb()函数,是分别对L1P,L1D,L2来操作的,是有问题的。

    具体函数见附件。

    如何正确实现cache_Inv() 和 cache_wb()函数功能,对数据的一致性,是通过L1D,L2

    共同实现的吗,还是单独L1D,L2单独来实现?


    我是在裸机下来实现算法处理的。没办法直接调用sysBios的cache_inv(),cache_wb,cache_wbInv().


    非常感谢您给予的帮助。

    BRS,
    Meng

  • 后一个Cache的操作在EDMA把数据从L2搬到DDR之后,首先从逻辑上来说不合理,数据都搬完了,再做写回,那么搬的是写回前的数据,也就是没有更新的数据。

    然后呢,C674x 的L2和L1的内容是自动同步的,不需要在L1和L2之间做Cache同步。在L2的数据处理,直接就反应到了L2的内存上,直接搬出去就可以了。

    Cache就那么几个寄存器,自己写函数也简单,裸机想要直接调用sysbios的Cache API也是可以的,因为它是以库的形式提供的,将它在sysbios下的库包含进来就可以了。也可以用C6748 starterware里的Cache函数。

    其实自己写也就几行代码~~~,关键是理解它的逻辑。

    Lingcon Meng 说:
    也就是说所有的cache操作都是基于DDR的地址的,与L1,L2的具体地址没有关系。

    ------  对,是对于CPU之外的地址空间,包括ShareRAM,EMIFA, DDR。

  • Hello Tony,

    非常感谢您的解释。

    根据您的解释及我最近的对文档阅读,也就是说,我们的应用情况(提供的例程):

    DDR3(cache)-->L2(as SRAM,not cache) --> DDR3(cache),每一阶段数据传送都是EDMA3来完成。

    在 DDR3(cache)-->L2(as SRAM,not cache) 数据搬移EDMA3之前,cache_invL2()  DDR3所涉及地址,就ok。

    数据在L2处理完,然后EDMA3将数据从L2搬移到DDR3,之后无需任何cache操作(such as cache_wbL2()).

    这样的理解正确吗?

    再次感谢!

    BRS,

    Meng

  • Lingcon Meng 说:

    DDR3(cache)-->L2(as SRAM,not cache) --> DDR3(cache),每一阶段数据传送都是EDMA3来完成。

    在 DDR3(cache)-->L2(as SRAM,not cache) 数据搬移EDMA3之前,cache_invL2()  DDR3所涉及地址,就ok。

    -----是write back,加上invalid。不write back,前面处理过的数据不要了?

    数据在L2处理完,然后EDMA3将数据从L2搬移到DDR3,之后无需任何cache操作(such as cache_wbL2()).

    ----- 明白Cache操作的作用自己理解吧。Cache一致性操作的目的是在将Cache中的内容同步到相应的物理内存上去,edma的搬运是针对物理内存的。

  • Hello Tony,

    谢谢您的耐心解释!

    BRS,

    Meng