大家好,我用的是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搬不到最新的数据。