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.

[参考译文] MSP430-GCC-opensource:勘误表 USCI39和 RETI/硬件乘法器

Guru**** 2581345 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1053986/msp430-gcc-opensource-errata-usci39-and-reti-hardware-multiplier

器件型号:MSP430-GCC-opensource

勘误表显示:

Unpredictable code execution can occur if one of the hardware-clear-able IFGs
UCSTTIFG, UCSTPIFG or UCNACKIFG is set while the global interrupt enable is set
by software (GIE=1). This erratum is triggered if ALL of the following events occur in
following order:
1. Pending Interrupt: One of the UCxIFG=1 AND UCxIE=1 while GIE=0
2. The GIE is set by software (e.g. EINT)
3. The pending interrupt is cleared by hardware (external I2C event) in a time window of 1
MCLK clock cycle after the "EINT" instruction is executed.

Workaround: Disable the UCSTTIE, UCSTPIE and UCNACKIE before the GIE is set. After GIE is set,
the local interrupt enable flags can be set again.

进入 ISR 后、GIE 会在硬件中自动清零、而在"reti"时、最后一个状态寄存器值会从堆栈中弹出、从而重新启用 GIE。 这是与 USCI39相关的问题、还是通过"reti"设置 GIE 不会导致此错误?

slau646f 说:

硬件乘法例程在运行时禁用中断、并在中断完成时恢复之前的中断状态。 这使得它们在中断处理程序内部以及在正常代码中使用是安全的。

当在我控制的软件中重新启用中断时、我可以应用权变措施。 但是,如果 gcc 生成的代码调用 CRT 时出现中断状态,我就没有这样的控制。  我无论如何都不会在中断中执行乘法运算、到目前为止、我还没有看到使用 HW 乘法器加速位移运算(因为缺少桶形移位器)。 我想我的问题有两个方面:

  1. 是否有办法打破 GCC 禁用乘法中断的习惯、或者:
  2. USCI39权变措施是否需要这样做? 即:在-O3上、gcc 将 R2压入堆栈、并使用"pop R2"重新启用中断(如果启用了中断)。 在-OS 上、函数__mulhsi2使用 reti 重新启用 GIE
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我似乎还记得、在其他情况下、问题是与中断硬件有关。 实际上、所发生的是、它发现它需要为中断提供服务并开始该过程。 然后、选择中断矢量(IFG)所需的信息消失。 从而使中断硬件处于不良状态。 它将使用哪个矢量? 在这种情况下、最好使用伪中断矢量。

    因此、只要 IFG 被清除的时序是完美的、我就不会看到 GIE 被设置的程度有很大的影响。

    在使用硬件乘法器时、您可以通过替换库代码来修复 GCC 与中断状态的混乱。 您无需插入库、只需确保其目标文件位于 ld 命令行上的库之前。 这适用于使用库代码的优化级别、但不适用于内联代码的级别。 如果有一个选项可以说您将在 ISR 中运行良好(无多路复用器)、这样就不需要禁用中断、那就很好了。 并警告乘法器是否会进入 ISR。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="215629" URL"~/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1053986/msp430-gcc-opensource-errata-usci39-and-reti-hardware-multiplier/3898948 #3898948)]问题在其他情况下出现,我似乎还记得它是与中断硬件有关的。 实际上、所发生的是、它发现它需要为中断提供服务并开始该过程。 然后、选择中断矢量(IFG)所需的信息消失。 从而使中断硬件处于不良状态。 它将使用哪个矢量? 在此实例中使用的假中断矢量很好。[/quot]

    但是、我们还有一个更严重的问题!

    如果该错误针对 RETI 存在、实际上  、我 的所有 ISR (我有很多 ISR)在返回之前必须执行的操作是禁用 UCNACKIE、UCSTPIE、UCSTTIE 用于 I2C 外设、并在从该中断上下文返回后重新启用这些标志。  您可以确认此视图吗?

    2、是什么使您能够确保 UCTXIFG 也不存在此错误? 在第 38.3.4.1.1章 slau208q 中、UCTXIFG 在接收到一个"Nack"时被硬件清零。

    在设置 UCSTPIE 等时、您可以确定什么情况下不存在该错误、而此时、UCSTPIFG 会被硬件清除?

    4、 假设本勘误表不适用于 UCTXIFG、并且我没有多主控总线、您能确认、勘误表 USCI39仅适用于受控模式下的 USCI 外设、而不适用于主控模式下的 USCI 外设吗?

    [引用 userid="215629" URL"~/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1053986/msp430-gcc-opensource-errata-usci39-and-reti-hardware-multiplier/3898948 #3898948"]在使用硬件乘法器时,可以通过替换库代码来修复 GCC 与中断状态的混乱。[/quot]

     我当然不想在这一级别上与 CRT 库发生混乱。 我将编写自己的内联 ASM 宏。

    [引用 userid="215629" URL"~/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1053986/msp430-gcc-opensource-errata-usci39-and-reti-hardware-multiplier/3898948 #3898948"]如果有一个选项可以说您将在 ISR 中玩得很好(没有多路复用器),这样就不需要禁用中断,那就很好了。

    的确是这样。

    [引用 userid="215629" URL"~/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1053986/msp430-gcc-opensource-errata-usci39-and-reti-hardware-multiplier/3898948 #3898948"]如果将多个提前加入 ISR、则会发出警告。

    同意。 这一点很重要、因为我们不知道某些 GCC 生成的代码优化是否会使用硬件乘法器(虽然我怀疑它、但移位运算目前肯定不会使用、而将硬件乘法器用于桶形移位最容易想到的是可能的优化)。

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

    从 slau208q 开始:

    1.3.4.2从中断返回
    中断处理例程用以下指令终止:
    RETI //从中断服务例程返回
    中断返回需要五个周期来执行以下操作、如图1-5所示。
    具有所有之前设置的 SR 从堆栈中弹出。 GIE、CPUOFF 和之前的所有设置
    其他寄存器现在有效、与中断服务程序期间使用的设置无关。
    2. PC 从堆栈中弹出并在中断点开始执行。

     RETI 指令的特殊之处在于它需要5个 MCLK 周期。 GIE 恢复后、它仍然必须从堆栈中弹出 PC、这可能会关闭 Errata USCI39中的"1 MCLK"窗口。 与此相反、简单的 EINT 只采用一个 MCLK (BIS.W #8、SR)

    FWiw、 我无法访问 Verilog / VHDL 文件或 TI 用于设计其 MSP 的任何文件、因此我无法分辨、这是 只有 TI 才能验证的结果。

    正如我在前一条评论中所写的那样、如果"reti"有这个问题、我们就处于一个痛苦的世界中;因此、所有 ISR 都必须禁用 所有 I2C 外设的中断使能标志、在这种情况下、这个问题可能发生。

    如果这也是一个问题:

    [引用 userid="423529" URL"~/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1053986/msp430-gcc-opensource-errata-usci39-and-reti-hardware-multiplier/3899977 #3899977]3. 当设置例如 UCSTPIE 时、您可以确保此错误不存在、而此时、UCSTPIFG 会被硬件清除?[/QUERP]

    然后、勘误表 USCI39从根本上打破了 I2C USCI、没有解决此问题的好方法。

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

    您好、Thilo、

    我将要研究其他问题并返回给大家、但关于 RETI 部分以及 USCI39是否仅适用于从模式、我将提及以下相关主题:

    https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/409917/help-on-dealing-with-usci39-on-a-5xx-msp430

    https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/462451/msp430f5335-crashing

    在线程2中、答案是 RETI 可以触发此勘误表、而此勘误表主要影响从模式。

    谢谢、

    王国新