zoukankan      html  css  js  c++  java
  • 电平触发与边沿触发中断的理解

    关于handle_level_irq与handle_edge_irq的理解:                                                                      
    电平中断处理handle_level_irq:
        (1)mask_ack_irq;
        (2)标记IRQ_INPROGRESS;
        (3)若发生同一中断线上的中断嵌套、则退出;
        (4)中断处理(在驱动程序的中断处理过程中可能会unmask中断);
        (5)unmask中断;
      由于驱动程序中可能unmask中断,因此对于同一中断线上可能发生中断嵌套(假定系统设定为IRQF_SHARED),故需要(2)、(3)步骤;可以看出对于电平触发中断方式而言,在软件上并不支持中断嵌套(硬件上支持)。

    边沿中断处理handle_edge_irq:
        (1)若首次进入,则ack_irq,且标记IRQ_INPROGRESS;
        (2)若非首次进入,则mask_ack_irq,且标记IRQ_PENDING | IRQ_MASK;退出
        (3)执行中断,如果发先当次执行中断为原被阻塞的中断,则清除IRQ_PENDING | IRQ_MASK,并进行unmask;
    可以看出在软件上,对于同一中断线,当被设置为handle_edge_irq时支持中断嵌套(仅可嵌套一级深度)。

    如果用handle_level_irq来处理边沿触发中断:
    由于handle_level_irq中调用了mask,直到中断处理完后才会调用unmask,因此在这器件软件上不会响应中断,此时会发生中断失。

    如果用handle_edge_irq来处理电平触发中断:
    handle_edge_irq首次不会调用mask,只执行了ack,因此在执行handle_IRQ_event过程中若打开中断,此时就会发生中断嵌套,此时第二次进入时虽然没有执行handle_IRQ_event,但是却标记了IRQ_PENDING | IRQ_MASK,结构是:虽然设备只提出一次中断请求,但是却两次执行了handle_IRQ_event。

  • 相关阅读:
    Linux基础-4磁盘管理
    Linux基础-3文本处理
    Linux基础-2文件及目录管理
    Linux基础-1使用命令帮助
    解决Eclipse 添加 Tomcat 中的一些问题
    非关系型数据库 -- redis
    Java 学习笔记 五 -- Jedis
    Java 学习笔记 四 -- DBUtils的使用
    Java 学习笔记 三 -- 数据库连接池 Druid
    Java 学习笔记 二 -- JDBC事务
  • 原文地址:https://www.cnblogs.com/openix/p/3288956.html
Copyright © 2011-2022 走看看