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.

急求!!多核多同道EDMA传输一个循环内同时读数存数有冲突!!!!



有专家帮忙吗?我现在如果单独循环1024次从DDR3里用DMA读数或者存数都没有问题,但是如果一旦单循环内又读又存数居,在循环几次后在读数据时就会出现掉包现象.请问是不是DMA内部有什么机制造成了这种冲突了?谢谢了

我读取数据是从DDR3到L2,采用的是例程中的PING_PONG缓存,每个核分别用的不同的映射寄存器和DMA通道。读取数据时我8核用的通道分别为0,2,4,6,8,10,12,14. 

我存储数据时用的DMA方式就只采用PONG缓存(因为用PING_PONG缓存好像实现不了多核同时从L2到DDR3存数),每个核分别用的不同的映射寄存器和DMA通道,存储数据时8核使用的通道分别为16,18,20,22,24,26,28,30.

不管读取还是存储每个通道都在结束时关闭了DMA通道的。

谢谢

  • EDMA进行数据搬移,同时会涉及到数据的读写。从你的描述中理解你所谓的读取是从DDR3->L2,写数据是L2->DDR?

    先理解一下你的测试流程:在单核上使用同一个通道,同一组参数,循环启动该通道进行数据的EDMA读写。如果在循环中的EDMA 通道只有从DDR3->L2的搬移则工作正常,如果涉及到L2->DDR3的通道与DDR3->L2的通道同时工作则存在问题?

    EDMA的通道读写不会有冲突,所有建议:

    1. 先只测试一遍看看是否存在问题,即在一个核上同时启动DDR3->L2及L2->DDR3的通道;

    2. 由于你前后循环使用了相同的通道,所有需要保证在下一次启动之前保证上一次数据搬移完成,否则可能导致事件丢失等异常;

    3. 如果涉及到core对DDR3的数据读写,需要软件维护cache一致性,否则EDMA读取的数据会是旧数据,EDMA写的数据可能被旧数据覆盖。

  • Andy Yin1你好,是的如果循环内单独只有L2->DDR3的通道或者DDR3->L2的通道都没有问题,但是涉及到L2->DDR3的通道与DDR3->L2的通道同时工作则存在问题,问题出在从DDR3->L2的通道会出现掉包现象,L2->DDR3的通道不会出现错误。

    我现在都是多核一起跑的

  • Andy Yin1 你好,还有DDR3->L2及L2->DDR3的通道都不是一样的,为了避免冲突。我也考虑了cache一致性问题,我说的掉包就是没有传输成功哈(每次就一两个核失败)。

  • DDR3上的数据是怎么初始化的,如果使用core写的话,需要维护cache一致性,即在写完后需要刷L2 cache。

  • 我觉得不应该是DDR3数据初始化的问题,因为我现在DDR3的数不变,只是测试EDMA3.

    并且我现在都是在循环4次以上才出现掉包现象

  • 如果是core运行后初始化DDR3的话,需要刷cache。

    建议在提交当前EDMA传输时查询该EDMA channel是否空闲。