您好!C6678自带的EDMA程序已经调试没错误,可以正常编译,但是在建好配置文件并运行以后,只有部分功能通过测试,部分功能测试发生错误,显示信息如下:
[TMS320C66x_0] **************************************************
[TMS320C66x_0] ******************* EDMA Testing *****************
[TMS320C66x_0] **************************************************
[TMS320C66x_0] Debug: Testing EDMA(0) Ping-Pong Test (Global) Region for Channel 0…
[TMS320C66x_0] Debug: Testing EDMA(0) Ping-Pong Test (Global) Region for Channel 0 Passed
[TMS320C66x_0] Debug: Testing EDMA(0) Ping-Pong Test (Global) Region for Channel 1…
[TMS320C66x_0] Error: Verification (Source1/Destination1) Failed
[TMS320C66x_0] Error: Testing EDMA(0) Ping-Pong Test (Global) Region for Channel 1 FAILED
请问是什么原因呢?谢谢!工程文件已经上传
Andy Yin1:
您好,
从代码来看,是channel1在搬完数据后发现目的地址的数与源地址数据不一致,可以试试将所有的cache关掉看看是否cache引起的;另外可以修改将失败的channel1修改为第一次测试看看结果如何。请先自己一步步进行调测,谢谢
andy lee1:
回复 Andy Yin1:
Andy Yin
你好!程序已经测试通过了,所有通道都成功通过测试,可是当我在MemoryBrowser查看在srcBuff1地址的值和dstBuff1地址的值时发现数据不一致,请问这是什么原因呢?谢谢!
Zhan Xiang:
回复 andy lee1:
请问您在比较数据的时候,edma停止了么,如果不停止edma,那么在你观察memory窗口时,edma仍然会改写对应的memory
andy lee1:
回复 Zhan Xiang:
您好!程序里传输函数有关闭通道和关闭EDMA模块的部分,所以每个通道在传输完成以后edma停止了,那请问是什么问题呢?修改后的工程文件已经上传,谢谢!
Yu Liu:
回复 andy lee1:
Andy Lee,
从你的代码看源和目的buffer的数据初始化是有规律的。请问你在MemoryBrowser中看到的源数据是否和预期一致,目的端是否一致?不一致是否有规律?方便的话给个截图上来。
谢谢!
for (loopIndex = 0; loopIndex < 256; loopIndex++)
{
srcBuff1[loopIndex] = loopIndex;
srcBuff2[loopIndex] = loopIndex;
dstBuff1[loopIndex] = 0;
dstBuff2[loopIndex] = 0;//刚开始ping和pong的目标缓冲区没数据
}
andy lee1:
回复 Yu Liu:
Yu Liu
您好!前4张图中显示的依次为MemoryBrowser中观察到的srcBuff1,dstBuff1,srcBuff2,dstBuff2中的数据,目的缓冲区和源缓冲区的数据并不一致,请问是什么原因呢?另外,按初始化的要求源缓冲区的值从srcBuff[0]到srcBuff[255]应该依次为0到255,但是最后一张图中显示Expressions里面观察到的srcBuff1中srcBuff[0]到srcBuff[99]中的数值并不是依次从0到99,请问是什么原因呢?谢谢!
Yu Liu:
回复 andy lee1:
andy lee,
最后显示是按照Char显示的,由于没有对应到ASCII码所以显示为点。可以试试是否把显示格式改为十六进制或者十进制模式。
从你的截图看出有两行的搬运没有发生。你试试把L1D和L2 Cache的钩去掉试试。同时也请检查一下EDMA的配置是否有误。
谢谢!
andy lee1:
回复 Yu Liu:
Yu Liu
我的程序最后运行的结果是srcBuff1和dstBuff1的数据一致,srcBuff2和dstBuff2的数据也一致,也就是说数据传输成功了!
现在我将源缓冲区改成了只有一个然后进行测试,在进行pingpong传输的之后发现源缓冲区的数据全部传到dstBuff1之后又全部往dstBuff2里面传输了一遍,按理说pingpong传输是先从源缓冲区往ping缓冲区传输数据,传输完成以后再将源缓冲去剩下的数据往Pong缓冲区传输,但为什么最后结果是pong缓冲区的数据并不是往ping缓冲区传输后剩下的数据,而是和ping缓冲区的数据完全一样呢?谢谢!工程文件已经上传
Yu Liu:
回复 andy lee1:
andy lee,
我在另外一个帖子中回过了。pingpong就是通过link方式进行表覆盖,所以重传了一遍。
andy lee1:
回复 Yu Liu:
Yu Liu
我现在要做的是利用EDMA将数据从EMIF传输到DDR3里面,采用pingpong缓冲机制,我的想法是在DDR3的地址处设置ping缓冲区好pong缓冲区,然后采用link交替往两个缓冲区传递数据,直到EMIF中的数据全部传输到DDR3里面,请问我这个想法是否可行?谢谢!
另外,如果像我在上一个问题中提到的那样,最后由于Link的作用数据传到Ping缓冲区以后又重新往pong缓冲区传输一遍,这样岂不是多传送了一次?能否采用某种方法,在将ping缓冲区填满以后再将EMIF中剩下的数据往pong缓冲区传输呢?谢谢!