在arm7tdmi中,当FIQ和IRQ同时发生时,如何顺序执行,先FIQ再IRQ?

in arm7tdmi, when FIQ and RIQ occures at same time so how both are executed sequentially,first FIQ and thenIRQ?

在 arm7tdmi 中,假设正在执行指令,同时 FIQ 和 IRQ 同时发生 time.now 根据优先级先处理 FIQ,然后再处理 IRQ,但我的问题是它将如何处理 IRQ return 来自 FIQ 我的意思是在 FIQ 的 return 处将完成什么过程以及如何在 FIQ 处理程序的 return 语句之后将控制权转移到 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 在 time

与 M-profile 体系结构不同,classic/A-profile 体系结构以完全直接的方式处理事情。

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

注意点是 FIQ 处理程序末尾的 return 指令与被 return 编辑的指令之间的边界。 FIQ return 将恢复先前的 SPSR,它(大概)具有未屏蔽的 IRQ。因此,after 执行那条 return 指令,但 before 执行 0x110 处的指令,CPU 回到初始状态模式,带有未屏蔽的 IRQ 和挂起的 IRQ。所以它需要它; IRQ 处理程序在屏蔽 IRQ 的情况下运行,然后执行异常 return 到 0x110,因此执行最终继续为两个中断提供服务。

对于 ARM7TDMI,仅此而已。在较新的体系结构版本(从 ARMv7 开始)中,有一些规则在预期会发生异步异常时收紧,因为一旦 CPU 设计开始变得超标量 and/or 无序 "instruction boundary" 有点模糊。但是,这种特殊情况在现代 CPUs 上没有什么不同,因为来自 FIQ 的异常 return 构成了一个上下文同步事件,之后必须立即采取任何未决的异步异常(即 IRQ) .