我一直在使用ARM上的Linux中断:
request_irq()
可用于注册中断。在单个中断线上,您可以使用SHA_SHIRQ
注册多个中断,即正常的IRQ。
FIQ
注册多个中断处理程序吗?答案 0 :(得分:4)
与IRQ
一样,FIQ
从向量表中只有一个入口点。您必须根据位/编号检查中断控制器和分支以处理特定的FIQ
。对于FIQ
,这往往会否定存储寄存器,因为两个例程都必须共享它们。可以让一个FIQ
例程拥有存储寄存器,其他人明确保存它们。
current Linux FIQ code支持堆叠FIQ处理程序,而不支持多个同时FIQ
来源。您的代码可以使用set_fiq_regs()初始化FIQ
个寄存器。您可以分配一个中断控制器基址,并使用代码检查interrupt source
并分支到相应的处理程序。 注意:,内核不会向FIQ
提供任何communication mechanism。你必须编写自己的联锁。我认为FIFO实现应该是FIQ
安全的以及其他lock free内核模式。
修改:以下是主线代码中FIQ
的示例。它是IMX SSI驱动程序。
SSI assembler,Symbol interface,main file。 FIQ
也称为软DMA 。 FIQ
延迟非常小,应该允许高服务频率。通常只有一个设备需要这种关注。您可以在处理程序中解复用(分支/函数调用/指向源编号)。 FIQ
通常用汇编程序编写的原因是,如果使用它, performance 是隐式的。此外,FIQ
通常不会屏蔽,并且会为系统的其余部分增加IRQ
延迟。通过在汇编程序中编码来加快速度,可以减少IRQ
延迟。
另请参阅:FIQ-IRQ difference
答案 1 :(得分:1)
在同一个IRQ上注册的所有中断处理程序都放在列表中。当中断触发时,内核依次调用每个中断处理程序(最后一个首先注册或首先注册 - 我不记得哪个随意)。 FAST_IRQ在这方面并不特别。
每个中断处理程序都有责任检查其硬件是否需要处理任何事情。如果没有,只需返回,以便下一个处理程序可以看。