中断下半部的妙用

版权声明:本文为博主原创文章,未经博主允许不得转载 https://blog.csdn.net/qq_37600027/article/details/84311551

中断下半部

中断处理程序是内核中很重要的一部分,但是由于本身存在着一些限制,所以他只能完成整个中断处理程序中的上半部分。

具体局限如下:

  1. 中断处理程序是以异步方式运行,并且他有可能会打断其他重要的代码(甚至有可能是其他的中断程序)的执行,因此为了避免被打断的代码停止时间过长。中断处理程序要执行的越快越好
  2. 如果当前有一个中断处理程序正在执行,在最好的情况下,在最好的情况下(IRQF_DISABLED没有被设置),与该中断同级的其他中断会被屏蔽,如果设置了IRQF_DISABLED,当前处理器上所有其他的中断都会被屏蔽,因为禁止中断后硬件与系统无法通信。
  3. 由于中断处理程序需要对硬件进行操作,所以他们通常有很高的时限要求
  4. 中断处理程序不再进程上下文中运行,所以他们不能阻塞。

因为上述原因,所以整个中断处理流程就被分为了两部分,第一部分是中断处理程序(上半部),内核通过对他的异步执行完成对硬件中断的即时响应。

  1. 下半部

下半部的任务就是执行与中断处理程序密切相关但中断处理程序本身不执行的工作,理想的情况是,最好是中断处理程序将所有的工作都交给下半部来执行,我们只希望在上半部执行的越少越好,我们期望中断处理程序能够尽快的返回。

但是中断处理程序注定要完成一部分工作,例如,中断处理程序几乎都需要通过操作硬件对中断的到达进行确认,有时他还会从硬件拷贝数据,因为这些工作对时间十分敏感,所以只能交给中断处理程序去执行。

剩下的几乎所有其他工作都是下半部执行的目标。实际上并不存在严格明确的规定来说明到底什么任务应该在那个部分中完成,具体如何做决定完全取决于驱动程序开发者自己的判断,在理论上不存在什么错误,但是轻率的实现效果往往不理想。记住中断处理程序会异步执行,并且在最好的情况下他也会锁定当前的中断线,因此将中断处理程序持续执行的时间缩短到最小成都线的非常重要。对于上半部和下半部之间划分工作,尽管不存在某种严格的规则,但还是有一些提示可供借鉴

  • 如果一个任务对时间非常敏感,将其放在中断处理程序中执行
  • 如果一个任务和硬件有关,将其放在中断处理程序中执行
  • 如果一个任务要保证不被其他中断(特别是相同的终端)打断,将其放在中断处理程序中执行
  • 其他所有任务,考虑放在下半部执行
  1. 为什么要用下半部

理解为什么要让工作推后执行以及在什么时候推后执行非常关键,你希望尽量减少中断处理程序中要完成的工作,因为它在运行的时候,当前的中断线在所有处理器上都会被屏蔽,更糟糕的是,如果一个处理程序是IRQF_DISABLED类型,他执行的时候会禁止所有本地终端,而且把本地中断线全聚德屏蔽掉,而缩短中断被屏蔽的时间对系统的响应能力和性能都至关重要,再加上中断处理程序要与其他程序异步执行,所以很明显,我们必须尽力缩短中断处理程序的执行。解决办法就是把一些工作放到以后去做。

但具体放到以后什么时候去执行呢?在这里,以后仅仅用来强调不是马上而已,理解这一点相当重要,下班并不需要知名一个确切时间,只要把这些任务推迟一点,让他们在系统不太繁忙并且中断恢复后执行就可以了。通常下半部在中断处理程序一返回就马上执行。下半部执行的关键在于当他们运行的时候,允许响应所有的中断。

猜你喜欢

转载自blog.csdn.net/qq_37600027/article/details/84311551