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.

C6678 EDMA搬运数据不正常



大家好,我用的是6678L,主要想完成以下工作,1)用EDMA将数据从数组A搬运到数组B。2)结束之后EDMA出发中断,进入中断程序。大概结构如下:

中断服务程序()

{

中断任务;

}

中断控制器初始化程序()

{

}

main()

{

中断控制器初始化程序();//调用中断初始化程序,初始化intc和cic

EDMA搬运任务;

}

这样写完之后,编译通过,但是运行结果发现B里面没有搬运到的数据。edma我用的是cpu写ESR的触发,单步执行发现该语句执行完之后,没有触发EDMA进行搬运。

然后我进行了如下调试:

将中断初始化程序删除,并将main函数中对该函数的调用语句注释掉,编译通过,发现数据搬运正常。

然后还原中断初始化程序,但是main中的调用语句仍然注释掉,编译通过,但是发现没有发生数据搬运。

main函数里面对edma配置和使用的代码,和中断控制器初始化程序没有任何联系,中断初始化程序只是配置了以下几个寄存器而已,为什么会对edma造成影响呢?而且就算有影响,我把调用该函数的语句从main中注释掉,应该就不会执行了啊,为什么一定要删除其代码才可以搬运数据呢?

还有就是编译通过后,发现A数组和B数组的地址,在删除和不删除中断初始化程序时,是不一样的,请问这个有什么影响吗?

问题比较多,在这里先谢谢各位老师!

  • 置顶的帖子里,有一个Keystone 1的STK开发包,内有Memory_Test的例子,

    在这个例子里,有用DSP核进行拷贝的操作,也有用EDMA3进行拷贝的操作,你可以学习一下,看看是哪里配置错了。

  • 谢谢,配置好像没有问题,因为我程序里面的edma配置部分是参照pdk里面的例程的,单独运行正确,但是就是在main外面加一个函数之后,就不能搬运了,而且那个函数还没有在main中调用。

  • 单步调测观测一下写ESR启动EDMA后,相应的PaRAM set参数变化,看一下EDMA有没有执行起来,还有注意数据搬移源及目的地址在LL2时,需要转换成全局地址对应0x1n800000开始(n为coreID)。

  • 我的param设置时这样的

       myParam.option = CSL_EDMA3_OPT_MAKE(CSL_EDMA3_ITCCH_DIS, \
                                                            CSL_EDMA3_TCCH_DIS, \
                                                            CSL_EDMA3_ITCINT_DIS, \
                                                            CSL_EDMA3_TCINT_EN, \
                                                            0, CSL_EDMA3_TCC_NORMAL,\
                                                            CSL_EDMA3_FIFOWIDTH_NONE, \
                                                            CSL_EDMA3_STATIC_DIS, \
                                                            CSL_EDMA3_SYNC_A, \
                                                            CSL_EDMA3_ADDRMODE_INCR, \
                                                            CSL_EDMA3_ADDRMODE_INCR );


        myParam.srcAddr    = (Uint32)0x0c00b400;
        myParam.aCntbCnt   = CSL_EDMA3_CNT_MAKE(1024,1); 

       myParam.dstAddr    = (Uint32)0x0c00b800;
        myParam.srcDstBidx = CSL_EDMA3_BIDX_MAKE(1,1);   

        myParam.linkBcntrld= CSL_EDMA3_LINKBCNTRLD_MAKE(0xFFFF,0);
        myParam.srcDstCidx = CSL_EDMA3_CIDX_MAKE(0,1);
        myParam.cCnt = 1;

    在main函数前面加上CIC和INTC寄存器初始化程序(但是不在面中调用)时,运行,发现无法完成从0X0C00B400到0X0C00B800的搬运。

    但是加你个初始化程序删除之后,main函数不变,编译运行就可以正确编译了。看来应该不是源地址和目的地址的问题吧。

    现象好奇怪,快要疯掉了

  • 你好,我又检查了以下,发现中断初始化程序注释掉一部分就可以让edma顺利执行,而且初始化程序中没有注释的部分即使在后面多加两个printf函数,也会造成edma不工作。

    想问一下是堆栈溢出之类的错误吗?

  • 我的所有数据都在msm上面。源和目的地的地址都以ox0c00打头,在msm上。

    而且在程序开始处还添加了

        CACHE_invL1d ((void *)srcBuff, 2*BUFF_SZ, CACHE_WAIT);
        CACHE_invL2 ((void *)srcBuff, 2*BUFF_SZ, CACHE_WAIT);

    上面两个语句是用来阻止极爱那个srcBuff定位在L1D和L2上面的吧。

  • 需要在向源buffer写数据之后执行L1D cache flush操作,保证数据被更新到实际SL2物理地址,否则EDMA搬不到最新的数据。