大家好:
最近使用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操作影响了--当只运行一个内核时,它是可以完成所有数据搬移工作的,并没有出错,所以单核配置应该是没问题的。求各位支招解决方案!!