Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 上半部分和下半部分概念说明_Linux_Interrupt Handling_Top Halves - Fatal编程技术网

Linux 上半部分和下半部分概念说明

Linux 上半部分和下半部分概念说明,linux,interrupt-handling,top-halves,Linux,Interrupt Handling,Top Halves,根据上半部分和下半部分的指导线,当出现任何中断时,由两部分处理。所谓的上半部分是实际响应中断的例程,即您向request_irq注册的中断。下半部分是一个由上半部分调度的例程,稍后在更安全的时间执行。上半部分处理程序和下半部分处理程序的最大区别在于,所有中断都是在下半部分执行期间启用的,这就是为什么它在更安全的时间运行。在典型场景中,上半部分将设备数据保存到特定于设备的缓冲区,调度下半部分,然后退出:此操作非常快。然后,下半部分执行所需的任何其他工作,如唤醒进程、启动另一个I/O操作等。此设置允

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


但是,如果中断由下半部分在更安全的时间内处理,那么在逻辑上,当中断出现时,它必须等到下半部分找到更安全的时间来执行中断,这将限制系统,并且必须等到中断被处理,例如:如果我在项目中工作,当温度高于特定限值时,给出LED闪烁指示,在这种情况下,如果在安全时间可用时进行中断处理(根据下半部分概念)然后闪烁操作将被延迟…请澄清我对如何处理所有中断的疑问???

当使用上半部分/下半部分中断架构时,通常有一个高优先级中断处理线程

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

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

自然会有一些延迟抖动,因为队列中可能有其他中断在LED前面触发(在您的示例中)。根据应用程序和实时要求,有不同的解决方案。一种是基于中断优先级设置排序队列。这在排队操作时会产生额外的成本,但它也确保了中断将按优先级处理。对于关键延迟,另一个选项是在上半部分中断处理程序中完成所有工作

记住这种体系结构的目的很重要:

  • 尽量减少在中断上下文中花费的时间,因为在处理当前中断时(可能)禁用了其他中断,并且增加了处理这些中断的延迟
  • 防止用户从中断上下文调用不安全的函数

  • 我们仍然希望尽快运行下半部分处理程序以减少延迟,因此当您说“等待一个更安全的时间”时,这意味着“在中断上下文之外”。如果闪烁操作太重要而不能延迟,您可以将其放入上半部分,而可能根本没有下半部分。但是,这取决于您在上半部分所做的工作,它可能会影响系统性能,也可能不会影响系统性能


    我建议您为这两种情况编写代码并执行一些配置文件中断:中断是一种事件,它改变处理器执行的指令序列,与CPU内部和外部硬件电路生成的电信号相对应

    当产生任何中断时,它由两部分处理

    1) 上半身

    2) 下半部

    上半部分:当CPU接收到中断时,上半部分立即执行。在上半部分,上下文中断和调度程序被禁用。这部分代码只包含关键代码。此代码的执行时间应尽可能短,因为此时中断被禁用,我们不希望错过设备生成的其他中断

    下半部分:下半部分的作业用于运行上半部分的剩余(延迟)作业。当执行这段代码时,中断被启用,调度程序被禁用。下半部分由SoftIRQ和Tasklet安排运行延迟工作


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

    对于课堂/培训课程来说,这似乎是一个完美的问题,不太合适。很抱歉,从我的问题@Gerhardh中删除了“C”标记