各位专家好!
附件中是我在6678自带的EDMA例子的基础上修改得到的程序,只采用了在global region下的pingpong传输,但是程序运行以后显示srcBuff的数据是对的,而dstBuff中的数据全部为初始化时候的0值,也就是说srcBuff中的数据并没有传输到dstBuff中去,恳请各位专家帮我分析一下这个程序,看看问题出在什么地方,不胜感激!
bb qiuhua:
我也遇到过这个问题,你把L1D取消勾选看看数据是否正确,如果正确说明传输没有问题,是cache一致性没有维护好。
Andy Yin1:
回复 bb qiuhua:
andy lee您好,
注意cache一致性的维护,及当数据在L2时确定使用了全局地址。
如果是采用CSL下的EDMA例子的话,其中的源和目的数据都是存储在SL2,此时在初始化源数据后,在启动EDMA之前没有很好地保证cache的一致性。所以需要先对源地址刷cache,保证数据被真正写到SL2的物理地址,这样就可以看到真正的数据。你也可以采用bb qiuhua的方式保证看到源和目的数据一致;或者修改源buffer存储到L2,这样就不需要软件维护cache 一致性。
andy lee1:
回复 bb qiuhua:
bb qiuhua
您好!
我把L1D取消勾选了,结果还是dstbuff里全为0,和srcbuff里不一致,不知道是什么原因。您能帮我看一下程序有什么问题吗?多谢!
andy lee1:
回复 Andy Yin1:
Andy Yin
您好!
非常感谢您的回答!
关于您的回答我还有几点疑问:
1.您说首先要对源地址刷cache,请问这个该如何操作呢?用什么函数?应该是在给源地址赋初值以前就刷cache吗?
2.如果修改源buff存储到L2,那又该如何操作呢?是否不需要对目的地址或者目的Buff进行任何操作?
Jason miller:
回复 andy lee1:
很有可能是cache一致性产生的,有2个办法。第一,查看下你的MAR位的设置,关闭对应外部存储器的cache使能;第二:在传输前使用BCACHE_wb()和BCACHE_inv(),使用软件维持cache一致性,带参数的自己去查查。希望能帮到你。
andy lee1:
回复 Jason miller:
Jason miller
您好!
这两种方法使用其中一种就可以了吗?
另外,在csl库函数里,没有BCACHE_wb()和BCACHE_inv()这两个函数,而是CACHE_wbL2()和CACHE_invL2(),请问是使用这两个函数吗?
我在对源地址和目的地址的数据初始化之前使用了这两个函数,可是最后的结果还是不对,dstbuff里仍然全为0,数据并没有传输过去,请问是什么原因?非常感谢!
bb qiuhua:
回复 andy lee1:
andy lee,你好。
上午跑了一下你的程序,确实没有搬运成功。
稍微调试了下,发现你的PaRam的源地址和目的地址有些问题,我这里看到的两个地址全是0;移位操作的结果不是想象中的结果,你的channelNum是8位的,但是要移位24位,我也不知道会发生什么问题。(下午我的CCS无法加载你的程序了,没法调试)。
建议你从头到尾仔细屡一下整个过程。
我也是新手,个人意见,仅供参考。
我修改了一下ccs目录下的edma例程,只修改了edma_ping_pong_xfer_gbl_region(instNum, channelNum)里面的内容,这个函数是可以成功的,不知道对你是否有帮助,传上来可以参考一下吧。
printf ("**************************************************\n"); printf ("******************* EDMA Testing *****************\n"); printf ("**************************************************\n"); /* EDMA Instance 0: Supports only 16 DMA Channels. */ for (channelNum = 0; channelNum < 16; channelNum++) { if (edma_ping_pong_xfer_gbl_region(instNum, channelNum) < 0) //只修改了这个函数内容, { printf ("Error: Testing EDMA(%d) Ping-Pong Test (Global) Region for Channel %d FAILED\n", instNum, channelNum); return; } printf ("Debug: Testing EDMA(%d) Ping-Pong Test (Global) Region for Channel %d Passed\n", instNum, channelNum); }
andy lee1:
回复 bb qiuhua:
bb qiuhua 你好!我直接用了你给的那个函数,可是最后的结果还是显示dstbuff1和dstbuff2里全部为0,也就是数据并没有搬移成功,请问是什么原因呢?我将使用你这个函数新建的一个工程放在附件里了,麻烦你帮我看一下,非常感谢!