中断处理

来源:互联网 发布:ubuntu最低配置 编辑:程序博客网 时间:2024/05/01 12:44

查看设备状态有两种方式,一种是轮询,一种是中断,可是轮询代价太大,如果是简单的系统,处理的时间单一,比如只有一个按键操作,那么可以轮询,如果是操作系统的,则是对响应来说是灾难性的。

中断的引入是由I/O操作的不确定性以及与CPU之间的速度矛盾。设备通过某种硬件信号来异步地唤起CPU的注意,说明中断的到来,是否处理。这些硬件的信号就是中断。每个中断设备都被分配一个相关的标识符,被称为中断请求(IRQ)号。当处理器检测到某一IRQ号对应的中断产生时,它将停止现在的工作,并启动该IRQ所对应的中断服务例程(ISR)。中断处理函数在中断上下文中执行。

中断上下文

ISR是直接与硬件交互的非常重要的代码段。它们拥有立即执行的特权,以提高系统的性能,所以ISR代码效率要高。ISR会打断当前进程的执行,ISR在受制的环境下执行,即所谓的中断上下文。中断上下文的注意事项:

1.中断上下文代码不可以停止运行。就是不能调用引起睡眠的函数,比如schedule_timeout(),sleep()。在调用系统API时,也要考虑是否会引起睡眠。

2.在中断处理函数中保护临界区时,只能使用自旋锁,不可以使用互斥锁,因为那会引起睡眠。

3.中断处理程序不能与用户空间直接交互数据,因为它们经由进程上下文与用户空间建立连接。为什么中断处理函数不能睡眠,因为调度器工作于进程之间,中断处理函数被调出,将无法返回就绪队列。

4.中断处理函数一方面需要快速地未其他进程让位,另一方面又需要完成它的工作。为了避免这个冲突,中断处理函数通常分为顶半部和底半部。顶半部设一个标识以宣称它已经为该中断服务了。而重大的工作负载则给底半部,执行被延后,在顶半部执行时,所有的中断都是使能的。

5.中断处理函数不必是可以重入的。在某中断函数运行时,此IRQ被禁止了。所以不可能在多个处理器上又多个中断函数的实例。

6.中断有优先级,在执行中断处理函数时可以被更高级的中断打断。快速中断禁止嵌套,就是不可打断,所有中断都被屏蔽。所以在设置快中断时对系统影响很大,如果中断处理时间过长,系统的整体响应时间下降。

分配IRQ

设备驱动程序必须将它们的IRQ和中断处理函数关联。IRQ的分配可以又多种方法,可以固定分配也可以探测得到,具体和体系架构和总线有关。

注册中断处理函数使用request_irq(...)。它的第一个参数是中断号,第二个参数为中断处理函数的指针 irqreturn_t (*fun)(int irq, void* devId),第一个参数中断号,第二个为设备标识符,它的返回值类型为irqreturn_t,中断成功返回IRQ_HANDLED,否则返回IRQ_NONE。第三个参数是中断标志位,IRQF-DISABLED为快速中断。下一个参数用来标识这个设备,最后一个只有在共享中断时使用,用来区别设备。

使用free_irq(int irq, void *devId)来释放一个IRQ。


原创粉丝点击