我目前正在開發一個客製化的專案,在 interFrameProcessing()
函數中調用了 DSP_fft32x32()
,但在執行該函數時,程式運行數次(隨機次數)後便會發生崩潰。
在調試過程中,我發現了一個奇怪的現象:DSP_fft32x32()
的其中一個輸入參數 obj->pVitalSignsBuffer_Cplx
的 .imag
成員值會被改變。然而,根據我的理解,DSP_fft32x32()
不應該修改 obj->pVitalSignsBuffer_Cplx
的內容。當我註解掉 DSP_fft32x32()
後,obj->pVitalSignsBuffer_Cplx
的 .imag
參數能夠保持為零。
我已經檢查了記憶體衝突或覆蓋的問題,從 Expressions 監視記憶體分配時,發現以下數據結構的記憶體分配皆為正常:
obj->pVitalSignsSpectrumTwiddle32x32
obj->pVitalSignsBuffer_Cplx
obj->pVitalSigns_SpectrumCplx
它們的數據長度皆為 1024,obj->breathingWfm_Spectrum_FftSize
也已設定為 1024。
此外,當我註解掉 DSP_fft32x32()
時,obj->pVitalSignsSpectrumTwiddle32x32
與 obj->pVitalSignsBuffer_Cplx
內的數據都維持正常,且程式不會崩潰。因此,我推測問題可能與 DSP_fft32x32()
的執行有關。
想請教:
- 這樣的問題可能是什麼原因導致的?
- 還有哪些方式可以進一步排查?
- 針對 Console 顯示的錯誤碼,有什麼方法可以更精確地解讀?
以下提供相關的錯誤訊息與程式碼片段,謝謝!
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);
Console錯誤碼:
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);
在Memory Brower查看obj->pVitalSignsBuffer_Cplx中的數據, .imag項出現被DSP_fft32x32更改的問題:
Expressions中查看obj->pVitalSignsSpectrumTwiddle32x32,obj->pVitalSignsBuffer_Cplx,obj->pVitalSigns_SpectrumCplx三個buffer的記憶體分配位置: