linux内核中申请中断函数:
int request_threaded_irq(unsigned int irq, irq_handler_t handler,
irq_handler_t thread_fn, unsigned long irqflags,
const char *devname, void *dev_id)
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即线程为NULL时的request_threaded_irq函数。
中断标志位:
1)标志位irqflags使用IRQF_SHARED时,使用共享中断号的两个设备中断触发类型需一致。
否则无法申请成功。中断触发类型如下:
#define IRQF_TRIGGER_NONE 0x00000000
#define IRQF_TRIGGER_RISING 0x00000001
#define IRQF_TRIGGER_FALLING 0x00000002
#define IRQF_TRIGGER_HIGH 0x00000004
#define IRQF_TRIGGER_LOW 0x00000008
2)在使用电平触发的情况下,需注意在中断上文中需要将中断屏蔽掉,在中断下文处理完之后再开启中断,否则在中断处理的过程中会一直触发中断。在使用线程作为中断下文时,可使用#define IRQF_ONESHOT 0x00002000标志位, IRQF_ONESHOT的作用是保证thread_handler函数执行完整,才会接受下一个中断信号,但使用该标志位后中断无法共享。