工具/软件:
我将在 AWR2944EVM 的 DDM 演示中添加自定义处理功能。 最终要添加一个用于分类数据的 STFT(短时间 FFT)、但对于初学者、我在 objectdetection.c 中写入一个字节到存储器、并尝试通过 UART 将其传输到 PC。
正如我在调试器中观察到的那样、DPM 上传到 dss_main.c 并在调试模式下测试_printed。 但是、当我尝试在 mss_main.c 中读取这些数据时、将我的数据写入 dss_main.c 中的共享存储器后、会失败并出现以下错误(请注意 DSS 和 MSS 测试打印 83、这是我在 objectdetection.c 中写入存储器的内容 — 83 与 STFT 一样):
启动传感器(发出 MMWAVE_START)
[C66xx_DSP]调试:DSS = 0x53 (83) 上的 STFT PAYLOD[0]
[Cortex_R5_0]调试:MSS 上的 STFT PAYLOY[0]= 0x53 (83)
[C66xx_DSP]调试:DSS = 0x53 (83) 上的 STFT PAYLOD[0]
[Cortex_R5_0]调试:MSS 上的 STFT PAYLOY[0]= 0x53 (83)
UART 处理未完成:numObjOut 37 Time 207
断言:20.910911s:./mss/mss_main.c:MmwDemo_DPC_ObjectDetection_reportFxn:2738:0 失败!!!
第 2738 行是假时执行的 else 语句:gMwMssMCB.stats.isLastFrameDataProcessed 这向我表明消息同步或可能是我的数据读取存在问题、尽管有趣的是 MSS 和 DSS 都能正确地看到我的写入数据。
因此、我问自己以下问题、如果您能帮助我解决这些问题、那将会很好:
- 将 DPM 结果复制到共享 HSRAM 中的正确方法是什么?我在草图中缺少某些内容、如缓存无效等?
- 在 MSS 端读取这些数据的正确方法是什么?
- 我知道默认演示使用了 MmWDemo_HSRAM 结构中的有效载荷“对象“。 您建议使用什么方法将自定义数据传输到 MSS?
感谢所有帮助、
此致
标记
为了给您提供更多的上下文、我所做的修改如下所示:
- 在 MSS 端、我添加的唯一修改是在 MmwDemo_transmitProcessedOutput 中、当对此进行注释后、演示会正常工作:
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////// STFT 数据转换////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
stftBusPtr = gMmwMssMCB.ptrResult.ptrBuffer[2];
if(stftBusPtr != NULL )
{
//stftSize = gMmwMssMCB.ptrResult.size[2];
stftLocalPtr =(uint8_t *) AddrTranslateP_getLocalAddr ((uint32_t) stftBusPtr);
//测试打印我们已阅读的内容并检查它是否为十六进制=0x53 和十进制=83
Uint8_t firstByte = stftLocalPtr[0];
test_print(“调试:mss 上的 STFT payload[0]= 0x%02x (%u)、长度=%u 字节\n“、firstByte、firstByte、tl[tlvIdx].length);
}
//////////////////////// 数据转换结束/////////////////
- 在 DSS 方面、我添加了一个自定义函数并对 dpmTask 进行了修改:
静态 int32_t MmwDemo_copySTFTToHSRAM (MwDemo_HSRAM *ptrHsramBuffer、const void *buf、uint32_t numBytes)
{
uint8_t *ptrCurr;
uint32_t freeBytes;
if ((ptrHsramBuffer = NULL)||(buf = NULL))
{
返回–1;
}
// ptrCurr 是 HSRAM 中我们要写入的位置、
//有效载荷是 MmwDemo_HSRAM 结构中专为附加数据设计的未使用时隙
ptrCurr = ptrHsramBuffer->payload;
FreeBytes = MMWDEMO_HSRAM_PAYLOAD_SIZE;
if (numBytes > freeBytes)
{
返回–1;
}
//将 STFT 数据复制到有效载荷的起始位置[]
memcpy (ptrCurr、buf、numBytes);
//返回保留的字节数
返回 (int32_t)(freeBytes - numBytes);
}
生成任务
if ((RetVal = MmwDemo_copyResultToHSRAM (&gHSRAM、Result、&gMmwDssMCB.dataPathObj.subFrameStats[Result->subFrameIdx])>= 0)
{
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////// 将 STFT 结果写入共享的 HSRAM ///////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//将 STFT 结果复制到 HSRAM
retVal = MmwDemo_copySTFTToHSRAM (&gHSRAM、resultBuffer.ptrBuffer[2]、resultBuffer.size[2]);
gHSRAM.outStats.interFrameProcessingMargin -=((CycleCounterP_getCount32 ()- StartTime)/DSP_CLOCK_MHz);
If (RetVal < 0)
{
TEST_PRINT(“错误:STFT -> HSRAM 失败[错误:%d]\n“、RetVal);
MmwDemo_debugAssert (0);
}
uint8_t first =((uint8_t*) gHSRAM.PAYLOAD)[0];
test_print(“debug:DSS 上的 STFT payload[0]= 0x%02x (%u)\n“,第一个,第一个);
//将 DPM 插槽 2 重新分配到 HSRAM 中 STFT 有效载荷的新地址、
//大小与原来一样、因此不需要更新它(就像上面的原始代码一样)
resultBuffer.ptrBuffer[2]=(uint8_t *)&gHSRAM.PAYLOAD;
//修改结束:发送所有三个缓冲区、保持不变
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//更新 DPM 缓冲区
resultBuffer.ptrBuffer[0]=(uint8_t *)&gHSRAM.Result;
resultBuffer.ptrBuffer[1]=(uint8_t *)&gHSRAM.outStats;
resultBuffer.size[1]= sizeof (MmwDemo_output_message_stats);
/*是:结果可用发送给他们。 */
retVal = DPM_sendResult (gMmwDssMCB.dataPathObj.objDetDpmHandle、TRUE、&resultBuffer);
If (RetVal < 0)
{
test_print(“错误:无法将结果[错误:%d]发送到 remote\n“、RetVal);
}
}