在arm7tdmi中,假设指令正在执行,同时FIQ和IRQ都同时发生。现在根据优先级FIQ将处理然后IRQ但我的问题是它如何处理从FIQ返回后的IRQ 我的意思是在返回FIQ时将完成哪些过程以及如何在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在时间被引发
答案 0 :(得分:1)
与M-profile体系结构不同,它们具有非常不同的异常模型,允许尾部链接异常,经典/ A-profile体系结构以完全直接的方式执行。
当相应的CPSR.F / CPSR.I位清零时,在指令边界检查中断。因此,假设FIQ处理程序是直截了当的,一旦0x108处的指令完成,则从CPU所处的任何模式获取FIQ(因为它优先于IRQ),FIQ处理程序在FIQ和IRQ被屏蔽的情况下运行,然后执行异常返回0x110。事实上,正好有一个IRQ待处理,这一点没有任何区别。
值得注意的是FIQ处理程序末尾的返回指令与返回的返回指令之间的边界。 FIQ返回将恢复先前的SPSR,其(可能)具有未屏蔽的IRQ。因此,在执行该返回指令之后在执行0x110之前的之前,CPU返回初始模式,IRQ未屏蔽,IRQ挂起。这需要它; IRQ处理程序在屏蔽了IRQ的情况下运行,然后执行异常返回到0x110,执行最终继续为两个中断服务。
对于ARM7TDMI来说,真的就是它。在较新的体系结构版本(ARMv7以上版本)中,有一些规则在预期会采取异步异常时精确收紧,因为一旦CPU设计开始变为超标量和/或无序的"指令边界&##的概念34;变得有点模糊。但是,这种特殊情况在现代CPU上没有什么不同,因为FIQ的异常返回构成了一个上下文同步事件,之后必须立即采取任何挂起的异步异常(即IRQ)。