This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] AWR1843BOOST:dsp_fft32x32 ()导致程序崩溃和内存异常

Guru**** 2460850 points
Other Parts Discussed in Thread: AWR1642

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/sensors-group/sensors/f/sensors-forum/1489620/awr1843boost-dsp_fft32x32-causing-program-crash-and-memory-anomalies

器件型号:AWR1843BOOST
Thread 中讨论的其他器件:AWR1642

工具与软件:

大家好、我目前正在开发一个定制项目、因此给了 DSP_fft32x32()生成逻辑功能 interFrameProcessing(). 但是、在多次运行函数之后(随机次数)、程序会崩溃。

调试过程中、我注意到一个奇怪的现象:的输入参数之一 DSP_fft32x32()obj->pVitalSignsBuffer_Cplx.imag成员值意外修改。 不过、根据我的理解、 DSP_fft32x32()不应发生变化 obj->pVitalSignsBuffer_Cplx. 在我注释掉时 DSP_fft32x32().imag的参数obj->pVitalSignsBuffer_Cplx保持为零。

我已检查内存冲突或覆盖。 在"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. 如何更准确地解释控制台中显示的错误代码?

下面、我提供了相关的错误消息和代码片段。 如果有任何见解、将不胜感激。 谢谢!

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 窗口中三个缓冲区(、和)的存储器分配位置:

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    dspft32x32()曾用于我们过去的一个 SDK 演示(AWR1642演示)。 在特定演示中、没有问题、并且演示在许多小时内都没有崩溃。

    您需要确保的一点是在演示中使用的缓冲区不会与其他一些活动缓冲区重叠。

    为了进行测试、我会将 FFT 使用的缓冲区重新分配给其他一些存储器、例如 L3。 即使执行速度较慢、至少您可以检查代码是否仍然崩溃

    谢谢你

    Cesar