当前位置:  开发笔记 > 运维 > 正文

什么是linux中的链接irq,何时需要使用?

如何解决《什么是linux中的链接irq,何时需要使用?》经验,为你挑选了1个好方法。

什么是链式IRQ?做什么chained_irq_enterchained_irq_exit做什么,因为在中断发生后IRQ线被禁用,但是chained_irq_enter调用与屏蔽中断有关的功能.如果该行已被禁用,为什么要屏蔽中断?



1> Sam Protsenk..:

什么是链式irq?

如何在父(中断控制器)设备的IRQ处理程序中为子设备调用中断处理程序有两种方法.

    链式中断:

    "链接"意味着那些中断只是函数调用链(例如,SoC的GPIO模块中断处理程序是从GIC中断处理程序调用的,就像函数调用一样)

    generic_handle_irq() 用于中断链接

    子IRQ处理程序在父HW IRQ处理程序内部被调用

    你不能调用可能在链式(子)中断处理程序中睡眠的函数,因为它们仍处于原子上下文中(硬件中断)

    这种方法通常用于SoC内部GPIO模块的驱动程序

    嵌套中断

    "嵌套"表示这些中断可以被另一个中断中断; 但它们不是真正的HW IRQ,而是线程IRQ

    handle_nested_irq() 用于创建嵌套中断

    在函数创建的新线程内部调用子IRQ处理程序handle_nested_irq(); 我们需要它们在进程上下文中运行,以便我们可以调用休眠总线函数(如可能睡眠的I2C函数)

    您可以调用可能在嵌套(子)中断处理程序中睡眠的函数

    这种方法常用于外部芯片的驱动程序,如GPIO扩展器,因为它们通常通过I2C总线连接到SoC,而I2C功能可能会睡眠

说到上面讨论的驱动程序:

irq-gic驱动程序使用CHAINED GPIO irqchips方法处理具有多个GIC的系统; 此提交添加了该功能

gpio-omap驱动程序(如上所述)使用GENERIC CHAINED GPIO irqchips方法.看到这个提交.它是从使用常规转换而来的CHAINED GPIO irqchips,在实时内核上它将线程化IRQ处理程序,但在非RT内核上它将是硬IRQ处理程序

'gpio-max732x'驱动程序使用NESTED THREADED GPIO irqchips方法

做什么chained_irq_enterchained_irq_exit做什么

这些功能实现硬件中断流控制,即通知中断控制器芯片何时屏蔽和取消屏蔽当前中断.

    对于FastEOI中断控制器(最现代的方式):

    chained_irq_enter() 没做什么

    chained_irq_exit()调用irq_eoi()回调告诉中断控制器中断处理完成

    对于具有掩码/取消掩码/确认功能的中断控制器

    chained_irq_enter() 屏蔽当前中断,并在设置了ack回调时对其进行确认

    chained_irq_exit() 揭露中断

因为在中断发生后,irq线被禁用,但是chained_irq_enter如果线路已经被禁用,则调用与屏蔽中断相关的功能为什么屏蔽中断?

IRQ线被禁用.但是我们仍然需要在中断处理结束时写入EOI寄存器.或者发送ACK用于边沿级中断.

这解释了为什么在中断处理程序中禁用中断.

推荐阅读
低调pasta_730
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有