AWR1843BOOST: DSP_fft32x32() 函數導致程式崩潰與記憶體異常

Part Number: AWR1843BOOST

我目前正在開發一個客製化的專案,在 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->pVitalSignsSpectrumTwiddle32x32obj->pVitalSignsBuffer_Cplx 內的數據都維持正常,且程式不會崩潰。因此,我推測問題可能與 DSP_fft32x32() 的執行有關。

想請教:

  1. 這樣的問題可能是什麼原因導致的?
  2. 還有哪些方式可以進一步排查?
  3. 針對 Console 顯示的錯誤碼,有什麼方法可以更精確地解讀?

以下提供相關的錯誤訊息與程式碼片段,謝謝!

DSP_fft32x32()函式呼叫:

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 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);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Console錯誤碼:

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

記憶體分配程式碼:

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/************************/
/* 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);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

在Memory Brower查看obj->pVitalSignsBuffer_Cplx中的數據, .imag項出現被DSP_fft32x32更改的問題:

Expressions中查看obj->pVitalSignsSpectrumTwiddle32x32,obj->pVitalSignsBuffer_Cplx,obj->pVitalSigns_SpectrumCplx三個buffer的記憶體分配位置:

x 出现错误。请重试或与管理员联系。