linux驱动学习--第十六天:第十章 Linux 中断与时钟 (一)概念、流程和框架

中断与定时器

 

所谓中断是指 CPU 在执行程序的过程中,出现了某些突发事件时CPU 必须暂停执行当前的程序,转
去处理突发事件,处理完毕后CPU 又返回原程序被中断的位置并继续执行。
根据中断的来源,中断可分为内部中断和外部中断,内部中断的中断源来自CPU 内部(软件中断指令、
溢出、除法错误等,例如,操作系统从用户态切换到内核态需借助CPU 内部的软件中断),外部中断的中
断源来自CPU 外部,由外设提出请求。
根据是否可以屏蔽中断分为可屏蔽中断与不屏蔽中断(NMI),可屏蔽中断可以通过屏蔽字被屏蔽,屏
蔽后,该中断不再得到响应,而不屏蔽中断不能被屏蔽。
根据中断入口跳转方法的不同,中断分为向量中断和非向量中断。采用向量中断的CPU 通常为不同的
中断分配不同的中断号,当检测到某中断号的中断到来后,就自动跳转到与该中断号对应的地址执行。不
同中断号的中断有不同的入口地址。非向量中断的多个中断共享一个入口地址,进入该入口地址后再通过
软件判断中断标志来识别具体是哪个中断。也就是说,向量中断由硬件提供中断服务程序入口地址,非向
量中断由软件提供中断服务程序入口地址。

嵌入式系统以及 X86 PC 中大多包含可编程中断控制器(PIC),许多MCU 内部就集成了PIC。如在
80386 中,PIC 是两片i8259A 芯片的级联。通过读写PIC 的寄存器,程序员可以屏蔽/使能某中断及获得中
断状态,前者一般通过中断MASK 寄存器完成,后者一般通过中断PEND 寄存器完成。
定时器在硬件上也依赖中断来实现,图 10.1 给出了典型的嵌入式微处理内可编程间隔定时器(PIT)
的工作原理,它接收一个时钟输入,当时钟脉冲到来时,将目前计数值增1 并与预先设置的计数值(计数
目标)比较,若相等,证明计数周期满,产生定时器中断并复位目前计数值。

 

Linux 中断处理程序架构

设备的中断会打断内核中进程的正常调度和运行,系统对更高吞吐率的追求势必要求中断服务程序尽
可能地短小精悍。但是,这个良好的愿望往往与现实并不吻合。在大多数真实的系统中,当中断到来时,
要完成的工作往往并不会是短小的,它可能要进行较大量的耗时处理。
图 10.2 描述了Linux 内核的中断处理机制。为了在中断执行时间尽可能短和中断处理需完成大量工作之间找
到一个平衡点,Linux 将中断处理程序分解为两个半部:顶半部
(top half)和底半部(bottom half)。
顶半部完成尽可能少的比较紧急的功能,它往往只是简
单地读取寄存器中的中断状态并清除中断标志后就进行“登
记中断”的工作。“登记中断”意味着将底半部处理程序挂
到该设备的底半部执行队列中去。这样,顶半部执行的速
度就会很快,可以服务更多的中断请求。
现在,中断处理工作的重心就落在了底半部的头上,它来
完成中断事件的绝大多数任务。底半部几乎做了中断处理
程序所有的事情,而且可以被新的中断打断,这也是底半
部和顶半部的最大不同,因为顶半部往往被设计成不可中断。底半部则相对来说并不是非常紧急的,而且
相对比较耗时,不在硬件中断服务程序中执行。
尽管顶半部、底半部的结合能够改善系统的响应能力,但是,僵化地认为 Linux 设备驱动中的中断处
理一定要分两个半部则是不对的。如果中断要处理的工作本身很少,则完全可以直接在顶半部全部完成。
其他操作系统中对中断的处理也采用了类似于Linux 系统的方法,真正的硬件中断
服务程序都应该尽可能短。因此,许多操作系统都提供了中断上下文和非中断上下
文相结合的机制,将中断的耗时工作保留到非中断上下文去执行。例如,在VxWorks
系统中,网络设备包接收中断到来后,中断服务程序会通过netJobAdd()函数将耗时
的包接收和上传工作交给tNetTask 任务去执行。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值