linux中断处理原理分析

1、 中断概念
       为什么需要中断?
       1)外设的处理速度一般慢于CPU
       2)CPU不能一直等待外部事件
       所以设备必须有一种方法来通知CPU它的工作进度,这种方法就是中断。

2、 中断实现
       在Linux驱动程序中,为设备实现一个中断包含两个步骤:
       1)向内核注册中断
       2)实现中断处理函数
3、 中断注册
       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表示成功,或者返回一个错误码
      中断注册(参数)
      1) unsigned int irq  中断号。
      2)void (*handler)(int,void *,struct pt_regs *)  中断处理函数。
      3)unsigned long flags 与中断管理有关的各种选项。
      4)const char * devname  设备名
      5)void *dev_id  共享中断时使用。
      a)中断注册(中断标志)
      在flags参数中,可以选择一些与中断管理有关的选项,如:
      1)IRQF_DISABLED(SA_INTERRUPT)
            如果设置该位,表示是一个“快速”中断处理程序;如果没有设置这位,那么是一个“慢速”中断处理程序。
      2)IRQF_SHARED(SA_SHIRQ)
           该位表明中断可以在设备间共享。
      b)快速/慢速中断
      这两种类型的中断处理程序的主要区别在于:快速中断保证中断处理的原子性(不被打断),而慢速中断则不保证。换句话说,也就是“开启中断”标志位(处理器IF)在运行快速中断处理程序时是关闭的,因此在服务该中断时,不会被其他类型的中断打断;而调用慢速中断处理时,其它类型的中断仍可以得到服务。
      c) 共享中断
      共享中断就是将不同的设备挂到同一个中断信号线上。Linux对共享的支持主要是为PCI设备服务。共享中断也是通过request_irq函数来注册的,但有三个特别之处:
      1)申请共享中断时,必须在flags参数中指定 IRQF_SHARED位
      2)dev_id参数必须是唯一的。
      3)共享中断的处理程序中,不能使用disable_irq(unsigned int irq)  为什么? 如果使用了这个函数,共享中断信号线的其它设备将同样无法使用中断,也就无法正常工作了。
4、 中断处理程序
       什么是中断处理程序,有何特别之处?中断处理程序就是普通的C代码。特别之处在于中断处理程序是在中断上下文中运行的,它的行为受到某些限制:
       1) 不能向用户空间发送或接受数据
       2) 不能使用可能引起阻塞的函数
       3) 不能使用可能引起调度的函数

5、 中断处理函数流程
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);

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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值