我正在使用PIC32 MCU (MIPS M4K内核),我正在尝试理解MIPS中的中断是如何工作的;我使用的是“查看MIPS运行”一书、官方MIPS参考和谷歌。他们中没有人能帮助我理解以下几点:
我中断了这样的声明:
void __ISR(_CORE_TIMER_VECTOR) my_int_handler(void)
我查看反汇编,我看到RDPGPR SP, SP
在ISR序言中被调用(实际上是第一条指令);平衡WRPGPR SR, SR
指令在ISR的尾声中被调用(在将先前保存的Status
寄存器写入CP0和调用ERET
之前)。我看到这些指令的目的是读取并保存到以前的影子寄存器集,因此,RDPGPR SP, SP
从影子寄存器集读取$sp
,WRPGPR SR, SR
将其写回,但我不明白原因。这个ISR不打算使用影子寄存器集,实际上在反汇编中我看到上下文被保存到堆栈中。但是,由于某种原因,$sp
是从$sp
中读取并写入阴影的。为什么会这样呢?
还有,相关的问题: MIPS汇编语言是否有一些真正全面的资源(书籍或其他东西)?“查看MIPS运行”似乎很好,这是我深入研究MIPS体系结构的一个很好的起点,但它没有涵盖足够好的几个主题,有几件事情在我脑海中闪现出来:
Cause
寄存器的图表,它表明在EIC模式中我们有RIPL
而不是IP7-2
,但是它的工作原理是什么(比方说,如果Cause->RIPL
比Status->IPL
更多的话,则会导致中断)。甚至没有解释RIPL
的意思(“请求中断优先级级别”,嗯,谷歌帮了忙)。我知道EIC是依赖于实现的,但是我刚才提到的东西是通用的。.macro
、.endm
指令)的内容,我在现有代码中看到的一些汇编程序指令,比如.set mips32r2
,等等都找不到。rdpgpr
/wrpgpr
的任何信息,它非常简短地介绍了这些指令(以及阴影寄存器集)。官方的MIPS参考在这些主题上也没有多大帮助。是否真的有一本好书涵盖了所有可能的汇编指令,等等?
发布于 2014-10-10 14:25:33
当MIPS核心进入ISR时,它可以将中断的代码的活动寄存器集替换为一个新的寄存器集(可以有几个不同的影子寄存器集),这是特定于该中断优先级的。
通常,中断例程没有自己的堆栈,而且由于刚刚切换的阴影寄存器集当然具有与中断代码的值不同的sp寄存器,因此ISR将sp值从刚刚关闭的阴影寄存器集复制到自己的,以便能够使用中断代码的堆栈。
如果您愿意,您可以将ISR的堆栈设置为自己以前分配的堆栈,但这通常并不有用。
https://stackoverflow.com/questions/24869484
复制相似问题