TI中文支持网
TI专业的中文技术问题搜集分享网站

EDMA数据无法正确传输

各位专家好!

附件中是我在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,也就是数据并没有搬移成功,请问是什么原因呢?我将使用你这个函数新建的一个工程放在附件里了,麻烦你帮我看一下,非常感谢!

赞(0)
未经允许不得转载:TI中文支持网 » EDMA数据无法正确传输
分享到: 更多 (0)