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多核DMA数据搬移问题



八个核在进行DMA搬移时,核0不能完成数据搬移,其他的核都能完成,核0会死在一个函数里,

这个函数是:

do
{
     CSL_edma3GetHwStatus(hModule,CSL_EDMA3_QUERY_INTRPEND,&regionIntr);
} while (!(regionIntr.intr & query));

程序会陷入死循环,但是不知道为什么?求解答!

DMA程序如下所示:

1.

void DMA_transportAB(int ChannelNum,float *srcBuff,int srcIncrement , int Acnt , float * dstBuff,int dstIncrement , int Bcnt)
{ //( 核号, 源地址, 传输间隔(增量), 发送数据包大小, 目的地址, 接收间隔, 接收数据包大小,)


myParamSetup.option = CSL_EDMA3_OPT_MAKE(CSL_EDMA3_ITCCH_DIS, \
CSL_EDMA3_TCCH_DIS, \
CSL_EDMA3_ITCINT_DIS, \
CSL_EDMA3_TCINT_EN, \
ChannelNum, CSL_EDMA3_TCC_NORMAL,\
CSL_EDMA3_FIFOWIDTH_NONE, \
CSL_EDMA3_STATIC_DIS, \
CSL_EDMA3_SYNC_AB, \
CSL_EDMA3_ADDRMODE_INCR, \
CSL_EDMA3_ADDRMODE_INCR );


myParamSetup.srcAddr = (Uint32)srcBuff;
myParamSetup.aCntbCnt = CSL_EDMA3_CNT_MAKE(Acnt,Bcnt);
myParamSetup.dstAddr = (Uint32)dstBuff;
myParamSetup.srcDstBidx = CSL_EDMA3_BIDX_MAKE(srcIncrement,dstIncrement);
myParamSetup.srcDstCidx = CSL_EDMA3_CIDX_MAKE(0,0);
myParamSetup.cCnt = 1;
myParamSetup.linkBcntrld= CSL_EDMA3_LINKBCNTRLD_MAKE(CSL_EDMA3_LINK_NULL,0);
CSL_edma3ParamSetup(hParamPing,&myParamSetup);

regionIntr.region = CSL_EDMA3_REGION_GLOBAL;
regionIntr.intr = 0x1<<ChannelNum;
regionIntr.intrh = 0x0000;

CSL_edma3HwChannelControl(hChannel,CSL_EDMA3_CMD_CHANNEL_SET,NULL);
}

2.

void waitDMAover(int ChannelNum)
{

int query;
query = 0x01<<ChannelNum;
regionIntr.region = CSL_EDMA3_REGION_GLOBAL;
regionIntr.intr = 0;
regionIntr.intrh = 0;

do
{
CSL_edma3GetHwStatus(hModule,CSL_EDMA3_QUERY_INTRPEND,&regionIntr);
} while (!(regionIntr.intr & query));

regionIntr.region = CSL_EDMA3_REGION_GLOBAL;
regionIntr.intr = 0x01<<ChannelNum;
regionIntr.intrh = 0;

CSL_edma3HwControl(hModule,CSL_EDMA3_CMD_INTRPEND_CLEAR, &regionIntr);

}

  • 只在core0启动EDMA搬移的话可以正常工作么,你这个应该是没有产生EDMA完成中断,可以在配置完EDMA后,看看相应的channel及PaRAM配置是否正常。

  • core0并不是每次都不能正常工作,只是偶尔会出现不正常,一般都是几个小时以后core0会出现不正常工作,什么叫没有产生EDMA完成中断?对于这块我不是太理解,可以详细一点吗?谢谢。

    关于信号量的问题。八个核有时会无法实现同步?又时核core1会出现不能成功获取信号量,其他的core都获取了对应的信号量,但是其他的core没有等待core1获取信号量而是直接执行了下面的语句。最后就导致了八个核不能工作了。请问是什么原因?谢谢

    CSL_semAcquireDirect(coreNum+1); //为了让八个核实现同步
    do{ } while((CSL_semIsFree (1)|CSL_semIsFree (2)|CSL_semIsFree(3)|CSL_semIsFree (4)|CSL_semIsFree (5) |CSL_semIsFree (6)|CSL_semIsFree (7) |CSL_semIsFree (8)));

    CACHE_invL1d((void*)(headreserved3),368,CACHE_WAIT);
    Rs=(*((int *)headreserved3+9)+Tp*1e6+2+Tp/B*105*1e12/2)*150;


  • 您好,请问您这个问题解决了吗?我也遇到了类似问题,能不能给讲讲该怎么处理?谢谢!
  • 您好 请问这个问题您是怎么解决的?

  • 您好,请问这个问题您解决了吗?我遇到了八个核都会死在这,但是过一会再跑通。