Arm 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(以及其他一些)的一个特性 根据专利: 一种执行快速测

我想知道FIQ和IRQ中断系统之间的区别
任何微处理器,例如: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为“快速”

  • 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
  • 那么为什么许多系统不使用FIQ呢

  • FIQ处理程序代码通常不能用C编写-它需要直接用汇编语言编写。如果您非常关心ISR性能,希望使用FIQ,那么在任何情况下,您可能都不希望通过使用C编码在表中留下几个周期,
    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.