Linux设备驱动-中断处理笔记

来源:互联网 发布:大班幼儿美工作品图片 编辑:程序博客网 时间:2024/05/16 16:17
 

为什么需要中断?

1)外设的处理速度一般慢于CPU

2CPU不能一直等外部事件

所以设备必须有一种方法来通知CPU它的工作进度,这就是中断。

Linux驱动程序中,为设备实现一个中断

步骤:

1)向内核注册中断

2)实现中断处理函数

中断注册

int request_irq(unsigned int irq, void (*handler)(int, void*, struct pt_regs *), unsigned long flags, const char *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参数必须是唯一的

   为什么要唯一?

在释放中断时要void free_irq()不然内核不知道你要释放哪个设备(共享中断时有不只一个设备在用这个中断)

3)不能使用disable_irq(unsigned int irq)(这个函数是禁止中断的)

   为什么?

如果使用了,共享中断信号线的设备同样无法使用中断,也就是无法正常工作了。

中断处理程序

中断处理程序是中断上下文件中运行的,所以它的行为受到某些限制:

1)不能向用户空间发送或者接受数据

2)不能使用可能引起阻塞的函数

3)不能使用可能引起调度的函数

中断函数实现流程:

释放中断

void free_irq(unsigned int irq, void *dev_id)