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.

[参考译文] MSP430FR5994:ODD LEA RAM问题。

Guru**** 2611705 points
Other Parts Discussed in Thread: MSP430FR5994

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/664561/msp430fr5994-odd-lea-ram-issue

部件号:MSP430FR5994

您好,

 我尝试使用MSP430FR5994上的LEA来计算具有相当大系数的FIR滤波器。

我似乎找不到任何关于fir参数的'tapLength '成员应该做什么的文件,但我有一个例子,按照filter_ex1_fir _q15.c:

#define FI_length (128)

DSPLIB_DATA (FILTER_COEFFS_AUD,4)

_Q15 FILTER_COEFFS_AUD[FI_LENG]={..}

DSPLIB_DATA (结果,4)

_Q15结果[FIR_LENGLES+48];

DSPLIB_DATA (fir数据缓冲器,msp对齐,用于Q15 (FIR长度))

_Q15 fir数据缓冲区[2*FI_LENG];

静态int qq = 0;

msp_fif_q15_参数fif_params;

FIR_params.length = FI_length;

FI_params.tapLength = 128;

FIR_params.coeffs = FILTER_COEFFS_AUD;

FIR_params.enableCircularBuffer =真;

memset (result,qq,20 * sizeof (_Q15));

状态= MSP_FIR_Q15(&FIR_PARams,&FIR_DATA_BUFFER[2*FIR_LENGE -128],&result[24])

如果(memcmp (result,qq,20 * sizeof (_Q15)) {

 /*抱怨*/

}

+QQ;

 现在,状态始终为"正常"。

 基本上,此代码是有效的。 但每隔一段时间,它就会触发memcmp()并进行投诉。

 当我仔细观察时,CPU从其中一个保护字节读取0x80,而不是预期值(qq)。

 调试器读取QQ。

 所以,在MSP_fify_Q15()之后,内存访问发生了一些奇怪的事情。

问题是-我做错了什么? 如果我做错了事,为什么只“有时”发生呢?

它看起来有点像TRM 10.2 中描述的情况,但我不相信此芯片有DTC。

我已经尝试禁用整个块周围的中断,以防中断损坏了我背后的内存,而这不会产生任何影响。

我尝试用一些令牌手动代码来替换LEA调用,该代码可以执行适当的多路复用,这似乎很有效。

我的运行速度是16MHz,但是从DCO或HF XTAL运行同样的操作,我的印象是16MHz MCLK 在这种情况下是合法的?

我的MSP430FR5994将自己宣传为Rev C

msm_fy_q15()调用后的__delay_cycles(1000)似乎会使其更快地发生(但这可能是统计噪声)。

非常感激地接受了任何帮助..  

(对于好奇的人来说,我的堆栈明显低于结果-显然这会导致堆栈明显损坏,并且如果受到影响,似乎会导致分支变为零)

 

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

    您好,Richard:

    您能否提供完整的示例C程序,包括您正在使用的系数和main以及您正在使用的CCS/IAR和DSPLIB版本? 以下是您提供的代码中的几项内容:

    1. 您使用不同的宏对齐数据,代码调用MSP_ALIGIN_FOR_Q15,当它应使用 由DSPLIB提供的MSP_ALIGIN_FI_Q15并计算正确的对齐时
    2. 您的memcmp语法不正确,前两个参数应该是指针,但您传递qq (int)作为第二个指针,这将产生未定义的结果(qq初始化为0,因此第一个memcmp调用将实际比较结果数组与存储在地址0的结果数组)
    3. 'tapLength'参数是系数的长度,与FIR的长度不同
    4. 由于您正在使用循环缓冲功能,我建议您查看DSPLIB用户指南中的部分(链接)

    此致,

    Brent Peterson

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

    您好,Brent,

     非常感谢您的快速回复,也很抱歉,示例代码有点粗糙!

     

     1.道歉-复印时出现打字错误。  

     2.你说得非常对——再说一次,对不起。 尝试总结一个明确的比较循环,同时时间短,失败严重;道歉。

     3.胶带长度-是的。 文件中说,但我不确定它的含义-大概这是一种在筛选器中仅指定非零系数的方法, 但我不清楚这是如何工作的-是否只是指定了第一个tapLength分路器,其余的被理解为0? 还是更复杂的事情? 您是否有机会向我指出我明显错过的文档? (在这种特殊情况下,系数将由我的客户稍后设置,因此我不能保证其中任何一个将为0,尽管筛选器可能是对称的)

     4.谢谢! 已经这样做了-事实证明,如果您关闭循环缓冲区并不重要,因此虽然我认为我理解如何执行此操作,但它似乎并不相关。

    我想我的一位同事已经发现了这个问题,尽管我会检查一下,似乎在DSPLIB 1.20 LEA.LEA 03.01 中,如果MSP_DISABLE_LPM0关闭,MSP_Lea_invokeCommand()问题__bis_SR_register(GIE+LPM0_bits),并且假定当它返回时,LEA已经完成。 如果在LEA完成之前发生了另一个中断,我们的RTOS将从LPM0中退出(因为它现在要运行),我们将提前唤醒并运行(至少) MSP_Lea_freeMemory(),这似乎会混淆LEA -理论上我们可以重新进入LEA操作, 我猜这会很糟糕。

    将其更改为:

     同时(!MSP_Lea_cfg){__bis_sr_register(GIE+LPM0_bits);}  

    似乎能帮我解决问题。 我们将进行调查,一旦取得足够的进展,我将尝试生成一个预设测试案例,以便有时间这样做,如果我们发现这不是搜索引擎的优势,请更新此帖子。

    很抱歉,再次感谢您的快速响应!