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.

[参考译文] TMS320F28379D:中断服务例程上下文保存

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1502720/tms320f28379d-interrupt-service-routine-context-save

部件号:TMS320F28379D

工具/软件:

早上好

最终、这可能更适合编译器论坛、但我们从这里开始。 我正在 对上下文保存进行一些分析、该保存发生在进入用 C 语言编写的中断服务例程并在栈上引用值时。

我发现、C28x 完成的上下文保存似乎因 ISR 的内容而异。 我花了大量时间在汇编手册中阅读了关于上下文保存和恢复的内容、但在 C 语言中执行 ISR 时、我没有在上下文中找到任何特定于此的内容

以下是两个反汇编示例:

第一个是看门狗 ISR 的简短版本、它基本上从栈中读取一个值、检查它是否应该使 CPU 复位、并 确认中断标志。

下一个是相同的 ISR、但现在它正在将值写入闪存(C28x 上的复杂操作)。 到第一个编码 ISR 指令(MOVL ACC、*-SP[28])的反汇编有很大不同、并且大大改变了堆栈。

我尝试解决的问题是引用了自动保存上下文中堆栈上的一个值、但根据 ISR 的内容、堆栈位置似乎正在改变。 我有几个问题:

1)什么触发了第二个 ISR 中似乎发生的更深入的上下文保存?

2)是否有方法可以检测 执行了哪种上下文保存? 我的想法是在进入 ISR 后立即查看程序计数器的值、是否有办法判断程序计数器相对于 中断地址的偏移?

3) 控制这是最好的方法,以在汇编中声明中断?

也乐于接受其他建议和想法。

谢谢!

Kris

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

    尊敬的 Kris:

    我认为您在这里看到的不同之处在于、在第二种情况下、ISR 指令中使用的寄存器更多、因此更多的寄存器需要先保存其状态、因为它们将被 ISR 执行修改。 编译器足够智能、不能简单地将所有寄存器压入栈、如果 ISR 中未使用某些寄存器、则不需要将其状态压入栈。  

    您提到的方法应该可行、但是您能帮助我更好地了解您的用例、以便我提供建议吗? 您到底为什么要访问栈上的特定值?  

    此致、

    Delaney

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

    尊敬的 Delaney:

    感谢您的答复。 我同意你对正在发生的事情的评估。 问题是它是否前后一致。 如果向 ISR 添加更多代码、是否有更多的寄存器用于进行上下文保存(从而进一步更改堆栈)、或者这是最大值? 由于闪存写入的复杂性、我怀疑它可能是最大值。

    该应用的目标是在触发看门狗 ISR 之前识别应用代码中的程序计数器值、以便能够调试可能发生意外操作的位置。

    谢谢、

    Kris

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

    尊敬的 Kris:

    很抱歉我延迟了回复。 我不认为您显示的第二个用例是最大值、因为这里仍然缺少更多的 CPU 内核寄存器、如果使用它们、这些寄存器可能会压入堆栈中。  另请参阅 此处 讨论该主题的主题。

    如果您尝试在 ISR 代码内访问 PC、最好的做法可能是将 ISR 写入汇编语言、以便在进入 ISR 时立即捕获值。 让我在编译器团队中循环、看看他们是否有任何其他建议。

    此致、

    Delaney

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    由于闪存写入的复杂性、我怀疑它可能是最大值。

    这是正确的,但解释是不完整的。  当中断函数包含对另一个函数的调用时、编译器会假设被调用函数更改所有寄存器这一最坏情况。  因此、它会保留堆栈上的所有寄存器。

    谢谢。此致、

    -乔治

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

    乔治·德拉尼

    感谢您的答复。

    George、根据您的回复、这是否表明堆栈指针 对于 ISR 的任何进一步添加都应具有可靠的程序计数器偏移? 本质上、如果从 ISR 调用任何函数、那么堆栈指针将位于相对于 PC 上下文保存的相同位置?

    还是更好地将其更新为装配体?

    谢谢、

    Kris

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

    尊敬的 Kris:

    我将请教看门狗专家、了解他们是否有任何建议或示例代码可为您的应用提供。 我会尽量得到乔治的澄清,他的回应,以及为你。

    此致、

    Delaney

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

    尊敬的 Kris:

    很高兴看到你的帖子:-)

    我们没有关于这种确切用法的任何示例。  

    本质上、如果从 ISR 调用任何函数、则堆栈指针将位于与 PC 上下文保存位置相关的同一位置?

    将等待乔治回答这个问题。

    此致、

    Vivek Singh

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果从 ISR 调用任何函数、则栈指针将位于与 PC 的上下文保存位置相同的位置?

    正确。   

    但假定仅仅因为 C 函数调用另一个函数、编译器生成的代码必须调用该函数是正确的吗?  编号  编译器可以内联函数。   

    最好将其更新为汇编语言吗?

    它更可靠。

    谢谢。此致、

    -乔治

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

    太棒了、感谢大家!