關於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。