上半部分和下半部分概念澄清

时间:2017-07-14 06:02:46

标签: linux interrupt-handling top-halves

根据上半部分和下半部分的引导线,当任何中断到来时,它由两半处理。所谓的上半部分是实际响应中断的例程 - 您使用request_irq注册的中断。下半部分是一个例程,由上半部分安排,以便在更安全的时间执行。上半部分处理程序和下半部分之间的最大区别在于,在执行下半部分期间启用了所有中断 - 这就是为什么它在更安全的时间运行的原因。在典型情况下,上半部分将设备数据保存到特定于设备的缓冲区,调度其下半部分并退出:此操作非常快。然后,下半部分执行所需的任何其他工作,例如唤醒进程,启动另一个I / O操作,等等。此设置允许上半部分在下半部分仍在工作时为新中断服务。

但是如果中断在更安全的时间由下半部分处理,那么逻辑上当中断到来时它必须等到下半部分找到一些更安全的时间来执行中断,这将限制系统并且必须等到处理中断,例如:如果我正在进行项目,当温度高于特定限制时提供LED闪烁指示,在这种情况下,如果在某些安全时间可用时完成中断处理(根据下半部概念),则闪烁操作将被延迟... 。请澄清我对所有中断的处理方式的疑问????

3 个答案:

答案 0 :(得分:1)

中断:中断是一种事件,它根据CPU内部和外部的硬件电路生成的电信号,改变处理器执行的指令顺序。

当产生任何中断时,将其分为两半。

1)前半部

2)下半部分

上半部分:上半部分在CPU收到中断后立即执行。在上半部分中,禁用了中断和调度程序。这部分代码仅包含关键代码。该代码的执行时间应尽可能短,因为此时中断被禁用,我们不想错过由设备产生的其他中断。

下半部分:下半部分的工作用于使上半部分剩下的工作(递延)继续进行。当执行这段代码时,将启用中断,并禁用调度程序。下半部由Softirqs和Tasklets安排以运行延期工作

注意:前半部分代码应尽可能短或确定性,并且也不应包含任何阻塞调用。

答案 1 :(得分:0)

使用上半部分/下半部分中断体系结构时,通常会有一个高优先级的中断处理线程。

此中断处理线程的优先级高于系统中的其他线程(为此,某些供应商的SDK指定“中断”优先级)。通常有一个队列,并且队列中没有任何工作时线程会休眠。设计该线程/队列是为了可以从中断上下文中安全地添加工作。

调用上半部处理程序时,它将处理硬件操作,然后将下半部处理程序添加到中断队列中。上半部处理程序返回,并退出中断上下文。然后,操作系统将检查接下来运行的线程。因为中断线程有可用的工作,并且因为它是最高优先级,所以它将在下一个运行。这样可以最大程度地减少您担心的延迟。

自然会有一些延迟抖动,因为队列中可能还有其他中断在LED之前触发(在您的示例中)。对此有不同的解决方案,具体取决于应用程序和实时要求。一种是具有基于中断优先级的排序队列。排队操作时,这会产生额外的成本,但同时也确保您的中断将被优先处理。对于临界延迟,另一种选择是在上半中断处理程序中完成所有工作。

记住这种架构的目的很重要:

  1. 最大限度地减少在中断上下文中花费的时间,因为在处理当前中断时(可能)禁用了其他中断,并且增加了处理这些中断的等待时间
  2. 防止用户调用从中断上下文中不安全调用的函数

我们仍然希望尽早运行下半部处理程序以减少延迟,因此当您说“等待更安全的时间”时,这意味着“在中断上下文之外”。

答案 2 :(得分:0)

如果眨眼操作太重要而不能延迟,则可以将其置于上半部,而根本不可以有下半部。但是,取决于您上半部分的操作,它可能会或可能不会影响系统性能。

我建议您为这两种情况编写代码并执行一些分析