我想知道FIQ和IRQ中断系统之间的区别 任何微处理器,例如:ARM926EJ。
答案 0 :(得分:152)
ARM调用FIQ
快速中断,暗示IRQ
正常优先级。在任何实际系统中,将存在比仅仅两个设备更多的中断源,因此将存在一些外部硬件中断控制器,其允许这些多个源的屏蔽,优先级等,并且将中断请求线驱动到处理器。 / p>
在某种程度上,这使得两种中断模式之间的区别是冗余的,并且许多系统根本不使用nFIQ
,或者以类似于不可屏蔽的方式使用它(NMI
)在其他处理器上发现的中断(尽管FIQ
在大多数ARM处理器上都是软件可屏蔽的。)
那么为什么ARM会“快速”调用FIQ?
r8-r14
。 R14是链接寄存器,它保存来自FIQ的返回地址(+4)。但是如果你的FIQ处理程序能够被编写为仅使用r8-r13
,那么它可以通过两种方式利用这些存储寄存器:
r8
可以用作指向硬件设备的指针,并且处理程序可以依赖于相同的值在r8
下次调用时。{/ li>
0x1C
)末尾的FIQ位置意味着如果FIQ处理程序代码直接放在向量表的末尾,则不需要分支 - 代码可以直接从{ {1}}。这样可以在进入ISR时节省几个周期。那么为什么许多系统不使用FIQ?
0x1C
。由符合ARM r8-r13
过程调用标准的C编译器生成的代码将使用寄存器ATPCS
作为暂存值,并且不会在函数末尾生成正确的r0-r3
恢复返回码。 答案 1 :(得分:65)
FIQ 或快速中断通常被称为 Soft DMA 。的特点FIQ 是,
最后一个功能也比必须分支的 IRQ 略有优势。
有些人引用汇编程序编码来处理FIQ的难度。 gcc
具有编码 FIQ 处理程序的注释。这是一个例子,
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
0x1c
处的汇编程序可能看起来像,
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.
真正的 UART 可能有一个就绪位,但使用FIQ进行高速软DMA 的代码只能是10-20条指令。主代码需要轮询FIQ r10
以确定缓冲区何时完成。主(非中断代码)可以通过使用msr
指令切换到 FIQ 模式并传输非存储R0-来传输和设置存储的 FIQ 寄存器R7到存储的R8-R13寄存器。
RTOS中断延迟通常为500-1000条指令。对于Linux,它可能是2000-10000指令。实时DMA总是更可取,但对于高频简单中断(如缓冲器传输), FIQ 可以提供解决方案。
由于 FIQ 与速度有关,如果您在汇编程序中编码不安全(或愿意花时间),则不应该考虑它。由无限运行的程序员编写的汇编程序将比编译器更快。有GCC协助可以帮助新手。
由于 FIQ 有一个单独的掩码位,因此它几乎无处不在。在早期的ARM CPU(例如ARM926EJ)上,必须通过屏蔽中断来实现一些原子操作。即使使用最先进的Cortex CPU,操作系统也会掩盖中断。通常,服务时间对于中断并不重要,而是信令和服务之间的时间。在这里, FIQ 也有优势。
FIQ 不可扩展。为了使用多个FIQ
源,必须在中断例程之间共享分组寄存器。此外,必须添加代码以确定导致中断/ FIQ的原因。 FIQ 通常是一招。
如果您的中断非常复杂(网络驱动程序,USB等),那么FIQ可能没什么意义。这基本上与复用中断的语句相同。 库存寄存器提供了6个自由变量,其中从不从内存中加载。寄存器比内存快。寄存器比L2缓存更快。寄存器比L1缓存更快。寄存器很快。如果你不能编写一个运行6个变量的例程,那么 FIQ 就不合适了。注意:如果使用16位值,则可以使用 shift 和 rotate 双重执行某些寄存器,这些寄存器在ARM上是空闲的。
显然 FIQ 更复杂。 OS开发人员希望支持多个中断源。 FIQ 的客户要求会有所不同,通常他们会意识到他们应该让客户推出自己的。通常对 FIQ 的支持是有限的,因为任何支持可能会减损主要利益, SPEED 。
不要抨击我的朋友 FIQ 。这是一个系统程序员针对愚蠢硬件的一招。它不适合所有人,但它有其自己的位置。当所有其他减少延迟和提高ISR服务频率的尝试失败时, FIQ 可能是您唯一的选择(或更好的硬件团队)。
在一些安全关键应用程序中也可以用作恐慌中断。
答案 2 :(得分:59)
现代ARM CPU(以及其他一些CPU)的一项功能。
来自专利:
执行快速的方法 在数字数据处理器中中断 有能力处理更多 提供一个中断。当一个 收到快速中断请求a 标志设置和程序计数器 和条件代码寄存器 存储在堆栈中。在结束时 中断服务程序返回 从中断指令检索 条件代码寄存器 包含数字的状态 数据处理器和检查看 是否已设置标志。 如果设置了标志,则表示a 快速中断得到了服务 因此只有程序计数器 未叠加。
换句话说,FIQ只是一个优先级较高的中断请求,它通过在请求服务期间禁用IRQ和其他FIQ处理程序来确定优先级。因此,在处理活动FIQ中断期间不会发生其他中断。
答案 3 :(得分:6)
混沌已经得到了很好的回答,但到目前为止还没有涉及的另一点是FIQ位于向量表的末尾,因此在那里启动例程是常见的/传统的,而IRQ向量通常只是。 (即跳到其他地方)。在完全存储和上下文切换之后立即避免额外的分支是一个轻微的速度增益。
答案 4 :(得分:4)
FIQ具有更高的优先级,可以在处理另一个IRQ时引入。最关键的资源由FIQ处理,其余资源由IRQ处理。
答案 5 :(得分:4)
另一个原因是在FIQ的情况下,需要较少数量的寄存器来推入堆栈,FIQ模式有R8到R14_fiq寄存器
答案 6 :(得分:1)
我相信这就是你要找的东西:
http://newsgroups.derkeiler.com/Archive/Comp/comp.sys.arm/2005-09/msg00084.html
基本上,FIQ将具有多个优先级较低的IRQ源的最高优先级。
答案 7 :(得分:1)
FIQs具有更高的优先级,毫无疑问,其余的点我不确定...... FIQs将支持高速数据传输(或)通道处理,需要高速数据处理我们使用FIQ并且通常使用IRQ正常的中断处理。
答案 8 :(得分:1)
对于FIQ没有任何魔力。 FIQ只能中断正在服务的任何其他IRQ,这就是它被称为“快速”的原因。系统对这些中断的反应速度更快,但其余的都是相同的。
答案 9 :(得分:0)
它取决于我们如何设计中断处理程序,因为FIQ最后它可能不需要一个分支指令,它也有唯一的r8-r14寄存器集,所以下次我们回到FIQ中断时我们不需要推/弹出堆栈。当然它可以节省一些周期,但是再次让更多的处理程序为一个FIQ提供服务是不明智的,而且FIQ具有更高的优先级,但没有任何理由说它能更快地处理中断,IRQ / FIQ都以相同的CPU频率运行,所以他们必须以相同的速度运行。
答案 10 :(得分:-5)
这可能是错的。我所知道的是FIQ代表快速中断请求,而IRQ代表中断请求。从这些名称判断,我猜测FIQ将比IRQ更快地处理(抛出?)。它可能与处理器的设计有关,其中FIQ将比IRQ更快地中断进程。如果我错了,我道歉,但我通常会做更高级别的编程,我现在只是猜测。