我是新手,对 IRQ 和 FIQ 有一些疑问。请尝试澄清这些。
有多少个 FIQ 和 IRQ 通道臂?
我们可以为每个通道编写多少个处理程序?
此外,如果我们可以为单个中断通道注册多个处理程序,arm 如何知道要运行哪个处理程序。
4 回答
IRQ
和之间的区别FIQ
可以追溯到 ARM 由 Acorn 设计的早期。总是将IRQ
线路连接到将大量中断源多路复用在一起的中断控制器。这正是所有现代 ARM 中发生的情况
FIQ 背后的基本原理是提供具有最高优先级的极低延迟响应(它可以安全地抢占IRQ
处理程序)。相对大量的影子寄存器有助于编写将处理程序的状态存储在 CPU 寄存器中并且不会撞到堆栈的处理程序。
影子寄存器几乎与 APCS 通常用于函数调用的那些设置相反,因此在 C 中编写处理程序将导致最多 8 个非影子寄存器的推送和最终弹出。任何类型的中断解复用都会消除FIQ
可能带来的任何性能优势。
所有这一切意味着,只有在FIQ
一个中断设备需要真正硬实时中断响应的非常专业的应用程序中使用,并且您愿意在汇编程序中编写您的处理程序时,才真正有任何好处。您还需要弄清楚如何与系统的其余部分同步——其中一些将依赖于禁用IRQ
来保持数据同步。
传统上,手臂有一个中断线,您可以将其发送到两个处理程序 FIQ 或 IRQ 之一。FIQ 具有更大的 FIQ 模式专用寄存器组,因此您需要存储在堆栈上的内容更少。从那里您读取供应商特定的寄存器(如果有)以确定中断源,然后分支到单独的处理程序。
最近出现了带有许多中断 128、256 的弯臂架构,每个中断都有一个单独的处理程序。因此,一般地询问 arm 并没有那么多样化,而是像询问有关 x86 的一般性问题。
所有这些信息都可以在不同架构的 ARM 架构参考手册中轻松获得,并且内核的引脚分配(供应商构建其芯片的依据)记录在各种内核的技术参考手册中(也很容易获得) . infocenter.arm.com 拥有架构和技术参考手册以及 amba/axi(供应商连接的数据总线)。你的问题在这些文件中得到了完整的回答。
ARM 处理器直接只支持 ONE IRQ 和 ONE FIQ。ARM 通过称为中断控制器的外设支持多个中断。ARM 标准中断控制器称为 GIC(通用中断控制器)。
GIC 有许多输入用于连接外设的中断线和两条连接到 IRQ 和 FIQ 的输出线。基本上它充当多路复用器。GIC 驱动程序将设置诸如中断优先级、类型(IRQ/FIQ)、屏蔽等配置。
在传统的 ARM 系统中,异常向量中的 IRQ 和 FIQ 各有一个条目。根据触发中断的行,调用 IRQ 或 FIQ 处理程序。中断处理程序查询 GIC(具体来说是 GIC CPU 接口寄存器)以获取中断号。根据这个中断号,调用相应的设备处理程序。
中断的数量取决于具体的 GIC 实现。因此,您必须查看系统中中断控制器的手册才能获得这些细节。
注意:中断处理略有不同,具体取决于您正在编码的特定 ARM 内核。
其实这个问题有点棘手。您必须在问题中指定您使用的 ARM 架构。ARM v7-A 和 ARM v7-R 架构参考手册 (ARM ARM) 指定了一个 FIQ 和一个 IRQ,正如许多人已经回答的那样。但是 ARMv7-M(用于 Cortex-M 处理器)在处理器中集成了一个中断控制器,因此提供了一个 NMI(而不是 FIQ)和多达 240 条 IRQ 线。
更多信息:ARMv7 A 和 ARMv7-R 架构参考手册:http ://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0406c/index.html
ARMv7-M 架构参考手册: http: //infocenter.arm.com/help/index.jsp ?topic=/com.arm.doc.ddi0403e.b/index.html
例如,Cortex M4 规格表:http ://www.arm.com/products/processors/cortex-m/cortex-m4-processor.php