您的位置:首页 > 运维架构 > Linux

Linux系统中断处理编程

2015-08-29 19:21 387 查看
与裸机中断处理流程相似,Linux系统的中断处理流程如下:

①中断产生时,系统跳转到统一的中断入口irq_svc处执行

②获取中断号

③根据中断号找到结构数组irq_desc[]中对应的一项,irq_desc结构是中断处理描述符

④从irq_desc结构中找到中断处理函数

由于获取中断号并跳转到相应的处理函数去执行是由内核完成的,因此程序员编写中断程序的工作有:

①实现中断处理函数

②注册中断处理函数到Linux内核中,即使中断号和中断处理函数建立联系

③卸载驱动时也需要注销中断

Linux系统中request_irq函数用于注册中断,成功则返回0,失败返回一个错误编码

request_irq
原型:int request_irq(unsigned int irq,void (*handler)(int, void*, struct pt_regs *), unsigned long flags,const char *devname,void *dev_id)
头文件:<linux/interrupt.h>
功能:注册中断
参数:irq:中断号,与硬件相关
handler:中断处理函数指针
flags:与中断管理有关的选项
devname:设备名
dev_id:共享中断时使用,共享中断号的不同设备应该要有不同的dev_id


flags选项常用的值有:

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

IRQF_SHARED(SA_SHIRQ):设置该位表明该中断号是多个设备共享的。

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

多个设备共享同一中断号:一个中断号与多个设备的中断处理函数相关联。共享的这些设备其中一个发生中断就会跳转到中断函数去处理,由于这一个中断号与多个设备的中断函数相关联,因此会执行多个中断处理函数。虽然执行多个中断处理函数,但由于每个中断处理函数都会在开头进行自检判断是否由对应的设备产生中断,若不是则结束函数。如串口和网卡共享同一中断号,当串口发生中断时,系统会依次执行串口的中断处理函数和网卡的中断处理函数。由于该中断不是由网卡产生的,所以网卡的中断处理函数在进行自检后直接结束函数的执行。

中断处理函数的特别之处是在中断上下文中运行的,它的行为受到某些限制:

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

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

一般来说,中断处理函数的任务是:

①检查设备是否产生中断

②清除中断产生标志

③完成相应的硬件操作

当设备不再需要使用中断时(通常在驱动卸载时),应当把它们注销,使用函数:

void free_irq(unsigned int irq, void *dev_id)


irq为中断号,dev_id与注册中断时使用的参数dev_id相同,用于区分共享中断的不同设备
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: