Chinaunix首页 | 论坛 | 博客
  • 博客访问: 251540
  • 博文数量: 52
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1538
  • 用 户 组: 普通用户
  • 注册时间: 2013-04-24 07:45
个人简介

生活就像海洋,只有意志坚强的人,才能到达彼岸。

文章存档

2013年(52)

分类: LINUX

2013-08-25 10:18:24

为什么需要中断?

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

2、CPU不能一直等待外部事件,所以必须有一种方法来通知CPU的工作进度,这种方法就是中断。

2>中断的实现

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

1、向内核注册中断

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

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

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

参数:

    unsigned int irq: 中断号。

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

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

    const char* devname: 设备名。

    void* dev_id:共享中断时使用。 

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

IRQF_DISABLED (SA_INTERRUPT):如果设置该位,表示一个快速中断处理程序;如果没有设置这位,

那么是一慢速中断处理程序。  

快速/慢速中断:这两种类型的中断处理程序的主要区别在于:快速中断保证中断处理的原子性(不

被打断),而慢速中断则不保证。换句话说,也就是“开启中断”标志位(处理器IF)在运行快速中

断处理程序时是关闭的,因此在服务该中断时不会被其他类型的中断打断;而调用慢速中断处理时,

其它类型的中断仍可以得到服务。 

IRQ_SHARED(SA_SHIRQ):该位表明中断可以在设备间共享。

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

申请共享中断时,必须在flags参数中指定IRQF_SHARED位,dev_id参数必须要唯一。不能使

disable_irq(unsigned int irq),如果使用了这个函数,共享中断信号的其它设备将同样无法使用

中断,也就无法正常工作了。


2、实现中断处理函数

    中断处理程序就是普通的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)

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