中断保存当前活动的地址,以便在执行中断处理程序后恢复它

时间:2016-08-22 22:56:22

标签: embedded interrupt

“当发生中断时,处理器通过暂停其当前活动,保存其状态并执行称为中断处理程序的函数来响应”

  

问题是处理器保存当前地址的位置   在执行中断处理程序后恢复它的活动?

2 个答案:

答案 0 :(得分:1)

这取决于您所关注的架构。但通常处理器本身会在中断时将当前程序计数器推入当前堆栈。然后,中断的返回将获取那些堆叠的PC信息并返回到正常的程序流程。例如。将PC推向堆栈的架构:Atmel AVR,ARM Cortex-M,PowerPC。

Atmel AVR:http://www.atmel.com/webdoc/avrassembler/avrassembler.wb_RETI.html

ARM Cortex-M:http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0552a/Babefdjc.html

答案 1 :(得分:0)

严重依赖于架构。 我想到了几种方法(我确信还有更多方法):

  • 将必要的寄存器推入当前堆栈(例如:指令指针),然后跳转到异常处理程序。然后,异常处理程序负责保留它需要使用的任何其他寄存器。我相信这是x86 CPU所采用的方法。我不确定它是默认推送所有寄存器还是必不可少的。
  • 根据CPU模式,CPU具有不同的寄存器设置。 (例如::用户模式,中断模式)。基本上,当发生中断时,它会开始使用不同的寄存器组。例如,ARM cpus会这样做,尽管他们不会在每个CPU模式下使用完整的寄存器集。请参阅https://en.wikipedia.org/wiki/ARM_architecture#Registers
  • 一些古老的cpus在RAM本身中设置了寄存器,因此切换上下文只是改变了寄存器在内存中的位置。见https://en.wikipedia.org/wiki/Texas_Instruments_TMS9900#Architecture。如果RAM比CPU本身慢,这种方法是不可行的。但它对于模拟计算机仍然可行。例如,我的爱好项目(完全模拟的计算机)使用这种方法。内核为每个应用程序设置了不同的寄存器集。https://bitbucket.org/ruifig/g4devkit。虽然我可能会在某个时候改为不同的解决方案。