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.

[参考译文] IWR6843ISK-ODS:DPC_PreStartCfg 使用硬编码配置在工程中发送错误

Guru**** 2560390 points
Other Parts Discussed in Thread: IWR6843ISK, IWR6843, SYSBIOS

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/sensors-group/sensors/f/sensors-forum/905078/iwr6843isk-ods-dpc_prestartcfg-send-error-in-project-with-hardcoded-configuration

器件型号:IWR6843ISK-ODS
主题中讨论的其他器件:IWR6843ISKIWR6843SYSBIOS

您好!

我正在进行 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

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Denis:

    我已经通过修改 CLI 库 来响应您的另一个线程、为您提供了一种硬编码传感器配置的替代方法。 请使用该方法。 目前、我们没有使用上述方法对配置进行硬编码的示例。

    一般而言、对于该异常或任何调试、只需查看代码就很难对异常的原因进行注释。 您需要通过单步进入代码并将其本地化为函数或行来缩小其范围。

    您首先需要编译代码以启用语句级步进(调试)。 项目中的默认选项使用-O3优化、该优化不允许语句级调试、因此请按如下所示将其更改为1级(在 CCS 中导入项目后)、然后重新编译项目。

     

    此致

    尼廷

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Nitin!

    我的项目中没有优化(优化级别-关闭)。 我们的项目切勿使用任何 CLI 函数(包括修改的 CLI 库文件)、这一点很重要。

    这是发生错误时的调用堆栈。

    DPC_ObjDet_rangeConfig 函数中会出现异常错误、因为传递给该函数的 staticCfg 在所有字段中都有零(包括 numTxTianS、使 hwRes->dcRangeSigMeanSize 等于0、然后导致 MemoryP_ctrlAlloc 错误)。

    这是调试器中的 DPC_ObjDET_RANGEConfig 调用

    这很奇怪、因为 staticCfg 在传递到 DPC_ObjDET_preStartConfig 时具有正确的字段

    DPC_ObjDet_preStartConfig 内部 ,在 DPC_ObjDet_rangeConfig 调用之前,staticCfg 被分配给  SubFrameObj * obj 的相应字段。 完成此分配后、所有字段都变为0。 这是该分配的右侧(RHS)和左侧(LHS)


    当我调试 ODS_POINT_CLOUD 68xx_HWA 实验时、此行中的 RHS 和 LHS 分配是相同的。

    非常奇怪的问题。

    请告诉我是否需要提供有关此问题的更多信息。

    感谢你能抽出时间。

    _

    Denis

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Denis:

    查看空的 staticCfg 结构、似乎未 调用解析器函数 MmwDemo_RFParser_parseCtrlConfig、因为配置结构已填充在此函数中。 因此、请查看您的初始化序列以确保完成此操作。

    但是、如前所述、我们目前无法为该方法提供更多支持、因为我们尚未实现此示例。

    同时请使用 CLI 方法。 我不知道为什么您不能使用它、但如果您担心是否需要在您的板上提供 COM 端口(如果您使用的是定制板)、 它不要求您实际在电路板上安装或连接 UART、因为命令直接从软件发送到器件上的 COM 端口。

    此致

    尼廷

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Nitin

    这是一个奇怪的问题,以更奇怪的方式得到解决:

    我刚刚复制了我的项目、删除了一些注释、问题消失了-发送 prestartConfig 时没有错误。

    我添加了传感器启动功能、该功能几乎与 ODS_POINT_CLOUD _68xx_HWA 实验室中的功能完全相同、似乎工作正常、因为我接收到 RL_RF_AE_FRAME_TRIGGER_RDY_SB 消息 mmWave eventFxn 函数。

    总之、感谢您的支持。

    _

    Denis

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Denis:

    感谢您的更新。 请随时创建新主题以获得进一步支持。

    此致

    尼廷