各位TI专家及6678同仁们好:
最近我在做多核并行EDMA数据传输时遇到了一个问题,还望能有高人能够指点迷津!
我的处理流程比较简单,就是让核0和核1同时处理DDR3中一个4K行的数据块,其中核0处理前2K行,核1处理后2K行,两者所处理数据以及所用参数都不交叉,处理后数据以EDMA data sorting模式存储至DDR3的另一部分。两个核的处理流程一样,且Core0的EDMA用的是CC0,Core1的EDMA用的是CC1,基本流程如下(其中取数时间大约7000ns;算术时间大约80000ns;存数时间大约60000ns)
for( ; ; )
{
EDMA bolck move模式取数Setup;
数据处理;
EDMA data sorting模式存数Setup;
}
单核运行程序处理结果没有问题,但是双核并行处理时结果就会有问题,在两个核的代码中设断点单次循环调试结果却是正确的。现在可以确定是双核同时data sorting模式存数时出了问题,但是自己也验证了标志位设置及查询没有问题,而且当在每个核的数据处理过程中加入了充分长时间的延时后结果正确了。
想请教各位专家,出现这种问题的原因是什么?会不会两个核同时data sorting存数且由于这种存数方式时间较长而引起了DDR3 EMIF的总线冲突呢?
困扰了好一阵子,还望高手指导,不胜感激!!!
Andy Yin1:
每个核是通过EDMA将数据先读到内部memory处理,处理结果放在内部memory,然后再通过EDMA将结果往外搬么?
你是在哪个点去查看数据的,是通过什么方式确认EDMA搬移完成的?
加入延时后数据处理正确,这个延时具体是在哪加的?
如果是我上面的理解,数据的处理都在LL2,就重点查一下是否EDMA还没有搬移数据完成,就已经开始进行数据处理或者就查看处理结果。
Ryan KU:
回复 Andy Yin1:
Andy Yin您好:
1.每个核都是先从ddr3取数至MSM,然后处理数据,处理后的数据也是在MSM,然后在通过EDMA data sorting的方式将数据存储至ddr3另一部分中;
2.我取数存数前后以及运算过程中都设断点查看了,确认EDMA是否搬移完成是通过设置TCC,并在下一次传输前查询相应IPR位是否置1.
3.延时是在处理过程中加的,而且延时较数据处理时间长很多
从处理后结果来看,EDMA是执行了数据传输,只是后面传输的结果都是前两次的处理结果。
/* 执行存数时的PaRAM以及Setup操作 */
myParamSetup_Core0.option = 0x00100008|(0<<12);
myParamSetup_Core0.srcAddr = 0x80008000+0x8000*j0;
myParamSetup_Core0.aCntbCnt = CSL_EDMA3_CNT_MAKE(32768, 1);
myParamSetup_Core0.dstAddr = (Uint32)Src_Ping_Core0; // Src_Ping_Core0在共享内存中
… …
CSL_edma3ParamSetup(hParamGet_Core0,&myParamSetup_Core0);
CSL_edma3HwChannelControl(hChannel_Core0,CSL_EDMA3_CMD_CHANNEL_SET,NULL);
/* 执行存数时的PaRAM以及Setup操作 */
myParamSetup_Core0.option = 0x00900004|(1<<12);
myParamSetup_Core0.srcAddr = (Uint32)Dst_Ping_Core0; // Dst_Ping_Core0也定义在共享内存中
… …
CSL_edma3ParamSetup(hParamStore_Core0,&myParamSetup_Core0);
CSL_edma3HwChannelControl(hChannel_Core0,CSL_EDMA3_CMD_CHANNEL_SET,NULL);
/ * 轮询取数和存数IPR标志位以及清零 */
regionIntr_Core0.region = CSL_EDMA3_REGION_GLOBAL;
regionIntr_Core0.intr = 0;
regionIntr_Core0.intrh = 0; /* Set Obj regionIntr_Core0 to be 0 for IPR Clear */
do {
CSL_edma3GetHwStatus(hModule_Core0,CSL_EDMA3_QUERY_INTRPEND,®ionIntr_Core0);
} while (!(regionIntr_Core0.intr & 0x3)); // 2^0+2^1
CSL_edma3HwControl(hModule_Core0,CSL_EDMA3_CMD_INTRPEND_CLEAR,®ionIntr_Core0);
核0和核1都是这个程序结构,只是所处理数据不同,而且所用的CC也不同。
还请Andy帮忙分析问题可能出在哪 谢谢!!
Ryan KU:
回复 Andy Yin1:
Andy 您好:
我想问的是如果两个核用不同的EDMA通道控制器同时进行长时间的从共享内存到DDR3的存数时,会不会涉及总线冲突的问题?
如果有,在多核并行向ddr3存数时该如何避免冲突的发生?
谢谢!!!
Andy Yin1:
回复 Ryan KU:
多个EDMA 通道同时进行DDR3读写时,肯定有DDR3总线冲突,但是如果EDMA及DDR3 controller配置没有问题的话,EDMA不会出现数据读写错误。
Ryan KU:
回复 Andy Yin1:
Andy 您好:
按照您的提示我在数据处理完毕后加了write back cache以维护CACHE一致性,这样所存储的处理后数据没有问题了。我在数据处理之前加了invalid cache,但是没有注意在处理后加write back ^_^
谢谢Andy!