2

我正在使用 PIC32 MCU(MIPS M4K 内核),我试图了解中断在 MIPS 中是如何工作的;我拥有“See MIPS Run”一书、官方 MIPS 参考资料和 Google。他们中的任何一个都无法帮助我理解以下内容:

我有这样的中断声明:

void __ISR(_CORE_TIMER_VECTOR) my_int_handler(void)

我查看了反汇编,我看到RDPGPR SP, SP在 ISR 序言中调用了它(实际上是第一条指令);并且在 ISR 尾声中调用平衡WRPGPR SR, SR指令(在将先前保存的Status寄存器写入 CP0 并调用之前ERET)。我看到这些指令的目的是读取并保存到以前的影子寄存器集,因此,从影子寄存器集RDPGPR SP, SP读取并将其写回,但我不明白这是为什么。这个 ISR 不打算使用影子寄存器集,实际上在反汇编中我看到上下文被保存到堆栈中。但是,由于某种原因,从 shadow 读取和写入。为什么是这样?$spWRPGPR SR, SR$sp$sp

而且,相关问题:是否有一些关于 MIPS 汇编语言的真正全面的资源(书籍或其他东西)?“See MIPS Run”似乎真的很好,它是我深入研究 MIPS 体系结构的一个很好的起点,但它并没有涵盖几个足够好的主题,有几件事让我头疼:

  • 关于 EIC(外部中断控制器)模式的信息很少:它有一个带有Cause寄存器的图表,显示在 EIC 模式下我们有RIPLIP7-2不是. 甚至没有解释是什么意思(“请求的中断优先级”,好吧,谷歌帮助了)。我知道 EIC 是依赖于实现的,但我刚才提到的东西是通用的。Cause->RIPLStatus->IPLRIPL
  • 汇编语言的介绍还不够完整:比如说,没有关于宏 ( .macro,.endm指令),我找不到关于我在现有代码中看到的一些汇编器指令的任何信息,比如 ,.set mips32r2等等。
  • 我找不到任何关于在 ISR 中使用rdpgpr/的内容wrpgpr,它非常简要地介绍了这些指令(以及一般的影子寄存器集)

官方 MIPS 参考对这些主题也没有多大帮助。是否真的有一本涵盖所有可能的汇编指令的好书,等等?

4

1 回答 1

3

当 MIPS 内核进入 ISR 时,它可以将中断代码的活动寄存器集与一个新的(可能有几个不同的影子寄存器集)交换,特定于该中断优先级。

通常中断例程没有自己的堆栈,并且因为刚刚接通的影子寄存器组的 sp 寄存器的值肯定与被中断代码的值不同,所以 ISR 会从刚刚断开的代码中复制 sp 值影子寄存器设置为它自己的,以便能够使用被中断代码的堆栈。

如果您愿意,您可以将您的 ISR 的堆栈设置为它自己的先前分配的堆栈,但这通常没有用。

于 2014-10-10T14:25:33.307 回答