设备模型-中断

来源:互联网 发布:java websocketcli 编辑:程序博客网 时间:2024/06/14 07:26

原创kylin_zeng:http://blog.csdn.net/kylin_fire_zeng

一、中断:
在Linux驱动程序中,为设备实现一个中断
包含两个步骤:
1.向内核注册中断
2.实现中断处理函数

二、中断注册:
request_irq用于实现中断的注册功能
int request_irq(unsigned intirq, //中断号。
        void (*handler)(int, void*, struc pt_regs*), //中断处理函数。
        unsigned long flags,//与中断管理有关的各种选项。比如:可以设置成 IRQ_TYPE_EDGE_BOTH表示上升

                                          沿和下降沿都可以产生中断
        const char *devname,//设备名
        void *dev_id)//共享中断时使用。
        
返回0表示成功,或者返回一个错误码
参数:flags有
   1)IRQF_DISABLED(SA_INTERRUPT)//如果设置该位,表示是一个“快速”中断处理程序;如果没有设置这位,那么是一个“慢速”中断处理程序。
   2)IRQF_SHARED(SA_SHIRQ)//该位表明中断可以在设备间共享。
   快速慢速中断:这两种类型的中断处理程序的主要区别在于:快速中断保证中断处理的原子性(不被打断),而慢
  速中断则不保证。换句话说,也就是“开启中断”标志位(处理器IF)在运行快速中断处理程序时是
  关闭的,因此在服务该中断时,不会被其他类型的中断打断;而调用慢速中断处理时,其它类型
   的中断仍可以得到服务。
   注:其实就是快速中断不允许有嵌套中断。
  
   共享中断:共享中断就是将不同的设备挂到同一个中断信号线上。Linux对共享的支持主要是为PCI设备服务。
   共享中断也是通过request_irq函数来注册的,但有三个特别之处:
   1.申请共享中断时,必须在flags参数中指定IRQF_SHARED位
   2.dev_id参数必须是唯一的。
   3.共享中断的处理程序中,不能使用disable_irq(unsigned int irq)因为如果使用了这个函数,共享中断信号线的其它设备将同样无法使用中断,也就无法正常工作了

三、中断处理程序:
 中断处理程序是在 中断上下文 (还有一种是进程上下文)中运行的,它的行为受到某些限制:
 1.不能向用户空间发送或接受数据
 2.不能使用可能引起阻塞的函数
 3.不能使用可能引起调度的函数 
 理由都是中断处理程序无法对应一个进程或者线程,所以不能向用户空间发,因为他不知道哪个用户,也不能用阻塞和调度,因为没有对应的。
 
 
 
 中断处理函数流程:
 void short_sh_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{
  /* 判断是否是本设备产生了中断(为什么要做这样的检测?)  因为这个是共享中断,cpu并不知道是谁引起这个中断的,cpu使用办法是这该总线的的所以设备都去执行中断处理函数*/
  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)

原创粉丝点击