Chinaunix首页 | 论坛 | 博客
  • 博客访问: 631973
  • 博文数量: 1008
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 5175
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-31 09:44
文章分类
文章存档

2012年(1008)

我的朋友

分类:

2012-08-01 11:05:26

原文地址:中断处理 作者:luozhiyong131

Linux驱动程序中,为设备实现一个中断包含两个步骤:

1.向内核注册中断

2.实现中断处理函数

 

中断注册

request_irq用于实现中断的注册功能:

int request_irq(unsigned int irq,void (*handler)(int, void*, struct pt_regs *),unsigned long flags,const char *devname,void *dev_id)

返回表示成功,或者返回一个错误码

中断注册(参数)

 unsigned int irq 中断号。

 void (*handler)(int,void *,struct pt_regs *) 中断处理函数。

 unsigned long flags 与中断管理有关的各种选项。

 const char * devname    设备名

 void *dev_id 共享中断时使用。

 

中断注册(中断标志)

flags参数中,可以选择一些与中断管理有关的选项,:

IRQF_DISABLEDSA_INTERRUPT   如果设置该位,表示是一个“快速”中断处理程序;如果没有设置这位,那么是一个“慢速”中断处理程序。

IRQF_SHAREDSA_SHIRQ 该位表明中断可以在设备间共享。

 

快速/慢速中断

这两种类型的中断处理程序的主要区别在于:快速中断保证中断处理的原子性(不被打断),而慢速中断则不保证。换句话说,也就是“开启中断”标志位(处理器IF)在运行快速中断处理程序时是关闭的,因此在服务该中断时,不会被其他类型的中断打断;而调用慢速中断处理时,其它类型的中断仍可以得到服务。

 

共享中断

共享中断就是将不同的设备挂到同一个中断信号线上Linux对共享的支持主要是为PCI设备服务。

共享中断也是通过request_irq函数来注册的,但有三个特别之处:

1.申请共享中断时,必须在flags参数中指定IRQF_SHARED

2. dev_id参数必须是唯一的。

3.共享中断的处理程序中,不能使用disable_irq(unsigned int irq)

              如果使用了这个函数,共享中断信号线的其它设备将同样无法使用中断,也就无法正常工作了。

 

中断处理程序

什么是中断处理程序,有何特别之处?

中断处理程序就是普通的C代码。特别之处在于中断处理程序是在中断上下文中运行的,它的行为受到某些限制:

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

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

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

中断处理函数流程

void short_sh_interrupt(int irq, void *dev_id, struct pt_regs *regs)

{

/* 判断是否是本设备产生了中断(为什么要做这样的检测?) */

value = inb(short_base);

if (!(value & 0x80)) return;

/* 清除中断位(如果设备支持自动清除,则不需要这步) */

outb(value & 0x7F, short_base);

/* 中断处理,通常是数据接收*/

。。。。。。。。。

/* 唤醒等待数据的进程*/

wake_up_interruptible(&short_queue);

}

 

释放中断

当设备不再需要使用中断时(通常在驱动卸载时), 应当把它们返还给系统,使用:void free_irq(unsigned int irq, void *dev_id)

 

实例 mini2440_buttons.rar   

阅读(123) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~