大家好:
最近使用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,®ionIntr);
} while (!(regionIntr.intr & 0x1));
/* Clear the pending bit */
CSL_edma3HwControl(hModule,CSL_EDMA3_CMD_INTRPEND_CLEAR,®ionIntr);
我通过查询IPR判断数据是否搬移完成。首先IPR对每个channel都是单独置位的,而通过ICR可以对IPR的每个位进行单独复位。理论上来说多核的EDMA配置是不会有干扰的,可以这么理解吧?
但是将8个核同时运行,8个channel同时工作时,总有一些内核卡在了
/* Poll on IPR bit 0 */
do {
CSL_edma3GetHwStatus(hModule,CSL_EDMA3_QUERY_INTRPEND,®ionIntr);
} 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传输通道是针对用户层的,是个抽象概念,真正传数的是底层的数据总线。