完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本帖最后由 一只耳朵怪 于 2018-6-25 11:15 编辑
各位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的总线冲突呢? 困扰了好一阵子,还望高手指导,不胜感激!!! |
|
相关推荐
6个回答
|
|
walsn123 发表于 2018-6-25 07:48 多个EDMA 通道同时进行DDR3读写时,肯定有DDR3总线冲突,但是如果EDMA及DDR3 controller配置没有问题的话,EDMA不会出现数据读写错误。
最佳答案
|
|
|
|
每个核是通过EDMA将数据先读到内部memory处理,处理结果放在内部memory,然后再通过EDMA将结果往外搬么?
你是在哪个点去查看数据的,是通过什么方式确认EDMA搬移完成的? 加入延时后数据处理正确,这个延时具体是在哪加的? 如果是我上面的理解,数据的处理都在LL2,就重点查一下是否EDMA还没有搬移数据完成,就已经开始进行数据处理或者就查看处理结果。 |
|
|
|
zbb9612 发表于 2018-6-25 07:26 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帮忙分析问题可能出在哪 谢谢!! |
|
|
|
zbb9612 发表于 2018-6-25 07:26 Andy 您好: 我想问的是如果两个核用不同的EDMA通道控制器同时进行长时间的从共享内存到DDR3的存数时,会不会涉及总线冲突的问题? 如果有,在多核并行向ddr3存数时该如何避免冲突的发生? 谢谢!!! |
|
|
|
walsn123 发表于 2018-6-25 07:40 你处理的结果都是放在MSM SL2,此时需要维护cache一致性,即在处理完后,需要执行write back cache。 |
|
|
|
Andy 您好: 按照您的提示我在数据处理完毕后加了write back cache以维护CACHE一致性,这样所存储的处理后数据没有问题了。我在数据处理之前加了invalid cache,但是没有注意在处理后加write back ^_^ 谢谢Andy! |
|
|
|
只有小组成员才能发言,加入小组>>
341 浏览 1 评论
539 浏览 2 评论
NA555DR VCC最低电压需要在5V供电,为什么用3.3V供电搭了个单稳态触发器也使用正常?
781 浏览 3 评论
MSP430F249TPMR出现高温存储后失效了的情况,怎么解决?
655 浏览 1 评论
对于多级放大电路板,在PCB布局中,电源摆放的位置应该注意什么?
1138 浏览 1 评论
AT32F407在USART2 DMA发送数据时,接包接到了要发送的数据,程序还是处于等待传输完成的标识判断中,为什么?
69浏览 29评论
214浏览 23评论
请问下tpa3220实际测试引脚功能和官方资料不符,哪位大佬可以帮忙解答下
256浏览 20评论
请教下关于TAS5825PEVM评估模块原理图中不太明白的地方,寻求答疑
205浏览 14评论
两个TMP117传感器一个可以正常读取温度值,一个读取的值一直是0,为什么?
65浏览 13评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-25 11:08 , Processed in 0.845296 second(s), Total 55, Slave 50 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号