Thread 中讨论的其他器件:AWR1642
工具与软件:
大家好、我目前正在开发一个定制项目、因此给了 DSP_fft32x32()生成逻辑功能 interFrameProcessing(). 但是、在多次运行函数之后(随机次数)、程序会崩溃。
调试过程中、我注意到一个奇怪的现象:的输入参数之一 DSP_fft32x32()、 obj->pVitalSignsBuffer_Cplx的.imag成员值意外修改。 不过、根据我的理解、 DSP_fft32x32()不应发生变化 obj->pVitalSignsBuffer_Cplx. 在我注释掉时 DSP_fft32x32().imag的参数obj->pVitalSignsBuffer_Cplx保持为零。
我已检查内存冲突或覆盖。 在"Expressions"窗口中、对于以下数据结构、存储器分配显示正常:
obj->pVitalSignsSpectrumTwiddle32x32obj->pVitalSignsBuffer_Cplxobj->pVitalSigns_SpectrumCplx
每个信号的数据长度均为1024、和 obj->breathingWfm_Spectrum_FftSize也设置为1024。
此外、当我注释掉时 DSP_fft32x32()中的数据 obj->pVitalSignsSpectrumTwiddle32x32和 obj->pVitalSignsBuffer_Cplx保持稳定、并且程序不会崩溃。 这使我怀疑这个问题可能与执行有关 DSP_fft32x32().
我想问:
- 此问题的可能原因是什么?
- 是否有任何其他方法来进一步调查问题?
- 如何更准确地解释控制台中显示的错误代码?
下面、我提供了相关的错误消息和代码片段。 如果有任何见解、将不胜感激。 谢谢!
DSP_fft32x32()函数调用:
// Input to the FFT needs to be complex
memset((uint8_t *)obj->pVitalSignsBuffer_Cplx, 0, obj->breathingWfm_Spectrum_FftSize * sizeof(cmplx32ReIm_t));
for (loopIndexBuffer = 0; loopIndexBuffer < obj->circularBufferSizeBreath; loopIndexBuffer++)
{
obj->pVitalSignsBuffer_Cplx[loopIndexBuffer].real = (int32_t) obj->scale_breathingWfm*obj->pVitalSigns_Breath_CircularBuffer[loopIndexBuffer];
obj->pVitalSignsBuffer_Cplx[loopIndexBuffer].imag=0;
}
// Input is overwritten by the DSP_fft32x32 function
DSP_fft32x32((int32_t*) obj->pVitalSignsSpectrumTwiddle32x32,
obj->breathingWfm_Spectrum_FftSize,
(int32_t*) obj->pVitalSignsBuffer_Cplx,
(int32_t*) obj->pVitalSigns_SpectrumCplx);
控制台错误代码:
A0=0xfffffd48 A1=0x0
A2=0x814a08 A3=0x0
A4=0x818f80 A5=0x0
A6=0x200c0e90 A7=0x814b00
A8=0x2 A9=0x7ec8f4
A10=0x1 A11=0x7f2ca0
A12=0x7f7e36 A13=0x818040
A14=0x0 A15=0x7eb410
A16=0x0 A17=0x7f6b94
A18=0x80 A19=0x0
A20=0x0 A21=0x80
A22=0x818f80 A23=0x0
A24=0x7ed560 A25=0x0
A26=0x2 A27=0x817a08
A28=0x1 A29=0x0
A30=0x4783 A31=0x818438
B0=0x0 B1=0x3
B2=0x0 B3=0x7eb644
B4=0xfffffffa B5=0x4c
B6=0x1 B7=0x0
B8=0x0 B9=0x817c28
B10=0x80 B11=0x0
B12=0x0 B13=0x0
B14=0x7ed560 B15=0x4783
B16=0x0 B17=0x7
B18=0x14010103 B19=0x0
B20=0x300 B21=0x0
B22=0x0 B23=0x0
B24=0x0 B25=0x0
B26=0x0 B27=0x0
B28=0x0 B29=0x0
B30=0x80 B31=0x0
NTSR=0xffffffff
ITSR=0x0
IRP=0x0
SSR=0x1
AMR=0x812cb1
RILC=0x818da8
ILC=0x8187e4
Exception at 0xe00214
EFR=0x2 NRP=0xe00214
Internal exception: IERR=0x180
Loop buffer exception
Missed stall exception
{module#23}: line 256: error {id:0xb0000, args:[0x8184d4, 0x4783]}
xdc.runtime.Error.raise: terminating execution
内存分配代码:
/************************/
/* Static L3 allocation */
/************************/
/* Only for VSD subFrame */
obj = &objIn[1];
volatile uint32_t prevL3_end = 0U;
for(subFrameIndex = 0; subFrameIndex < NUM_SUBFRAMES; subFrameIndex++)
{
if(prevL3_end < l3HeapEndLocationForSubframe[subFrameIndex])
{
prevL3_end = l3HeapEndLocationForSubframe[subFrameIndex];
}
}
MMW_ALLOC_BUF(pRangeProfileCplx, cmplx16ReIm_t,
prevL3_end, SYS_MEMORY_ALLOC_DOUBLE_WORD_ALIGN_DSP,
obj->numRangeBins);
MMW_ALLOC_BUF(pVitalSigns_Breath_CircularBuffer, float,
pRangeProfileCplx_end, SYS_MEMORY_ALLOC_DOUBLE_WORD_ALIGN_DSP,
obj->circularBufferSizeBreath);
MMW_ALLOC_BUF(pVitalSigns_Heart_CircularBuffer, float,
pVitalSigns_Breath_CircularBuffer_end, SYS_MEMORY_ALLOC_DOUBLE_WORD_ALIGN_DSP,
obj->circularBufferSizeHeart);
MMW_ALLOC_BUF(pMotionCircularBuffer, float,
pVitalSigns_Heart_CircularBuffer_end, SYS_MEMORY_ALLOC_DOUBLE_WORD_ALIGN_DSP,
obj->motionDetection_BlockSize);
MMW_ALLOC_BUF(pDopplerWindow, float,
pMotionCircularBuffer_end, SYS_MEMORY_ALLOC_DOUBLE_WORD_ALIGN_DSP,
DOPPLER_WINDOW_SIZE);
MMW_ALLOC_BUF(pVitalSignsSpectrumTwiddle32x32, cmplx32ReIm_t,
pDopplerWindow_end, SYS_MEMORY_ALLOC_DOUBLE_WORD_ALIGN_DSP,
obj->breathingWfm_Spectrum_FftSize);
MMW_ALLOC_BUF(pVitalSignsBuffer_Cplx, cmplx32ReIm_t,
pVitalSignsSpectrumTwiddle32x32_end, SYS_MEMORY_ALLOC_DOUBLE_WORD_ALIGN_DSP,
obj->breathingWfm_Spectrum_FftSize);
MMW_ALLOC_BUF(pVitalSigns_SpectrumCplx, cmplx32ReIm_t,
pVitalSignsBuffer_Cplx_end, SYS_MEMORY_ALLOC_DOUBLE_WORD_ALIGN_DSP,
obj->breathingWfm_Spectrum_FftSize);
MMW_ALLOC_BUF(pVitalSigns_Breath_AbsSpectrum, float,
pVitalSigns_SpectrumCplx_end, SYS_MEMORY_ALLOC_DOUBLE_WORD_ALIGN_DSP,
obj->breathingWfm_Spectrum_FftSize);
已obj->pVitalSignsBuffer_Cplx在 Memory Browser 中检查并发现该.imag字段被意外修改DSP_fft32x32():

已检查obj->pVitalSignsSpectrumTwiddle32x32obj->pVitalSignsBuffer_Cplxobj->pVitalSigns_SpectrumCplx Expressions 窗口中三个缓冲区(、和)的存储器分配位置:
