一. 简介
上一篇文章学习了 Linux内核提供的中断 API函数。文章地址如下:
本文继续来学习 Linux内核中断框架。主要来学习一下:Linux内核中断的上半部与下半部,为了实现中断驱动开发做准备。
二. Linux内核中断的上半部与下半部
1. Linux内核中断的上半部与下半部简介
我们在使用 request_irq()函数
申请中断的时候,注册的中断服务函数属于中断处理的上半部,只要中断触发,那么
中断处理函数就会执行。
举例说明:
有些中断处理过程就是比较费时间,我们必须要对其进行处理,缩小中断处理函数的执行时间。比如,电容触摸屏通过中断通知
SOC(例如 IMX6ULL芯片)
有触摸事件发生,
SOC
响应中断,然后
通过
IIC
接口读取触摸坐标值,并将其上报给系统。
但是,我们都知道
IIC
的速度最高也只有
400Kbit/S
,所以,在中断中通过
IIC
读取数据就会浪费时间。
我们可以将通过
IIC
读取触摸数据
的操作暂后执行,中断处理函数仅仅相应中断,然后清除中断标志位即可。
这个时候中断处理 过程就分为了两部分:
上半部:上半部就是中断处理函数,那些处理过程比较快,不会占用很长时间的处理就可以放在上半部完成。
下半部:如果中断处理过程比较耗时,那么就将这些比较耗时的代码提出来,交给下半部
去执行,这样中断处理函数就会快进快出。
2. 如何分配上半部与下半部功能实现
因此,
Linux
内核将中断分为上半部和下半部的主要目的就是实现中断处理函数的快进快
出,那些对时间敏感、执行速度快的操作可以放到中断处理函数中,也就是上半部。
剩下的所
有工作都可以放到下半部去执行。例如,
在上半部将数据拷贝到内存中,关于数据的具体处理就
可以放到下半部去执行。
至于哪些代码属于上半部,哪些代码属于下半部并没有明确的规定,
一切根据实际使用情况去判断,这个就很考验驱动编写人员的功底了。
这里有一些可以借鉴的参考点:
(1)如果要处理的内容不希望被其他中断打断,那么可以放到上半部。
(2)如果要处理的任务对时间敏感,可以放到上半部。
(3)如果要处理的任务与硬件有关,可以放到上半部
除了上述三点以外的其他任务,优先考虑放到下半部。
上半部处理很简单,直接编写中断处理函数就行了,关键是下半部该怎么做呢?
Linux
内
核提供了多种下半部机制,接下来我们来学习一下这些下半部机制。