为什么需要中断机制?
1.外设的处理速度一般慢于CPU
2.CPU不能一直等待外部设备
所以设备必须要有一种方法通知CPU它的工作进度,这种机制就是中断
一. linux中断处理流程
1.entry-armv.S文件的irq_svc标号就是统一的中断入口
2.接下来是保护现场
3.展开irq_handler宏,进一步展开arch_irq_handler_defaut(在entry-macro-multi.S),在这里获取中断编号(原理也是读取intpend等寄存器,不同平台不一样)
4.接下来是进入asm_do_IRQ(带有中端号)--》generic_handle_irq-->generic_handle_irq_desc。利用中断号找出irq_desc结构,这个结构体中有action成员,action里面有事先注册的中断处理函数。
5.取出处理函数执行
6.返回现场
对上图的分析:通过arch_irq_handler_defaut(在entry-macro-multi.S),在这里获取中断编号(原理也是读取intpend等寄存器,不同平台不一样),接下来是进入asm_do_IRQ(带有中端号)--》generic_handle_irq-->generic_handle_irq_desc。利用中断号找出irq_desc结构,这个结构体中有action成员,action里面有事先注册的中断处理函数。
二. 驱动程序的任务
1.实现中断处理程序
2.注册中断处理程序到Linux内核,即中断号对应的irq_desc结构中的action成员。
3.不用的时候要注销中断驱动
中断注册函数:紧接着设备注册而注册
1 request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags, const char *name, void *dev)
2 //成功返回0,否则返回负数,一般紧接着设备的注册而注册
3 /***************************************************/
4 参数: irq,中断号(与硬件相关)
5 handler,中断处理函数
6 flags,中断的选项位
7 (1)IRQF_DISABLED(SA_INTERRUPT):如果设置了表明是快速中断(使用快速中断时,中断总开关关闭),否则是慢速中断
8 (2)IRQF_SHARED(SA_SHIRD)表明是共享中断
9 name,设备名
10 dev,共享中断号(作用参考上图)
11 /***************************************************/
中断注销函数:
1 void free_irq(unsigned int irq, void * dev_id) 2 //通常在驱动卸载时使用
关于共享中断:
这是Linux的一个特色,多个硬件可以共享一个中断号,可以有多个中断处理函数,即action的成员可以很多个,类似于一个链表,的那个中断发生的时候,会逐一调用这些中断处理函数,在每一个处理函数中最开始就判断是不是自己对应的硬件设备发生中断,若是的话就继续执行,否则立即退出调用下一个处理函数。
中断处理程序:
(1)他运行在中断上下文,所以不能使用可能引起阻塞或者调度的函数。否则实时性得不到满足。
(2)一开始判断是否产生中断
(3)清除中中断标志
(4)硬件相关操作