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

IWR1843: 程序运行到启动EDMA报错,程序停止

Part Number:IWR1843

工程师你好,

我将pa_18xx_dss的EDMA初始化以及配置程序复制到高精度液位测量的程序下,代替原来的EDMA程序;

但是程序运行到EDMA_startDmaTransfer(obj->edmaHandle[EDMA_INSTANCE_A],
MMW_EDMA_CH_1D_IN_PING);出现错误;

错误提示如下:

[Cortex_R4_0] xdc.runtime.Main: "../APP/mss_main.c", line 795: assertion failure
xdc.runtime.Error.raise: terminating execution
[C674X_0] {module#38}: line 99: error {id:0x10000, args:[0x20034afd, 0x20034afc]}
xdc.runtime.Error.raise: terminating execution

为了说明我程序的正确性,我将附EDMA的相关程序;

int32_t MmwDemo_dataPathInitEdma(MmwDemo_DSS_DataPathObj *obj)
{uint8_t numInstances;int32_t errorCode;EDMA_Handle handle;EDMA_errorConfig_t errorConfig;uint32_t instanceId;EDMA_instanceInfo_t instanceInfo;numInstances = EDMA_getNumInstances();/* Initialize the edma instance to be tested */for (instanceId = 0; instanceId < numInstances; instanceId++){EDMA_init(instanceId);handle = EDMA_open(instanceId, &errorCode, &instanceInfo);if (handle == NULL){// System_printf("Error: Unable to open the edma Instance, erorCode = %d\n", errorCode);return -1;}obj->edmaHandle[instanceId] = handle;errorConfig.isConfigAllEventQueues = true;errorConfig.isConfigAllTransferControllers = true;errorConfig.isEventQueueThresholdingEnabled = true;errorConfig.eventQueueThreshold = EDMA_EVENT_QUEUE_THRESHOLD_MAX;errorConfig.isEnableAllTransferControllerErrors = true;errorConfig.callbackFxn = MmwDemo_edmaErrorCallbackFxn;errorConfig.transferControllerCallbackFxn = MmwDemo_edmaTransferControllerErrorCallbackFxn;if ((errorCode = EDMA_configErrorMonitoring(handle, &errorConfig)) != EDMA_NO_ERROR){// System_printf("Debug: EDMA_configErrorMonitoring() failed with errorCode = %d\n", errorCode);return -1;}}return 0;
}

int32_t MmwDemo_dataPathConfigEdma(MmwDemo_DSS_DataPathObj *obj)
{uint16_t shadowParam = EDMA_NUM_DMA_CHANNELS;int32_t retVal = 0;uint32_t numChirpTypes = 1;uint32_t ADCBufferoffset = (32 * 1024)/4;numChirpTypes = 1;/****************************************************** EDMA configuration for getting ADC data from ADC buffer* to L2 (prior to 1D FFT)* For ADC Buffer to L2 use EDMA-A TPTC =1*****************************************************//* Ping - copies chirp samples from even antenna numbers (e.g. RxAnt0 and RxAnt2) */retVal =EDMAutil_configType1(obj->edmaHandle[EDMA_INSTANCE_A],(uint8_t *)(&obj->ADCdataBuf[0]),(uint8_t *)(SOC_translateAddress((uint32_t)&obj->adcDataIn[0], SOC_TranslateAddr_Dir_TO_EDMA, NULL)),MRR_SF0_EDMA_CH_1D_IN_PING,false,shadowParam++,obj->numAdcSamples * BYTES_PER_SAMP_1D,MAX(obj->numRxAntennas / 2, 1),ADCBufferoffset * 2,0,0,NULL,(uintptr_t)obj);if (retVal < 0){return -1;}/* Pong - copies chirp samples from odd antenna numbers (e.g. RxAnt1 and RxAnt3)* Note that ADCBufferoffset is in bytes, but ADCdataBuf is in cmplx16ReIm_t.* There are four bytes in one cmplx16ReIm_t*/retVal =EDMAutil_configType1(obj->edmaHandle[EDMA_INSTANCE_A],(uint8_t *)(&obj->ADCdataBuf[(ADCBufferoffset>>2)]),(uint8_t *)(SOC_translateAddress((uint32_t)(&obj->adcDataIn[obj->numRangeBins]), SOC_TranslateAddr_Dir_TO_EDMA, NULL)),MRR_SF0_EDMA_CH_1D_IN_PONG,false,shadowParam++,obj->numAdcSamples * BYTES_PER_SAMP_1D,MAX(obj->numRxAntennas / 2, 1),ADCBufferoffset * 2,0,0,NULL,(uintptr_t)obj);if (retVal < 0){return -1;}/** EDMA configuration for storing 1d fft output in transposed manner to L3.* It copies all Rx antennas of the chirp per trigger event.*//* Ping - Copies from ping FFT output (even chirp indices)  to L3 */retVal =EDMAutil_configType2a(obj->edmaHandle[EDMA_INSTANCE_A],(uint8_t *)(SOC_translateAddress((uint32_t)(&obj->fftOut1D[0]), SOC_TranslateAddr_Dir_TO_EDMA, NULL)),(uint8_t *)(&obj->radarCube[0]),MRR_SF0_EDMA_CH_1D_OUT_PING,false,shadowParam++,BYTES_PER_SAMP_1D,obj->numRangeBins,obj->numTxAntennas * numChirpTypes,obj->numRxAntennas,obj->numDopplerBins,1,NULL,(uintptr_t)obj);if (retVal < 0){return -1;}/* Ping - Copies from pong FFT output (odd chirp indices)  to L3 */retVal =EDMAutil_configType2a(obj->edmaHandle[EDMA_INSTANCE_A],(uint8_t *)(SOC_translateAddress((uint32_t)(&obj->fftOut1D[obj->numRxAntennas * obj->numRangeBins]),SOC_TranslateAddr_Dir_TO_EDMA, NULL)),(uint8_t *)(&obj->radarCube[0]),MRR_SF0_EDMA_CH_1D_OUT_PONG,false,shadowParam++,BYTES_PER_SAMP_1D,obj->numRangeBins,obj->numTxAntennas * numChirpTypes,obj->numRxAntennas,obj->numDopplerBins,1,NULL,(uintptr_t)obj);if (retVal < 0){return -1;}/****************************************** Interframe processing related EDMA configuration*****************************************//* For the max-vel enh implementation, we pull out twice as much range-gates per range bin.* Hence  EDMA BCNT is multiplied by 2. *//* Ping: This DMA channel is programmed to fetch the 1D FFT data from radarCube* matrix in L3 mem of even antenna rows into the Ping Buffer in L2 mem*/retVal =EDMAutil_configType1(obj->edmaHandle[EDMA_INSTANCE_A],(uint8_t *)(&obj->radarCube[0]),(uint8_t *)(SOC_translateAddress((uint32_t)(&obj->dstPingPong[0]), SOC_TranslateAddr_Dir_TO_EDMA, NULL)),MRR_SF0_EDMA_CH_2D_IN_PING,false,shadowParam++,obj->numDopplerBins * BYTES_PER_SAMP_1D,(obj->numRangeBins * obj->numRxAntennas * obj->numTxAntennas * numChirpTypes) / 2,obj->numDopplerBins * BYTES_PER_SAMP_1D * 2,0,0,NULL,(uintptr_t)obj);if (retVal < 0){return -1;}/* Pong: This DMA channel is programmed to fetch the 1D FFT data from radarCube* matrix in L3 mem of odd antenna rows into thePong Buffer in L2 mem*/retVal =EDMAutil_configType1(obj->edmaHandle[EDMA_INSTANCE_A],(uint8_t *)(&obj->radarCube[obj->numDopplerBins]),(uint8_t *)(SOC_translateAddress((uint32_t)(&obj->dstPingPong[obj->numDopplerBins]),SOC_TranslateAddr_Dir_TO_EDMA, NULL)),MRR_SF0_EDMA_CH_2D_IN_PONG,false,shadowParam++,obj->numDopplerBins * BYTES_PER_SAMP_1D,(obj->numRangeBins * obj->numRxAntennas * obj->numTxAntennas * numChirpTypes) / 2,obj->numDopplerBins * BYTES_PER_SAMP_1D * 2,0,0,NULL,(uintptr_t)obj);if (retVal < 0){return -1;}/* This EDMA Channel brings selected range bins  from detection matrix in* L3 mem (reading in transposed manner) into L2 mem for CFAR detection (in* range direction). */retVal =EDMAutil_configType3(obj->edmaHandle[EDMA_INSTANCE_A],(uint8_t *)0,(uint8_t *)0,MRR_SF0_EDMA_CH_DET_MATRIX2,false,shadowParam++,BYTES_PER_SAMP_DET, \obj->numRangeBins,(obj->numDopplerBins * BYTES_PER_SAMP_DET),BYTES_PER_SAMP_DET,0,NULL,(uintptr_t)obj);if (retVal < 0){return -1;}/********************************************************** These EDMA Channels are for Azimuth calculation. They bring* 1D FFT data for 2D DFT and Azimuth FFT calculation.********************************************************//* Ping: This DMA channel is programmed to fetch the 1D FFT data from radarCube* matrix in L3 mem of even antenna rows into the Ping Buffer in L2 mem.*/retVal =EDMAutil_configType1(obj->edmaHandle[EDMA_INSTANCE_A],(uint8_t *)NULL,(uint8_t *)(SOC_translateAddress((uint32_t)(&obj->dstPingPong[0]), SOC_TranslateAddr_Dir_TO_EDMA, NULL)),MRR_SF0_EDMA_CH_3D_IN_PING,false,shadowParam++,obj->numDopplerBins * BYTES_PER_SAMP_1D,MAX((obj->numRxAntennas * obj->numTxAntennas) / 2, 1),(obj->numDopplerBins * BYTES_PER_SAMP_1D * 2),0,0,NULL,(uintptr_t)obj);if (retVal < 0){return -1;}/* Pong: This DMA channel is programmed to fetch the 1D FFT data from radarCube* matrix in L3 mem of odd antenna rows into the Pong Buffer in L2 mem*/retVal =EDMAutil_configType1(obj->edmaHandle[EDMA_INSTANCE_A],(uint8_t *)NULL,(uint8_t *)(SOC_translateAddress((uint32_t)(&obj->dstPingPong[obj->numDopplerBins]), SOC_TranslateAddr_Dir_TO_EDMA, NULL)),MRR_SF0_EDMA_CH_3D_IN_PONG,false,shadowParam++,obj->numDopplerBins * BYTES_PER_SAMP_1D,MAX((obj->numRxAntennas * obj->numTxAntennas) / 2, 1),obj->numDopplerBins * BYTES_PER_SAMP_1D * 2,0,0,NULL,(uintptr_t)obj);if (retVal < 0){return -1;}return(0);
}

Cherry Zhou:

您好,您的问题我们升级到英文论坛给美国工程师看下。

,

Cherry Zhou:

您好,

可以试下设置 frameCfg、numberOfFrames = 1,然后使用断点,帮助把问题范围缩小下?

e2e.ti.com/…/ccs-awr1642-run-time-error-occurs-on-the-edma_startdmatransfer-function

,

JESU LEE:

你好,高精度程序DSS下的邮箱接收程序我给屏蔽了,会影响这么雷达启动吗

case MMWDEMO_MSS2DSS_HIGHACCURANGE_CFG:{/* Save cfarRange configuration */
//memcpy((void *)&gMmwDssMCB.dataPathObj.radarProcConfig.highAccuConfig,
//(void *)&message.body.highAccuRangeCfg, sizeof(RADARDEMO_highAccuRangeProc_config));break;}case MMWDEMO_MSS2DSS_ADCBUFCFG:{/* Save ADCBUF configuration */
//memcpy((void *)&gMmwDssMCB.dataPathObj.adcBufCfg,
//(void *)&message.body.adcBufCfg, sizeof(MmwDemo_ADCBufCfg));break;

,

Cherry Zhou:

我们跟进给工程师看下哈。

,

Cherry Zhou:

只需要屏蔽它们就可以了,不过可以再运行一下确认下,有什么错误。可以在 doxygen 中查找此错误代码,来查看这种更改是否会创建一对一的或者某种关联。 此外,删除这两个配置参数后,这里的目标是什么? 

,

JESU LEE:

感谢回复,删除这两个配置参数是为了屏蔽掉高精度液面高度算法的一些变量的创建,因为后续算法想把pa_18xx_dss的算法加入到high_accuracy_18xx_dss的算法框架下;具体的屏蔽的算法和加入的算法是这样的

void MmwDemo_dataPathConfigBuffers(uint32_t adcBufAddress, MmwDemo_Cfg*demoCfg, MmwDemo_DSS_DataPathObj *dataPathObj)
{radarOsal_heapConfig heapconfig[SOC_XWR18XX_DSS_MAXNUMHEAPS];RADARDEMO_highAccuRangeProc_errorCode rangeProcErrorCode;ProcessErrorCodes procErrorCode;int32_t tempNumSamples;uint32_t maxNum2, maxNum3;uint32_t numChirpTypes = 1;dataPathObj->ADCdataBuf = (cmplx16ImRe_t *)adcBufAddress;// heap initmemset(heapconfig, 0, sizeof(heapconfig));heapconfig[RADARMEMOSAL_HEAPTYPE_DDR_CACHED].heapType=RADARMEMOSAL_HEAPTYPE_DDR_CACHED;heapconfig[RADARMEMOSAL_HEAPTYPE_DDR_CACHED].heapAddr=(int8_t *) &gMmwL3[0];heapconfig[RADARMEMOSAL_HEAPTYPE_DDR_CACHED].heapSize=SOC_XWR18XX_DSS_L3RAM_BUFF_SIZE;heapconfig[RADARMEMOSAL_HEAPTYPE_DDR_CACHED].scratchAddr=NULL;/* not DDR scratch for TM demo*/heapconfig[RADARMEMOSAL_HEAPTYPE_DDR_CACHED].scratchSize=0;/* not DDR scratch for TM demo*/heapconfig[RADARMEMOSAL_HEAPTYPE_LL2].heapType=RADARMEMOSAL_HEAPTYPE_LL2;heapconfig[RADARMEMOSAL_HEAPTYPE_LL2].heapAddr=(int8_t *) &gMmwL2[0];heapconfig[RADARMEMOSAL_HEAPTYPE_LL2].heapSize=SOC_XWR18XX_DSS_L2_BUFF_SIZE;heapconfig[RADARMEMOSAL_HEAPTYPE_LL2].scratchAddr=(int8_t *)&gMmwL2Scratch[0];;heapconfig[RADARMEMOSAL_HEAPTYPE_LL2].scratchSize=SOC_XWR18XX_DSS_L2_SCRATCH_SIZE;heapconfig[RADARMEMOSAL_HEAPTYPE_LL1].heapType=RADARMEMOSAL_HEAPTYPE_LL1;heapconfig[RADARMEMOSAL_HEAPTYPE_LL1].heapAddr=NULL; /* not used as L1 heap in TM demo*/heapconfig[RADARMEMOSAL_HEAPTYPE_LL1].heapSize=0;/* not used as L1 heap in TM demo*/heapconfig[RADARMEMOSAL_HEAPTYPE_LL1].scratchAddr=(int8_t *) &gMmwL1[0];heapconfig[RADARMEMOSAL_HEAPTYPE_LL1].scratchSize=MMW_L1_SCRATCH_SIZE;heapconfig[RADARMEMOSAL_HEAPTYPE_HSRAM].heapType=RADARMEMOSAL_HEAPTYPE_HSRAM;heapconfig[RADARMEMOSAL_HEAPTYPE_HSRAM].heapAddr=(int8_t *) &gMmwHSRAM[0];heapconfig[RADARMEMOSAL_HEAPTYPE_HSRAM].heapSize=SOC_XWR18XX_DSS_HSRAM_BUFF_SIZE;heapconfig[RADARMEMOSAL_HEAPTYPE_HSRAM].scratchAddr=NULL;/* not HSRAM scratch for TM demo*/heapconfig[RADARMEMOSAL_HEAPTYPE_HSRAM].scratchSize=0;/* not HSRAM scratch for TM demo*/if(radarOsal_memInit(&heapconfig[0], SOC_XWR18XX_DSS_MAXNUMHEAPS) == RADARMEMOSAL_FAIL){System_printf("Error: radarOsal_memInit fail\n");}//	/*initializing configuration structure for signal processing chain */
//	MmwDemo_initConfigStruct(demoCfg, &dataPathObj->radarProcConfig);
//
//	dataPathObj->haRangehandle = (void *) RADARDEMO_highAccuRangeProc_create(&dataPathObj->radarProcConfig.highAccuConfig, &rangeProcErrorCode);
//if (rangeProcErrorCode > RADARDEMO_HIGHACCURANGEPROC_NO_ERROR)
//{
//System_printf("High Accuracy Range Estimation Module creat error = %d! Exit!\n", (uint8_t)rangeProcErrorCode);
//DebugP_assert(0);
//}
//	dataPathObj->rangeProcInput=	(RADARDEMO_highAccuRangeProc_input *) radarOsal_memAlloc(RADARMEMOSAL_HEAPTYPE_LL2, 0, sizeof(RADARDEMO_highAccuRangeProc_input), 8);
//	dataPathObj->rangeProcOutput=	(RADARDEMO_highAccuRangeProc_output *) radarOsal_memAlloc(RADARMEMOSAL_HEAPTYPE_LL2, 0, sizeof(RADARDEMO_highAccuRangeProc_output), 8);
//
//dataPathObj->outputDataToArm = (outputToARM_t *)radarOsal_memAlloc(RADARMEMOSAL_HEAPTYPE_DDR_CACHED, 0, sizeof(outputToARM_t), 128);
//	dataPathObj->scratchBuf=(int32_t *)radarOsal_memAlloc(RADARMEMOSAL_HEAPTYPE_LL1, 1, MMW_TM_DEMO_EDMASCATCHBUF_SIZE, 8); //fixed to 16k byte
//
///* PING PONG IN OUT */
//	dataPathObj->adcDataL2=(cmplx16ImRe_t *)&dataPathObj->scratchBuf[0];
//
//	dataPathObj->numPhyRxAntennas=(uint32_t)dataPathObj->radarProcConfig.numPhyRxAntenna;
//	dataPathObj->numTxAntennas=(uint32_t)dataPathObj->radarProcConfig.numTxAntenna;
//	tempNumSamples=(((uint32_t)dataPathObj->radarProcConfig.numAdcSamplePerChirp + 16/2) >> 4) << 4; // round up to multiple of 16!!!
//	dataPathObj->numAdcSamples=tempNumSamples;
//	dataPathObj->numChirpsPerFrame=(uint32_t)dataPathObj->radarProcConfig.numChirpPerFrame;
//	dataPathObj->chirpThreshold=1;
//	dataPathObj->sizeOutputInfo=sizeof(outputToARM_t) - sizeof(MmwDemo_detOutputHdr);////初始化多普勒、CFAR、DOA、聚类对象
//obj = &dataPathObj[0];numChirpTypes = 1;
//maxNum1 = dataPathObj->numRangeBins;maxNum2 = dataPathObj->numRxAntennas * dataPathObj->numRangeBins;maxNum3 = dataPathObj->numRangeBins * dataPathObj->numDopplerBins * dataPathObj->numRxAntennas * dataPathObj->numTxAntennas * numChirpTypes;dataPathObj->twiddle16x16_1D = (cmplx16ImRe_t *)radarOsal_memAlloc(RADARMEMOSAL_HEAPTYPE_LL2, 0, dataPathObj->numRangeBins*sizeof(cmplx16ImRe_t), 8);dataPathObj->window1D = (int16_t *)radarOsal_memAlloc(RADARMEMOSAL_HEAPTYPE_LL2, 0, (dataPathObj->numAdcSamples >> 1) * sizeof(int16_t), 8);dataPathObj->radarCube = (cmplx16ImRe_t *)radarOsal_memAlloc(RADARMEMOSAL_HEAPTYPE_DDR_CACHED, 0, maxNum3*sizeof(cmplx16ImRe_t), 8);dataPathObj->radarProcConfig.pFFT1DBuffer = (cplx16_t *)dataPathObj->radarCube;dataPathObj->fftOut1D = (cmplx16ImRe_t *)radarOsal_memAlloc(RADARMEMOSAL_HEAPTYPE_LL2, 0, 2 * maxNum2*sizeof(cmplx16ImRe_t), 8);dataPathObj->dopplerProcOut[PING] = (float *)radarOsal_memAlloc(RADARMEMOSAL_HEAPTYPE_LL2, 0, sizeof(float)*dataPathObj->numDopplerBins, 8);dataPathObj->dopplerProcOut[PONG] = (float *)radarOsal_memAlloc(RADARMEMOSAL_HEAPTYPE_LL2, 0, sizeof(float)*dataPathObj->numDopplerBins, 8);dataPathObj->outBuffCntxt = (RadarDsp_outputBuffCntxt *)radarOsal_memAlloc(RADARMEMOSAL_HEAPTYPE_LL2, 0, sizeof(RadarDsp_outputBuffCntxt), 8);dataPathObj->outBuffCntxt->numBuff = RadarDsp_outputDataType_MAX;dataPathObj->outBuffCntxt->elem[RadarDsp_outputDataType_OBJ_DATA].type = RadarDsp_outputDataType_OBJ_DATA;dataPathObj->outBuffCntxt->elem[RadarDsp_outputDataType_OBJ_DATA].buff = (radarProcessOutputToTracker *)radarOsal_memAlloc(RADARMEMOSAL_HEAPTYPE_LL2, 0, sizeof(radarProcessOutputToTracker), 8);dataPathObj->scratchBuf = (int32_t *)radarOsal_memAlloc(RADARMEMOSAL_HEAPTYPE_LL1, 1, MMW_TM_DEMO_EDMASCATCHBUF_SIZE, 8); //fixed to 16k bytedataPathObj->adcDataIn =(cmplx16ImRe_t *)&dataPathObj->scratchBuf[0];dataPathObj->dstPingPong= (cmplx16ImRe_t *)&dataPathObj->scratchBuf[2 * dataPathObj->radarProcConfig.fftSize1D];//dopppler、CFAR、DOA、cluster算法创建dataPathObj->radarProcessHandle = (void *) radarProcessCreate(&dataPathObj->radarProcConfig, &procErrorCode);if (procErrorCode > PROCESS_OK){System_printf("radar process create error! Exit!");}MmwDemo_printHeapStats();radarOsal_memDeInit();
}

,

Cherry Zhou:

跟进给工程师了,应该会在下周工作日给您答复。

,

JESU LEE:

按照《MMWAVE SDK User Guide 》,当配置1帧下1个chirp时,EDMA是没问题的;

配置无限帧下2个chirp时,插入断点会出现我提问中的问题,xdc.runtime.Error.raise: terminating execution[C674X_0] {module#38}: line 99: error {id:0x10000, args:[0x20034afd, 0x20034afc]}xdc.runtime.Error.raise: terminating execution;

配置1帧下2个chirp时,会出现以下Error: Asynchronous Event SB Id 15 not handled;

上述现象出现的原因是断点调试只支持1个FRAM1个CHIRP?

有没有方法让他配置1个帧多个chirp让它也能断点单步调试?

,

Cherry Zhou:

暂时忽略1帧错误、在您接收到 xdc.runtime.Error.raise: Terminating execution [C674x_0] {module#38}: Line 99: Error {id:0x10000, args:[0x20034af, 0x20034afc]} 时是否给出了特定的错误代码? 应该时是有一个的,如果没有的话我们很难帮助debug。

赞(0)
未经允许不得转载:TI中文支持网 » IWR1843: 程序运行到启动EDMA报错,程序停止
分享到: 更多 (0)