我一直在处理 ARM 上的 Linux 中断:
request_irq()
可用于注册中断。
在单个中断线上,您可以使用 注册多个中断SHA_SHIRQ
,即普通 IRQ。
- Linux 是否允许在特定的中断线上注册多个 SA_INTERRUPT ?
- 也就是说,我们可以为 ARM快速中断或
FIQ
s 注册多个中断处理程序吗?
我一直在处理 ARM 上的 Linux 中断:
request_irq()
可用于注册中断。在单个中断线上,您可以使用 注册多个中断SHA_SHIRQ
,即普通 IRQ。
FIQ
s 注册多个中断处理程序吗?与 一样IRQ
,FIQ
具有来自向量表的单个入口点。您必须根据位/数字检查中断控制器和分支以处理特定的FIQ
. 对于FIQ
,这往往会否定存储的寄存器,因为两个例程都必须共享它们。可以让一个FIQ
例程拥有已存储的寄存器,而其他例程则显式保存它们。
当前的Linux FIQ 代码支持 FIQ 处理程序的堆叠,而不是多个同时FIQ
源。您的代码可以使用set_fiq_regs()来初始化FIQ
寄存器。您可以分配一个中断控制器基地址,并拥有检查interrupt source
和分支到适当处理程序的代码。 注意:,内核不提供任何与FIQ
. 您将不得不编写自己的联锁。我认为 FIFO 实现和其他无锁内核模式FIQ
一样应该是安全的。
编辑:FIQ
这是主线代码中 的示例。它是一个 IMX SSI 驱动程序。
SSI 汇编器、符号接口、主文件。 FIQ
也称为软 DMA。FIQ
延迟非常小,应该允许高服务频率。通常只有一个设备需要这种关注。您可以在处理程序中多路分解(分支/函数调用/源编号上的指针)。FIQ
a经常用汇编程序编写的原因是,如果你使用它,性能是隐含的。此外,FIQ
通常不会被屏蔽,它会增加IRQ
延迟对于系统的其余部分。通过在汇编程序中编码使其更快减少了IRQ
延迟。
另请参阅:FIQ-IRQ 差异
在同一个 IRQ 上注册的所有中断处理程序都放在列表中。当中断触发时,内核会依次调用每个中断处理程序(最后注册的先注册或先注册的先注册——我不记得是哪一个)。FAST_IRQ 在这方面并不特殊。
每个中断处理程序都有责任检查其硬件以查看它是否需要处理任何事情。如果没有,只需返回,以便下一个处理程序可以查看。