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.

[参考译文] TMS570LS1224:在 IRQ 处理程序中禁用中断会导致返回到无效地址

Guru**** 2562960 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/874105/tms570ls1224-disabling-interrupts-in-irq-handler-causes-return-to-invalid-address

器件型号:TMS570LS1224

从中断处理程序调用_disable_interrupts()和_enable_interrupts()时是否会出现问题?

我是通过 IRQ 处理程序在矢量中断模式下使用 VIM 来执行此操作的。 处理器似乎返回到无效地址。 当代码发生变化时、此返回地址会发生变化、但在重新运行相同的代码时、返回地址看起来是确定的。  当我使用调试器查看时、我会在 IRQ 模式分组 LR 寄存器中看到无效地址。 通常这会导致系统接收 UNDEF 异常处理程序。

我认为这是一个硬件问题、但作为参考、我将 CCS 9.2.0与 TI ARM 编译器18.12.3.LTS 搭配使用。

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

    尊敬的 John:

    您可以通过将 CPSR.I 位和 F 位设置为 B1来禁用特权模式内的 IRQ/FIQ 异常。  disable_interrupts ()用于设置 CPSR 中的 I 和 F 位、 _enable_interrupts () 用于清除这两个位(I 和 F)。

    当 IRQ 发生时、通过设置 CPSR.I 位来自动禁用 IRQ 中断。 当一个 FIQ 发生时、通过设置 CPSR.F 和 CPSR.I 位来自动屏蔽 FIQ 和 IRQ 中断。

    因此、您无需调用 _disable_interrupts()来禁用 ISR 中的中断。  

    当处理器完成 ISR 时、CPSR.I 和 CPSR.F 位被清零。 您无需在 IRQ 中调用_enable_interrupts()。

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

    感谢你的答复。 我认为我现在对问题的理解更好。 我尝试调用使用_disable_interrupts 和_enable_interrupts 的库代码、这种未定义的行为是在退出 ISR 之前通过_enable_interrupts 调用设置 CPSR.I 位来产生的。

    我认为解决方案是恢复以前的中断状态、而不是无条件启用中断。

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

    如果您需要进入特权模式来启用/禁用中断、请使用 Supervisor Call (SVC)指令。

    在一个 ISR 内启用中断有可能导致一个嵌套中断条件、此中断条件并不是由 Cortex R4/5架构本身管理的。