电平触发与边沿触发中断的理解

关于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。

原文地址:https://www.cnblogs.com/openix/p/3288956.html