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.

[参考译文] MSP430FR5969:中断服务例程中的堆栈内存修改。

Guru**** 2577385 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/612538/msp430fr5969-stack-memory-modification-in-interrupt-service-routine

器件型号:MSP430FR5969

我想在 ISR 中编写一个代码。 但 ISR 中的大型代码不可取。 因此、我将使用内联汇编函数读取在中断发生之前存储的下一条指令的地址。  并将该地址存储到局部变量中。 并将堆栈内存中下一条指令的地址替换为回调函数,在该函数中,我将执行之前在 ISR 中完成的所有必需任务。 在回调函数中、执行完所有任务后、我只需跳转到本地变量中的下一个指令地址存储。 简单来说、执行 ISR 后、控制应该以正常方式返回到下一个指令地址、但在我的情况下、我将流控制从 ISR 重定向到回调函数、从回调函数返回到下一个指令地址。  

那么、这个编程方法是否可取呢?

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

    您忘记将这些值保存在所有 CPU 寄存器中。

    如果您确实保存寄存器(并在处于堆栈状态时切换)、则本质上需要进行任务切换。 最好先使用 RTOS。

    总之、避免 ISR 中出现过多代码的原因是为了防止主代码中断太长时间。 您的回调函数机制不会改变这种情况。

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

    我已经保存了所有 CPU 寄存器。 堆栈修改完成了、我的代码工作正常、没有任何内存违例。 我必须在 ISR 中编写一个大型代码、这就是我使用此技术的原因、因此我会尽快发布 ISR。 因此它不会阻止其他中断。

    它是更改程序流控制堆栈或重定向的正确方法。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    通过上下文保存和堆栈切换、您实现了任务切换机制。 您如何称呼它、AnilOS? :-)

    是的、如果您希望对中断执行某些任务、而不希望检查主循环中的事件、这是正确的方法。