一、linux中断使用流程
1、先获取要使用中断对应的中断号。
2、使用request_irq申请中断,此函数会激活中断,不用了就用free_irq。
3、注册中断处理函数irqreturn_t (*irq_handler_t)(int, void*)。
4、使能、禁止。
二、上半部和下半部
1、上半部:中断处理函数,处理比较快的不会占用很长时间的可以放到上半部完成。
2、下半部:处理时间较长的,把那部分代码提取出来叫给下半部去处理。
3、中断服务函数一定要处理的越快越好,没有绝对的指明那些属于上半部哪些属于下半部,有以下建议:
1)如果处理的内容不希望被其他中断打断,放上半部。
2)如果处理的任务对时间敏感,放上半部。
3)如果处理的任务与硬件有关,放上半部。
4)除上述特点的其他任务放下半部执行。
4、上半部的执行方式就是中断处理函数,下半部提供了以下几种机制:
1)软中断
“BH” ,谁触发谁执行。
struct softirq_action
{
void (*action)(struct softirq_action *);
};
2)tasklet
利用软中断来实现的机制,也需要用到上半部,在上半部中调用tasklet_schedule函数使tasklet在合适的时间内运行。
3)工作队列
特点是将推后的工作交给一个内核线程是执行,因为工作在进程上下文,所以工作队列允许睡眠或重新调度。
三、设备树中中断节点信息
1、 interrupts 属性描述中断信息, #interrupt-cells 描述了 interrupts 属性的 cells 大小,也就是一条信息有几个 cells。interrupt-parent指定父中断,interrupt第一个cells是gpio编号。
四、获取中断号
1、中断信息已经写入到设备树中,编写驱动需要使用到中断号,使用函数irq_of_parse_and_map函数从interrupt属性中提取对应的设备号,也可以使用函数gpio_to_irq获取gpio对应的中断号。