在中断的调用流程中讲到Linux中对中断的处理最终会调用到在驱动程序中注册的中断处理函数。中断处理函数(interrupt handle / interruptservice routine)是设备驱动程序的一部分,内核通过它来回应特定的中断。中断处理函数同普通的函数并无太大的区别,但由于它是运行在中断上下文(interrupt context)中的,所以他不能休眠和引起阻塞。
中断处理函数的原型在linux/interrupt.h中:
typedef irqreturn_t (*irq_handler_t)(int, void *);
如我们可以定义一个中断处理函数:
static irqreturn_t m_key_irq_handle(int irq, void *dev)
{
… …
return IRQ_HANDLED;
}
其中第一个参数是中断号。第二个参数是我们注册中断时传入的一个指针通常我们传入的是我们的设备结构体。我们通过request_irq函数来注册我们的中断处理函数,他的原型是:
int request_irq(unsigned int irq, irq_handler_t handler,
unsigned long irqflags, const char *devname, void *dev_id);
irq是要申请的中断号。
handler即使我们的中断处理函数,dev_id即是要传给中断处理函数的第二个参数。
irqflags是中断处理的属性,可以指定中断的出发方式及处理方式。这里列出几个比较重要的flag:
IRQF_DISABLED-当该位被设置时在执行相应的中断处理函数时内核

本文详细介绍了Linux设备驱动程序中中断处理函数的角色,它在中断上下文中运行,不能导致阻塞。通过request_irq函数注册中断处理函数,参数包括中断号、处理函数和设备标识。中断处理的属性如IRQF_DISABLED、IRQF_SHARED等控制中断行为。request_irq初始化struct irqaction,并通过irq_desc数组将中断处理信息与中断关联,完成注册流程。
最低0.47元/天 解锁文章
527

被折叠的 条评论
为什么被折叠?



