现在的位置: 首页 > 综合 > 正文

中断处理

2017年08月24日 ⁄ 综合 ⁄ 共 1248字 ⁄ 字号 评论关闭

为什么需要中断

1--外设的处理速度一般慢于cpu

2--cpu不能一直等待外部事件

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

还有轮询机制----长期占用cpu资源,导致cpu利用率低。

中断实现----

1--向内核注册中断

int request_irq

(

unsigned int irq,中断号

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

unsigned long flags,与中断处理有关的各种选项

const char *devname,设备名

void *dev_id共享中断时使用

)

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

flags,与中断处理有关的各种选项

IRQF_DISABLED(SA_INTERRUPT)

若设置该位,表示是一个快速中断处理程序,反之为慢速中断处理程序。

IRQF_SHARED(SA_SHIRQ)

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

快速/慢速中断

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


2实现中断处理函数

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

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

1--申请共享中断时,必须在flags参数中指定IRQF_SHARED(SA_SHIRQ)

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;

清除中断标志位(若设备支持自动清除,则不需这步)

out(value & 0x7f,short_base)

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

............................

唤醒等待数据的进程

wake_up_interruptible(&short_queue);

}


释放中断---

通常在驱动卸载时,释放。

void free_irq(unsigned int irq,void *dev_id)


抱歉!评论已关闭.