主题中讨论的其他器件:IWR6843ISK、 IWR6843、 SYSBIOS
您好!
我正在进行 IWR6843ISK ODS 传感器的硬编码配置、而不使用 CLI 功能。 我使用 ODS_POINT_CLOUD 68xx_HWA 实验室作为参考项目。
我有 Init、mmwaveCtrl 和 DPM_Task。 我有 SensorConfig 任务、而不是 CLI_task。
在 SensorConfig 任务中,我调用 MMWAVE_OPEN 和 MMWAVE_CONFIG,然后调用 dataPathConfig()函数,该函数应将 DPC_OBJDET_IOCTL__STATUS_PRE_START_COMON_CFG 和 DPC_OBJDET_IOCTL__STATUS_PRE_START_CFG 发送到 DPC。
DPC_OBJDET_IOCTL__static_pre_start_common_CFG 在没有错误的情况下完成、但当我使用 ODS_POSP_cloud_68xx_hwa 实验中基于 profile_iwr6843_ods_3d.cfg 的值填充 DPC_ObjectDetection_PreStartCfg 结构、然后发送 DPC_OBJDET_IOCTL_STATUS_PRE_START_CFG I GET
TI.SYSBIOS.堆.HeapMem:第259行:断言故障:A_zeroBlock:无法分配大小0
我确实比较了我的项目中 DPC_ObjectDetection_PreStartCfg 的内容、以及调试会话中 ODS_POINT_CLOUD _68xx_hwa 的内容、这两种结构几乎完全相同。
您能建议解决此问题的方法吗?
以下是我的 dataPathConfig()函数代码。
int32_t dataPathConfig (void){
DPC_ObjectDetection_PreStartCommonCfg preStartCommonCfg;
DPC_ObjectDetection_PreStartCfg preStartCfg;
DPC_ObjectDetection_StaticCfg StaticCfg;
DPC_ObjectDetection_DynCfg dynCfg;
int32_t RetVal,错误代码;
//---- 发送 DPCpreStartCommonConfig
preStartCommonCfg.numSubFrames = 1;
preStartCommonCfg.antDef = antDef_IWR6843ODS;
错误代码= DPM_ioctl (DPM、DPC_OBJDET_IOCTL__STATUS_PRE_START_COMON_CFG、
&preStartCommonCfg、sizeof (DPC_ObjectDetection _PreStartCommonCfg);
if (errCode = 0){
printf ("DPM 预启动公共 cfg 正常!!!\n");
} 否则{
printf ("DPM 预启动常见 cfg 错误%d\n"、errCode);
}
//------ 填写并发送 DPCpreStartConfig
preStartCfg.subFrameNum = 1;
//填充 StaticCfg
//------ ADCBuf 数据
staticCfg.ADCBufData.data =(void *) SOC_XWR68XX_MSS_ADCBUF_BASE_ADDRESS;
staticCfg.ADCBufData.dataProperties.adcBits = 2;
staticCfg.ADCBufData.dataProperties.dataFmt = DPIF_DATAFORMATT_scen16_Imre;
staticCfg.ADCBufData.dataProperty.interleave = DPIF_RXCHAN_NON_InterleASE_MODE;
staticCfg.ADCBufData.dataProperties.numAdcSamples = profileCfg.numAdcSamples;
staticCfg.ADCBufData.dataProperties.numChirpsPerChirpEvent=1;
//--天线编号和顺序,ADCBuf 偏移
uint8_t numRx 天线= 0U;
uint8_t 通道;
int32_t rxChanOffsetIndx=0;
uint16_t currentChanOffset = 0;
uint16_t numBytePerSample = 4U;
uint32_t chanDataSize = profileCfg.numAdcSamples * numBytePerSample;
chanDataSize =(chanDataSize + 15U)/16U * 16U;
对于(通道= 0U;通道< SYS_common_NUM_RX_CHANNEL;CHANNEL ++){
if (openCfg.chCfg.rxChannelEn &(0x1U <<通道)){
staticCfg.rxAntOrder[numRx天 线]=通道;
numRx天 线++;
staticCfg.ADCBufData.dataProperties.rxChanOffset[rxChanOffsetIndx++]= currentChanOffset;
currentChanOffset += chanDataSize * staticCfg.ADCBufData.dataProperties.numChirpsPerChirpEvent;
} 否则{
staticCfg.rxAntOrder[通道]= 0U;
}
}
staticCfg.ADCBufData.dataProperties.numRx天 线= numRx天 线;
staticCfg.ADCBufData.dataSize = numRx天 线* profileCfg.numAdcSamples * sizeof (cmplx16ImRe_t);
对于(通道= 0U;通道< SYS_common_NUM_TX_ANAGUIDS;通道++){
staticCfg.txAntOrder[通道]= mathUtils_FloLog2 (chirpCfg[通道].txEnable);
}
//---- 向 в ADCBuf 发送命令
uint32_t rxChanMask = 0xF;
RetVal = ADCBuf_control (adcbufHandle、ADCBufMMWave_CMD_CHANNEL 禁用、(void *)&rxChanMask);
if (RetVal < 0){
printf ("ADCBufMMWave_CMD_CHANNEL 禁用错误\n");
} 否则{
printf ("ADCBufMMWave_CMD_CHANNEL 禁用确定!\n"\};
}
ADCBuf_dataFormat dataFormat;
dataFormat.adcOutFormat = staticCfg.ADCBufData.dataProperties.dataFmt;
dataFormat.channelInterleave = staticCfg.ADCBufData.dataProperty.interleave;
dataFormat.sampleInterleave= 1;
RetVal = ADCBuf_control (adcbufHandle、ADCBufMMWave_CMD_CONF_DATA_format、(void *)&dataFormat);
if (RetVal < 0){
printf ("ADCBufMMWave_CMD_CONF_DATA_FORMAT 错误\n");
} 否则{
printf ("ADCBufMMWAVE_CMD_CONF_DATA_FORMAT 确定!\n");
}
ADCBuf_RxChanConf rxChanConf;
memset ((void*)&rxChanConf、0、sizeof (ADCBuf_RxChanConf));
对于(CHANNEL = 0;CHANNEL < SYS_COMON_NUM_RX_CHANNEL;CHANNEL ++){
if (openCfg.chCfg.rxChannelEn &(0x1U <<通道)){
rxChanConf.channel =通道;
RetVal = ADCBuf_control (adcbufHandle、ADCBufMMWave_CMD_CHANNEL、(void *)&rxChanConf);
if (RetVal < 0){
printf ("ADCBufMMWave_CMD_CHANGE_ENABLE 通道%d 错误\n"、通道);
} 否则{
printf ("ADCBufMMWave_CMD_CHANGE_ENABLE OK!\n");
}
}
uint32_t 线性 байтной переменной 值= staticCfg.ADCBufData.dataProperties.numChirpsPerChirpEvent;//привести к 4 μ s
RetVal = ADCBuf_control (adcbufHandle、ADCBufMMWave_CMD_SET_PING_CHIRP_THRESHOLD、(void *)&chirpThresholdVal);
if (RetVal < 0){
printf ("ADCBufMMWave_CMD_SET_PING_CHIRP_THRESHOLD 错误\n");
} 否则{
printf ("ADCBufMMWave_CMD_SET_PING_CHIRP_THRESHOLD 确定!\n");
}
RetVal = ADCBuf_control (adcbufHandle、ADCBufMMWave_CMD_SET_PON_CHIRP_THRESHOLD、(void *)&chirpThresholdVal);
if (RetVal < 0){
printf ("ADCBufMMWave_CMD_SET_PON_CHIRP_THRESHOLD 错误\n");
} 否则{
printf ("ADCBufMMWave_CMD_SET_PON_CHIRP_THRESHOLD 确定!\n");
}
//---- 虚拟天线的数量
uint32_t numTxAntAzim = 2;// azimTxAntMask = 0b101
uint32_t numTxAnteles= 1;// elevTxAntMask = 0b010
staticCfg.numVirtualAntAzim = numTxAntAzim * staticCfg.ADCBufData.dataProperties.numRxTianA;// 2 * 4 = 8
staticCfg.numVirtualAntesor= numTxAntesorp * staticCfg.ADCBufData.dataProperties.numRxTian天 线;// 1 * 4 = 4
staticCfg.numVirtualAntAntTANAKS = staticCfg.numVirtualAzim + staticCfg.numVirtualAntElev; // 8 + 4 = 12
//----
int16_t frameTotalChirps =(ctrlCfg.u.frameCfg.frameCfg.chirpEndIdx - ctrlCfg.u.frameCfg.frameCfg.chirpStartIdx)+ 1;
staticCfg.numChirpsPerFrame = frameTotalChirps * ctrlCfg.u.frameCfg.frameCfg.numLoops;
//----
staticCfg.numRangeBins = mathUtils_pow2rounup (profileCfg.numAdcSamples);
staticCfg.rangeStep =
SPED_ON_LIGHT_IN_MEAS_PER_SEC *
profileCfg.digOutSampleRate * 1e3 /
(2 * profileCfg.freqSlopeConst *((freqScaleFactor*1e3*900)/(1U <<26)* 1e12 * staticCfg.numRangeBins);
//----
StaticCfg.numTxTien天 线= 3;
staticCfg.numDopplerChirps = staticCfg.numChirpsPerFrame / staticCfg.numTxTien天 线;
staticCfg.numDopplerBins = mathUtils_pow2roundup (staticCfg.numDopplerChirps);
staticCfg.dopplerStep = speed_for_light_in_meters_per_sec /
(2.0 * profileCfg.startFreqConst/(1U <<26)* freqScaleFactor* 1e9 *
(profileCfg.idleTimeConst+ profileCfg.rampEndTime)/1000.*10*1.e-6 *
staticCfg.numDopplerBins *
StaticCfg.numTx 天线);
//----
staticCfg.isValidProfileHasOneTxPerChirp = 1;
///---------------- 添加 StaticCfg
preStartCfg.staticCfg = staticCfg;
//填充 dynCfg
//---- 范围 CFAR
DPU_CFARCAProC_CfarCfg * cfarCfgRange =&dynCfg.cfarCfgRange;
cfarCfgRange->averageMode = 2; // CASO
cfarCfgRange->winLen = 8;
cfarCfgRange->guardLen = 4;
cfarCfgRange->noeDivShift = 3;
cfarCfgRange->cyclicMode = 0;
cfarCfgRange->thresholdScale = convertCfarToLinear (15.0、12);// 480.0为15.0dB
cfarCfgRange->peakGroupingEn = 0;
//---- 多普勒 CFAR
DPU_CFARCAProC_CfarCfg * cfarCfgpplop=&dynCfg.cfarCfgpploppler;
cfarCfgpplop->averageMode = 0; // CA
cfarCfgpplop->winLen = 4;
cfarCfgpplop->guardLen = 2;
cfarCfgpplopply->noeDivShift = 3;
cfarCfgpplop->cyclicMode = 1;
cfarCfgpplop->thresholdScale = convertCfarToLinear (15.0、staticCfg.numVirtualTensa);// 480.0为15.0dB
cfarCfgpplop->peakGroupingEn = 0;
cfarCfgpplop->peakGroupingScheme = 0;
//----
DPU_AoAProc_MultiObjBeamFormingCfg * multiObjBeamFormingCfg =&dynCfg.multiObjBeamFormingCfg;
multiObjBeamFormingCfg->已启用= 1;
multiObjBeamForming Cfg->multiPeakThrsScal = 0.5;
//---- 校准直流范围特征
DPU_RangeProC_CalibDcRangeSigCfg * calibDcRangeSigCfg =&dynCfg.calibDcRangeSigCfg;
calibDcRangeSigCfg->enabled = 0;
calibDcRangeSigCfg->nveBinIdx =-5;
calibDcRangeSigCfg->positiveBinIdx = 8;
calibDcRangeSigCfg->numAvgChirps = 256;
//---- 杂波消除
DPC_ObjectDetection_StaticClutterRemovalCfg_Base * StaticClutterRemovalCfg =&dynCfg.staticClutterRemovalCfg;
staticClutterRemovalCfg->enabled = 0;//禁用
//----
DPU_AoAProc_FovAoaCfg * fovAoaCfg =&dynCfg.fovAoaCfg;
fovAoaCfg->minAzimuthDeg =-90;
fovAoaCfg->maxAzimuthDeg = 90;
fovAoaCfg->minElevationDeg =-90;
fovAoaCfg->maxElevationDeg = 90;
//----
DPU_CFARCAProC_FovCfg * fovRange =&dynCfg.fovRange;
fovRange->min = 0.25;
fovRange->max = 15.0;
//----
DPU_CFARCAProc_FovCfg * fovpplop勒=&dynCfg.fovp勒;
fovpplop->min =-13.39;
fovpplop->max = 13.39;
//---- 扩展最大速度
DPU_AoAProc_ExtendedMaxVelocityCfg * extMaxVelCfg =&dynCfg.extMaxVelCfg;
extMaxVelCfg->enabled = 0;//禁用
//----
dynCfg.prepareRangeAzimuthHeatMap = 0;
preStartCfg.dynCfg = dynCfg;
错误代码= DPM_ioctl (DPM、DPC_OBJDET_IOCTL__STATUS_PRE_START_CFG、
preStartCfg (&P)、
sizeof (DPC_ObjectDetection_PreStartCfg));
if (错误代码==0)
{
printf ("DPM 预启动配置正常!!!\n");
}
其他
{
printf ("DPM 预启动 cfg 错误%d\n"、errCode);
}
返回0;
}
我使用的是毫米波 SDK 3.3。
_
Denis

