MIPS:为什么ISR被rdpgpr $ sp包围,$ sp; wrpgpr $ sp,$ sp指令?

时间:2014-07-21 15:59:59

标签: mips isr

我正在使用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从影子寄存器集中读取$sp并将WRPGPR SR, SR写回,但我不能明白这个的原因。这个ISR意图不使用影子寄存器集,实际上在反汇编中我看到上下文被保存到堆栈中。但是,由于某种原因,$sp被读取并写入阴影$sp。这是为什么?

并且,相关问题:MIPS汇编语言中是否存在一些非常全面的资源(书籍或其他内容)? “看MIPS Run”看起来真的很棒,这对我来说是很好的开始,我可以深入研究MIPS架构,但它并没有涵盖好几个主题,还有一些不可思议的东西:

  • 关于EIC(外部中断控制器)模式的信息非常少:它的图表带有Cause寄存器,表明在EIC模式下我们有RIPL而不是IP7-2,但有没有关于它是如何工作的(比如,只有Cause->RIPL超过Status->IPL才会导致中断。甚至没有解释RIPL的意思(“请求的中断优先级”,以及,谷歌帮助。。我知道EIC是依赖于实现的,但我刚才提到的东西是通用的。
  • 汇编语言的覆盖范围不够完全:比如说,没有关于宏(.macro.endm指令的内容),我找不到任何关于我在现有代码中看到的汇编程序指令的内容,比如,.set mips32r2,等等。
  • 我无法在ISR中找到任何关于使用rdpgpr / wrpgpr的内容,它非常简短地介绍了这些说明(以及一般的影子寄存器集)

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

1 个答案:

答案 0 :(得分:2)

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

通常中断例程没有自己的堆栈,并且由于刚刚接入的影子寄存器集的sp寄存器的值与中断的代码的值不同,因此ISR副本刚刚切出的影子寄存器中的sp值设置为它自己的sp值,以便能够使用被中断的代码堆栈。

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