首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么ISR被rdpgpr $sp,$sp;wrpgpr $sp,$sp指令包围?

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

Stack Overflow用户
提问于 2014-07-21 15:59:59
回答 1查看 641关注 0票数 2

我正在使用PIC32 MCU (MIPS M4K内核),我正在尝试理解MIPS中的中断是如何工作的;我使用的是“查看MIPS运行”一书、官方MIPS参考和谷歌。他们中没有人能帮助我理解以下几点:

我中断了这样的声明:

代码语言:javascript
运行
复制
void __ISR(_CORE_TIMER_VECTOR) my_int_handler(void)

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

还有,相关的问题: MIPS汇编语言是否有一些真正全面的资源(书籍或其他东西)?“查看MIPS运行”似乎很好,这是我深入研究MIPS体系结构的一个很好的起点,但它没有涵盖足够好的几个主题,有几件事情在我脑海中闪现出来:

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-10 14:25:33

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

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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24869484

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档