Linux设备驱动-中断处理笔记
为什么需要中断?
1)外设的处理速度一般慢于CPU
2)CPU不能一直等外部事件
所以设备必须有一种方法来通知CPU它的工作进度,这就是中断。
在Linux驱动程序中,为设备实现一个中断
步骤:
1)向内核注册中断
2)实现中断处理函数
中断注册
intrequest_irq(unsignedintirq,void(*handler)(int,void*,structpt_regs*),unsignedlongflags,constchar*devname,void*dev_id)
返回0表示成功,或者返回一个错误码
参数:
irq:中断号
handler:中断处理函数
flags:与中断管理有关的各种选项
devname:设备名
dev_id:共享中断时使用
在flags参数中,可以选择一些与中断管理有关的选项
如:IRQF_DISABLED(SA_INTERRUPT)
如果设置该位,表示是一个“快速”中断处理程序
如果没有,表示是一个“慢速”中断处理程序
IRQF_SHARED(SA_SHIRQ)
该位表示中断可以在设备间共享
快速中断不允许中断嵌套(不被打断)
慢速中断可以中断嵌套,其它类型的中断可以得到服务(默认)
共享中断
共享中断就是将不同的设备挂到同一个中断信号线上。
Linux对共享的支持主要是为PCI设备服务
共享中断也是通过request_irq函数来注册的,但有三个特别之处:
1)申请共享中断时,必须在flags参数中指定IRQF_SHARED位
2)dev_id参数必须是唯一的
为什么要唯一?
在释放中断时要voidfree_irq()不然内核不知道你要释放哪个设备(共享中断时有不只一个设备在用这个中断)
3)不能使用disable_irq(unsignedintirq)(这个函数是禁止中断的)
为什么?
如果使用了,共享中断信号线的设备同样无法使用中断,也就是无法正常工作了。
中断处理程序
中断处理程序是中断上下文件中运行的,所以它的行为受到某些限制:
1)不能向用户空间发送或者接受数据
2)不能使用可能引起阻塞的函数
3)不能使用可能引起调度的函数
中断函数实现流程:
释放中断
voidfree_irq(unsignedintirq,void*dev_id)