This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

EDMA数据无法正确传输



各位专家好!

附件中是我在6678自带的EDMA例子的基础上修改得到的程序,只采用了在global region下的pingpong传输,但是程序运行以后显示srcBuff的数据是对的,而dstBuff中的数据全部为初始化时候的0值,也就是说srcBuff中的数据并没有传输到dstBuff中去,恳请各位专家帮我分析一下这个程序,看看问题出在什么地方,不胜感激!

simple edma3.rar
  • 我也遇到过这个问题,你把L1D取消勾选看看数据是否正确,如果正确说明传输没有问题,是cache一致性没有维护好。

  • andy lee您好,

    注意cache一致性的维护,及当数据在L2时确定使用了全局地址。

    如果是采用CSL下的EDMA例子的话,其中的源和目的数据都是存储在SL2,此时在初始化源数据后,在启动EDMA之前没有很好地保证cache的一致性。所以需要先对源地址刷cache,保证数据被真正写到SL2的物理地址,这样就可以看到真正的数据。你也可以采用bb qiuhua的方式保证看到源和目的数据一致;或者修改源buffer存储到L2,这样就不需要软件维护cache 一致性。

  • bb qiuhua

    您好!

    我把L1D取消勾选了,结果还是dstbuff里全为0,和srcbuff里不一致,不知道是什么原因。您能帮我看一下程序有什么问题吗?多谢!

  • Andy Yin

    您好!

    非常感谢您的回答!

    关于您的回答我还有几点疑问:

    1.您说首先要对源地址刷cache,请问这个该如何操作呢?用什么函数?应该是在给源地址赋初值以前就刷cache吗?

    2.如果修改源buff存储到L2,那又该如何操作呢?是否不需要对目的地址或者目的Buff进行任何操作?

  •   很有可能是cache一致性产生的,有2个办法。第一,查看下你的MAR位的设置,关闭对应外部存储器的cache使能;第二:在传输前使用BCACHE_wb()和BCACHE_inv(),使用软件维持cache一致性,带参数的自己去查查。希望能帮到你。

  • Jason miller

    您好!

    这两种方法使用其中一种就可以了吗?

    另外,在csl库函数里,没有BCACHE_wb()和BCACHE_inv()这两个函数,而是CACHE_wbL2()和CACHE_invL2(),请问是使用这两个函数吗?

    我在对源地址和目的地址的数据初始化之前使用了这两个函数,可是最后的结果还是不对,dstbuff里仍然全为0,数据并没有传输过去,请问是什么原因?非常感谢!

  • 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);
        }

    Example_EDMA.7z
  • bb qiuhua
    你好!
    我直接用了你给的那个函数,可是最后的结果还是显示dstbuff1和dstbuff2里全部为0,也就是数据并没有搬移成功,请问是什么原因呢?我将使用你这个函数新建的一个工程放在附件里了,麻烦你帮我看一下,非常感谢!

    simple edma3.rar