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

MIPS:为什么ISR被rdpgpr$sp$sp包围;wrpgpr$sp$sp指令?,mips,isr,Mips,Isr,我正在使用PIC32 MCU(MIPS M4K core),我试图了解MIPS中中断是如何工作的;我有《看MIPS跑步》一书、官方MIPS参考资料和谷歌。他们中没有人能帮助我理解以下内容: 我曾这样声明: void __ISR(_CORE_TIMER_VECTOR) my_int_handler(void) 我查看反汇编,发现在ISR序言中调用了RDPGPR SP,SP(实际上是第一条指令);在ISR尾声中调用平衡WRPGPR SR,SR指令(在将先前保存的状态寄存器写入CP0并调用ERET之

我正在使用PIC32 MCU(MIPS M4K core),我试图了解MIPS中中断是如何工作的;我有《看MIPS跑步》一书、官方MIPS参考资料和谷歌。他们中没有人能帮助我理解以下内容:

我曾这样声明:

void __ISR(_CORE_TIMER_VECTOR) my_int_handler(void)
我查看反汇编,发现在ISR序言中调用了
RDPGPR SP,SP
(实际上是第一条指令);在ISR尾声中调用平衡
WRPGPR SR,SR
指令(在将先前保存的
状态
寄存器写入CP0并调用
ERET
之前)。 我看到这些指令的目的是从以前的卷影寄存器集中读取和保存,因此,
RDPGPR SP,SP
从卷影寄存器集中读取
$SP
,然后
WRPGPR SR,SR
将其写回,但我不理解原因。这个ISR不打算使用卷影寄存器集,实际上在反汇编中,我看到上下文被保存到堆栈中。但是,由于某些原因,
$sp
被读取并写入shadow
$sp
。为什么会这样

还有,相关的问题:关于MIPS汇编语言是否有一些真正全面的资源(书籍或其他什么)?“See MIPS Run”似乎非常好,这是我深入研究MIPS体系结构的一个很好的起点,但它并没有很好地涵盖几个主题,有几件事是我想不起来的:

  • 关于EIC(外部中断控制器)模式的信息非常少:它有一个带有
    原因
    寄存器的图表,显示在EIC模式下,我们有
    RIPL
    ,而不是
    IP7-2
    ,但没有说明它是如何工作的(比如说,如果
    Cause->RIPL
    大于
    Status->IPL
    ,就会导致中断。甚至没有解释
    RIPL
    的含义(“请求的中断优先级”,谷歌帮助)。我理解EIC依赖于实现,但我刚才提到的是通用的
  • 汇编语言的介绍还不够全面:比如说,关于宏(
    .macro
    .endm
    指令)什么都没有,我在现有代码中看到的一些汇编指令中找不到任何东西,比如,
    .set mips32r2
    ,等等
  • 我找不到任何关于在ISR中使用
    rdpgpr
    /
    wrpgpr
    的信息,它非常简要地介绍了这些指令(以及一般的阴影寄存器集)

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

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

通常,中断例程没有自己的堆栈,而且由于刚刚切换入的阴影寄存器集的sp寄存器的值肯定与中断代码的sp寄存器的值不同,因此ISR将sp值从刚刚切换出的阴影寄存器集复制到自己的sp寄存器集,以便能够使用中断代码的堆栈

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