-1

在 arm7tdmi 中,假设正在执行指令并且同时 FIQ 和 IRQ 都同时发生。现在根据优先级 FIQ 将被处理然后 IRQ 但我的问题是它将如何处理从 FIQ 返回后的 IRQ 我的意思是什么在 FIQ 返回时完成的过程以及在 FIQ 处理程序的返回语句之后如何将控制转移到 IRQ 处理程序?

示例:地址 => 指令

  0x00000100              :      MOV R0,R1
  0x00000104              :      MOV R0,R1
 =>> 0x00000108              :      MOV R0,R1   
  0x00000110              :      MOV R0,R1
  0x00000114              :      MOV R0,R1
  0x00000118              :      MOV R0,R1

; 假设在 0x00000108 处正在执行指令并且 FIQ 和 IRQ 在时间被提升

4

1 回答 1

1

与 M-profile 架构不同,它们的异常模型非常不同,允许尾部链接异常,classic/A-profile 架构以完全直接的方式做事。

当相应的 CPSR.F/CPSR.I 位清零时,会在指令边界检查中断。因此,假设 FIQ 处理程序很简单,一旦 0x108 处的指令完成,FIQ 就会从 CPU 所处的任何模式中获取(因为它优先于 IRQ),FIQ 处理程序在 FIQ 和 IRQ 被屏蔽的情况下运行,然后执行异常返回 0x110。整个过程中碰巧有一个 IRQ 未决的事实没有任何区别。

需要注意的是 FIQ 处理程序末尾的返回指令与被返回的指令之间的边界。FIQ 返回将恢复先前的 SPSR,它(可能)具有未屏蔽的 IRQ。因此,执行该返回指令之后但执行 0x110 处的指令之前,CPU 回到初始模式,IRQ 未屏蔽,并且 IRQ 未决。所以它需要它;IRQ 处理程序在 IRQ 被屏蔽的情况下运行,然后执行异常返回到 0x110,因此执行最终继续服务于两个中断。

对于 ARM7TDMI,这就是它的全部内容。在较新的架构版本(ARMv7 及更高版本)中,当预期采用异步异常时,有一些规则会更加严格,因为一旦 CPU 设计开始变得超标量和/或无序,“指令边界”的概念就会变得有点模糊。但是,这种特殊情况在现代 CPU 上并没有什么不同,因为从 FIQ 返回的异常构成了一个上下文同步事件,之后必须立即处理任何未决的异步异常(即 IRQ)。

于 2016-09-26T19:29:03.563 回答