我想知道FIQ和IRQ中断系统的区别 任何微处理器,例如:ARM926EJ。
最佳答案
ARM 调用 FIQ
快速中断,暗示 IRQ
是普通优先级。在任何实际系统中,都会有比两个设备更多的中断源,因此会有一些外部硬件中断 Controller ,它允许对这些多个源进行屏蔽、优先级排序等,并将中断请求线驱动到处理器。
在某种程度上,这使得两种中断模式之间的区别变得多余,并且许多系统根本不使用nFIQ
,或者以类似于不可屏蔽( NMI
)在其他处理器上发现中断(尽管 FIQ
在大多数 ARM 处理器上是可软件屏蔽的)。
So why does ARM call FIQ "fast"?
- FIQ 模式有自己的专用存储寄存器
r8-r14
。 R14 是链接寄存器,保存来自 FIQ 的返回地址(+4)。但是,如果您的 FIQ 处理程序能够编写为仅使用 r8-r13,则它可以通过两种方式利用这些存储寄存器:- 其一是它不会产生推送和弹出中断服务例程 (ISR) 使用的任何寄存器的开销。这可以节省大量进入和退出 ISR 的周期。
- 此外,处理程序可以依赖从一次调用到下一次调用期间保存在寄存器中的值,例如,
r8
可以用作指向硬件设备的指针,并且处理程序可以依赖于下次调用时,r8
中的值相同。
- FIQ 位置位于异常向量表的末尾 (
0x1C
) 意味着如果 FIQ 处理程序代码直接放置在向量表的末尾,则不需要分支 - 代码可以执行直接来自0x1C
。这节省了进入 ISR 的几个周期。 - FIQ 的优先级高于 IRQ。这意味着当内核发生 FIQ 异常时,它会自动屏蔽 IRQ。 IRQ 不能中断 FIQ 处理程序。相反的情况则不然 - IRQ 不会屏蔽 FIQ,因此 FIQ 处理程序(如果使用)可以中断 IRQ。此外,如果IRQ和FIQ请求同时发生,内核将首先处理FIQ。
So why do many systems not use FIQ?
- FIQ 处理程序代码通常不能用 C 语言编写 - 它需要直接用汇编语言编写。如果您非常关心 ISR 性能并想要使用 FIQ,那么在任何情况下您可能都不想通过用 C 进行编码而在表中留下几个周期,但更重要的是,C 编译器不会生成遵循以下限制的代码:仅使用寄存器
r8-r13
。由符合 ARM 的ATPCS
过程调用标准的 C 编译器生成的代码将使用寄存器r0-r3
作为临时值,并且不会生成正确的cpsr
在函数末尾恢复返回代码。 - 所有中断 Controller 硬件通常位于 IRQ 引脚上。仅当您有一个最高优先级中断源连接到 nFIQ 输入并且许多系统没有一个永久最高优先级源时,使用 FIQ 才有意义。将多个源连接到 FIQ,然后让软件在它们之间划分优先级是没有值(value)的,因为这几乎消除了 FIQ 相对于 IRQ 的所有优势。
关于arm - FIQ和IRQ中断系统有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/973933/