中断一般可以分成上半部以及下半部,所谓中断上半部cpu通常是关中断的,这个时候主要是从硬件那里接收一些数据,然后触发中断下半部。一出中断后,根据相应的中断下半部的优先级去执行相应的中断下半部。中断下半部主要用于数据的处理,这个时候中断往往是打开的。为什么要有中断上下半部的原因主要有两点:
1 如果中断函数内处理的事情非常多的话,因为这个时候cpu 是关中断的,这样会无法及时相应其它的中断,对实时性损害太大。
2 中断的处理是可以是有优先级的,有的硬件设备的中断处理可以延迟处理,但是有的必须马上要处理,这也是为什么中断下半部有task 0 和workqueue, idle event的原因。
具体流程如下图所示:
![](https://img-my.csdn.net/uploads/201302/06/1360146375_1515.png)
raw os支持的中断下半部方法有task 0 以及workqueue, task 0 的优先级要高于workqueue。workqueue的优先级是高于idle event 的。task 0 和workqueue的区别是task 0 不能调用能引起睡眠的函数,但是workqueue是能调用引起睡眠的函数的, idle event是基于事件驱动的,优先级是最低的,也可以做为中断下半部去使用,如果这个中断的处理优先级是很低的话。
综上所述,raw os为软件化的区分中断优先级提供了有效地手段,即task 0,workqueue以及idle event。对于系统的实时性也有了根本的保障。