TI中文支持网
TI专业的中文技术问题搜集分享网站

C6678中EDMA3在多核并行使用时出错

大家好:

            最近使用EDMA3进行数据搬移,8个核都使用EDMA3CC0–核0占用Channel 0,PaRam0,TCC为0…核i占用Channel i,PaRami,TCC为i…核7占用Channel 7,PaRam  7,TCC为7。每个channel都在GLOBAL Region中,每个核都从DDR3中的不同内存地址将数据搬移到另外不同的内存地址中,即核间需要搬移的数据没有内存重叠。由于需要进行很多次数据搬移,所以可以认为8个channel是并行工作的。

             我使用CSL中的例程进行EDMA3配置,类似下面的代码:

    myParamSetup.linkBcntrld = CSL_EDMA3_LINKBCNTRLD_MAKE(hParamPing,0);        myParamSetup.option = CSL_EDMA3_OPT_MAKE(CSL_EDMA3_ITCCH_DIS, \
                                             CSL_EDMA3_TCCH_DIS, \
                                             CSL_EDMA3_ITCINT_DIS, \
                                             CSL_EDMA3_TCINT_EN,\
                                             1, CSL_EDMA3_TCC_NORMAL,\
                                             CSL_EDMA3_FIFOWIDTH_NONE, \
                                             CSL_EDMA3_STATIC_EN, \
                                             CSL_EDMA3_SYNC_A, \
                                             CSL_EDMA3_ADDRMODE_INCR, \
                                             CSL_EDMA3_ADDRMODE_INCR );
    myParamSetup.srcAddr = (Uint32)srcBuff2;
    myParamSetup.dstAddr = (Uint32)dstBuff2;  

    regionIntr.region = CSL_EDMA3_REGION_GLOBAL;
    regionIntr.intr   = 0;
    regionIntr.intrh  = 0;

    /* Poll on IPR bit 0 */
    do {
        CSL_edma3GetHwStatus(hModule,CSL_EDMA3_QUERY_INTRPEND,&regionIntr);
    } while (!(regionIntr.intr & 0x1));

    /* Clear the pending bit */
    CSL_edma3HwControl(hModule,CSL_EDMA3_CMD_INTRPEND_CLEAR,&regionIntr); 

              我通过查询IPR判断数据是否搬移完成。首先IPR对每个channel都是单独置位的,而通过ICR可以对IPR的每个位进行单独复位。理论上来说多核的EDMA配置是不会有干扰的,可以这么理解吧?

            但是将8个核同时运行,8个channel同时工作时,总有一些内核卡在了

    /* Poll on IPR bit 0 */
    do {
        CSL_edma3GetHwStatus(hModule,CSL_EDMA3_QUERY_INTRPEND,&regionIntr);
    } while (!(regionIntr.intr & 0x1));

         这个while循环中。我查看了EDMA3CC0的寄存器,并没有事件丢失。更像是IPR中某个channel对应的位被其他channel操作影响了–当只运行一个内核时,它是可以完成所有数据搬移工作的,并没有出错,所以单核配置应该是没问题的。求各位支招解决方案!!

Andy Yin1:

 myParamSetup.option = CSL_EDMA3_OPT_MAKE(CSL_EDMA3_ITCCH_DIS, \

                                             CSL_EDMA3_TCCH_DIS, \                                             CSL_EDMA3_ITCINT_DIS, \                                             CSL_EDMA3_TCINT_EN,\                                             1, //TCC,对应IPR寄存器中置位bit,此处8个channel配置相同的TCC,则每个channel完成后会置上相同的IPR bit,如果多个channel同时置上IPR,像你这种处理方式在清掉后,下一次则轮询不到,建议不同的channel使用不同的TCC。

                                             CSL_EDMA3_TCC_NORMAL,\

                                             CSL_EDMA3_FIFOWIDTH_NONE, \                                             CSL_EDMA3_STATIC_EN, \                                             CSL_EDMA3_SYNC_A, \                                             CSL_EDMA3_ADDRMODE_INCR, \                                             CSL_EDMA3_ADDRMODE_INCR );

注意EDMACC0总共只有4个TC,所以不能channel依次占用到TC7。

Chi Wang1:

回复 Andy Yin1:

Andy:你好!请问EDMA CC0应该只有2个TC吧?另:请问如何做到EDMA 8核并行传输。传递相同大小的数据,我的EDMA程序只能做到8核的耗时是单核的1/2。利用了EDMA3 CC0的两个TC, EDMA3 CC1的4个TC,EDMA3 CC2的两个TC。通道号,PaRAM编号和完成标志TCC都随着核号而改变,不同核用了这些变量都不同。请问还需要做到什么操作,才能达到完全并行传输,耗时为单核传递相同大小数据的1/8。非常感谢!

xuefeng Li1:

回复 Chi Wang1:

       手册上说的DMA传输通道是针对用户层的,是个抽象概念,真正传数的是底层的数据总线。

赞(0)
未经允许不得转载:TI中文支持网 » C6678中EDMA3在多核并行使用时出错
分享到: 更多 (0)