头文件
include/linux/interrupt.h
extern int __must_check
request_threaded_irq(unsigned int irq, irq_handler_t handler,
irq_handler_t thread_fn,
unsigned long flags, const char *name, void *dev);
static inline int __must_check
request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,
const char *name, void *dev)
{
return request_threaded_irq(irq, handler, NULL, flags, name, dev);
}
request_irq与 request_threaded_irq非常类似,request_irq在request_threaded_irq基础上进行了封装,将参数thread_fn可以置为NULL。handler是在发生中断时首先要执行的程序,类似中断处理上文,执行处理费时下文可以增加tasklet或者工作队列实现。thread_fn是要在线程里执行的handler类似中断处理下文。IRQF_ONESHOT用来标明是在中断线程thread_fn执行完后在重新打开该中断。
request_threaded_irq:将中断处理线程化,将上下文缩短为kernel thread 执行后续中断任务,运用调度机制减少延时,提高中断响应,提高处理效率。(在负载较大/系统占用资源高时效果明显,避免了中断丢失情况)。
request_irq:类似于同步处理事务,适合非高频率中断响应,在负载较大/系统占用资源高时会出现处理任务丢失现象。(不具备高可用特性)。