Arm FIQ和IRQ中断系统之间的区别是什么?
我想知道FIQ和IRQ中断系统之间的区别Arm FIQ和IRQ中断系统之间的区别是什么?,arm,interrupt,drivers,microprocessors,isr,Arm,Interrupt,Drivers,Microprocessors,Isr,我想知道FIQ和IRQ中断系统之间的区别 任何微处理器,例如:ARM926EJ。这可能是错误的。我只知道FIQ代表快速中断请求,IRQ代表中断请求。从这些名字判断,我猜FIQ的处理(抛出?)速度将比IRQ快。这可能与处理器的设计有关,其中FIQ比IRQ更快地中断进程。如果我错了,我很抱歉,但我通常做更高级的编程,我现在只是猜测。FIQ优先级更高,可以在处理另一个IRQ时引入。最关键的资源由FIQ处理,其余的由IRQ处理。这是现代ARM CPU(以及其他一些)的一个特性 根据专利: 一种执行快速测
任何微处理器,例如:ARM926EJ。这可能是错误的。我只知道FIQ代表快速中断请求,IRQ代表中断请求。从这些名字判断,我猜FIQ的处理(抛出?)速度将比IRQ快。这可能与处理器的设计有关,其中FIQ比IRQ更快地中断进程。如果我错了,我很抱歉,但我通常做更高级的编程,我现在只是猜测。FIQ优先级更高,可以在处理另一个IRQ时引入。最关键的资源由FIQ处理,其余的由IRQ处理。这是现代ARM CPU(以及其他一些)的一个特性 根据专利: 一种执行快速测试的方法 数字数据处理器中的中断 具有处理更多数据的能力 提供了多个中断。当 接收到快速中断请求时 设置了标志,并且程序计数器 和条件代码寄存器 存储在堆栈上。最后 中断服务程序返回 从中断指令中检索 条件代码寄存器 包含数码相机的状态 数据处理器和检查以查看 是否设置了该标志。 如果设置了该标志,则表示 快速中断得到了维护,并且 因此,只有程序计数器是可用的 无支撑的
换句话说,FIQ只是一个更高优先级的中断请求,在请求服务期间通过禁用IRQ和其他FIQ处理程序来确定优先级。因此,在处理活动FIQ中断期间,不会发生其他中断。我相信这就是您要寻找的:
本质上,FIQ将是具有多个低优先级IRQ源的最高优先级。混沌已经回答得很好,但到目前为止还没有涉及到的另一点是FIQ位于向量表的末尾,因此通常/传统的做法是直接在那里启动例程,而IRQ向量通常就是这样。(跳到别的地方)。在完全隐藏和上下文切换后立即避免额外的分支是一个轻微的速度增益。另一个原因是在FIQ的情况下,需要较少的寄存器来推入堆栈,FIQ模式有R8到R14(FIQ寄存器FIQ优先级更高,毫无疑问,剩余的点我不确定。。。。。FIQ将支持高速数据传输(或)通道处理,当需要高速数据处理时,我们使用FIQ,通常IRQ用于正常中断处理。FIQ没有任何魔力。FIQ仅仅可以中断正在服务的任何其他IRQ,这就是为什么它被称为“快速”。系统对这些中断的反应更快,但其余的都是一样的。这取决于我们如何设计中断处理程序,因为FIQ最终可能不需要一条分支指令,而且它有一组独特的r8-r14寄存器,所以下次我们回到FIQ中断时,我们不需要推/弹出堆栈。当然,它节省了一些周期,但是让更多的处理程序为一个FIQ服务是不明智的,是的,FIQ具有更高的优先级,但没有理由说它处理中断更快,两个IRQ/FIQ都以相同的CPU频率运行,所以它们必须以相同的速度运行。ARM调用
FIQ
快速中断,这意味着IRQ
是正常优先级。在任何实际系统中,中断源将比两个设备多得多,因此将有一些外部硬件中断控制器,允许屏蔽、优先化这些多个中断源,并将中断请求线驱动到处理器
在某种程度上,这使得两种中断模式之间的区别变得冗余,许多系统根本不使用nFIQ
,或者以类似于其他处理器上的不可屏蔽(NMI
)中断的方式使用它(尽管FIQ
在大多数ARM处理器上是软件可屏蔽的)
那么为什么ARM称FIQ为“快速”
r8-r14
。R14是保存来自FIQ的返回地址(+4)的链接寄存器。但是,如果您的FIQ处理程序能够被编写为只使用r8-r13
,那么它可以通过两种方式利用这些存储寄存器:
- 其一是,它不会产生推送和弹出中断服务例程(ISR)使用的任何寄存器的开销。这可以在进入和退出ISR时节省大量的周期
- 此外,处理程序可以依赖于从一次调用到下一次调用的寄存器中持久化的值,因此例如,
可以用作指向硬件设备的指针,并且处理程序可以依赖于下一次调用时r8
中的相同值r8
0x1C
)意味着如果FIQ处理程序代码直接放在向量表末尾,则不需要分支-代码可以直接从0x1C
执行。这在进入ISR时节省了几个周期void __attribute__ ((interrupt ("FIQ"))) fiq_handler(void)
{
/* registers set previously by FIQ setup. */
register volatile char *src asm ("r8"); /* A source buffer to transfer. */
register char *uart asm ("r9"); /* pointer to uart tx register. */
register int size asm ("r10"); /* Size of buffer remaining. */
if(size--) {
*uart = *src++;
}
}
00000000 <fiq_handler>:
0: e35a0000 cmp sl, #0
4: e52d3004 push {r3} ; use r11, r12, etc as scratch.
8: 15d83000 ldrbne r3, [r8]
c: 15c93000 strbne r3, [r9]
10: e49d3004 pop {r3} ; same thing.
14: e25ef004 subs pc, lr, #4
tst r10, #0 ; counter zero?
ldrbne r11, [r8] ; get character.
subne r10, #1 ; decrement count
strbne r11, [r9] ; write to uart
subs pc, lr, #4 ; return from FIQ.