電平觸發與邊沿觸發中斷的理解


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM