0

關於Linux的中斷處理中斷處理Linux和待處理中斷

在我的司機基本的問題,我禁止外的中斷線路,並做一些處理,在此期間,外圍設備發送中斷。當我啓用中斷線時,我收到了當時發生的掛起中斷。

這是正確的理解?

如果是,我該如何丟棄在中斷禁止期間產生的那些中斷。

我可以實現一些使用某些延遲的工作,尋找linux API或乾淨的方式來做到這一點。

在啓用中斷之前,我們可以設置 desc = irq_to_desc(client-> irq); desc-> istate & =〜IRQS_PENDING; 並啓用中斷線,它將清除所有掛起的中斷,但代碼表示我們不應該修改這些變量。

謝謝

+0

上中斷,我不認爲忽略它是有史以來做合理的事情。您禁用線路,從設備讀取事件並再次啓用該線路。如果在線路禁用時中斷到達,您可能已經看到觸發該線路的事件,但很可能沒有。所以你不應該忽略它。你必須再次檢查是否有未處理的事件。 – 2014-10-09 10:04:20

+1

如果我們檢查__enable_irq函數,它會調用check_irq_resend(desc,irq);這將重新發送任何掛起的中斷。 – shunty 2014-10-09 10:22:47

+0

嗯,是的,因爲如果IRQ在禁用時發生,它仍然需要處理。如果不是,你可能會錯過導致它的事件。 – 2014-10-09 11:13:14

回答

1

可能是我不理解,但我認爲你必須做的是:

  • 直接在設備上禁用interupt並沒有使用內核中斷處理例程

  • 調查你的設備,獲取所有事件。可能是你應該在一個線程中斷處理程序

  • 做到這一點,當完成重新啓用該設備

+0

這將解決問題,但設備不暴露寄存器來控制中斷。請分享您對以下解決方案的意見。在啓用中斷之前,我們可以設置desc = irq_to_desc(client-> irq); desc-> istate&=〜IRQS_PENDING;並啓用中斷線,它將清除所有待處理的中斷。 – shunty 2014-10-09 23:49:34