我正在使用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架构,但它并没有涵盖好几个主题,还有一些不可思议的东西:
Cause
寄存器,表明在EIC模式下我们有RIPL
而不是IP7-2
,但有没有关于它是如何工作的(比如,只有Cause->RIPL
超过Status->IPL
才会导致中断。甚至没有解释RIPL
的意思(“请求的中断优先级”,以及,谷歌帮助。。我知道EIC是依赖于实现的,但我刚才提到的东西是通用的。.macro
,.endm
指令的内容),我找不到任何关于我在现有代码中看到的汇编程序指令的内容,比如,.set mips32r2
,等等。rdpgpr
/ wrpgpr
的内容,它非常简短地介绍了这些说明(以及一般的影子寄存器集)官方MIPS参考对这些主题也没有多大帮助。是否有涵盖所有可能的汇编指令的好书?等等?
答案 0 :(得分:2)
当MIPS内核进入ISR时,它可以将被中断的代码的有效寄存器组与一个新的有效寄存器组交换(可以有几个不同的影子寄存器组),特定于该中断优先级。
通常中断例程没有自己的堆栈,并且由于刚刚接入的影子寄存器集的sp寄存器的值与中断的代码的值不同,因此ISR副本刚刚切出的影子寄存器中的sp值设置为它自己的sp值,以便能够使用被中断的代码堆栈。
如果您愿意,可以将ISR的堆栈设置为以前分配的堆栈,但这通常没用。