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

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数组的地址,在删除和不删除中断初始化程序时,是不一样的,请问这个有什么影响吗?

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

Allen35065:

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

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

littleWhite:

回复 Allen35065:

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

Andy Yin1:

回复 littleWhite:

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

littleWhite:

回复 Andy Yin1:

我的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函数不变,编译运行就可以正确编译了。看来应该不是源地址和目的地址的问题吧。

现象好奇怪,快要疯掉了

littleWhite:

回复 Andy Yin1:

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

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

littleWhite:

回复 Andy Yin1:

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

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

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

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

Andy Yin1:

回复 littleWhite:

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

赞(0)
未经允许不得转载:TI中文支持网 » C6678 EDMA搬运数据不正常
分享到: 更多 (0)