工具/软件:
早上好
最终、这可能更适合编译器论坛、但我们从这里开始。 我正在 对上下文保存进行一些分析、该保存发生在进入用 C 语言编写的中断服务例程并在栈上引用值时。
我发现、C28x 完成的上下文保存似乎因 ISR 的内容而异。 我花了大量时间在汇编手册中阅读了关于上下文保存和恢复的内容、但在 C 语言中执行 ISR 时、我没有在上下文中找到任何特定于此的内容
以下是两个反汇编示例:
第一个是看门狗 ISR 的简短版本、它基本上从栈中读取一个值、检查它是否应该使 CPU 复位、并 确认中断标志。
下一个是相同的 ISR、但现在它正在将值写入闪存(C28x 上的复杂操作)。 到第一个编码 ISR 指令(MOVL ACC、*-SP[28])的反汇编有很大不同、并且大大改变了堆栈。
我尝试解决的问题是引用了自动保存上下文中堆栈上的一个值、但根据 ISR 的内容、堆栈位置似乎正在改变。 我有几个问题:
1)什么触发了第二个 ISR 中似乎发生的更深入的上下文保存?
2)是否有方法可以检测 执行了哪种上下文保存? 我的想法是在进入 ISR 后立即查看程序计数器的值、是否有办法判断程序计数器相对于 中断地址的偏移?
3) 控制这是最好的方法,以在汇编中声明中断?
也乐于接受其他建议和想法。
谢谢!
Kris