我目前正在開發一個客製化的專案,在 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
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);
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的記憶體分配位置: