我正在考慮嵌入式Linux項目中的即將發生的情況(沒有硬件),其中兩個外部芯片需要共享一個物理IRQ線。這條線在邊沿觸發的硬件中是有能力的,但是沒有水平觸發的中斷。我知道這可以用兩個單獨的驅動程序工作的方式是,每個驅動程序都會調用它們的中斷處理程序,檢查它們的硬件並在適當的時候處理它們。如何在Linux中避免共享IRQ競爭
但是,我想象下面的競爭條件,並想知道我是否錯過了什麼或者可以做些什麼來解決這個問題。比方說,有兩個外部中斷源,設備A和B:
- 設備B發生中斷時,IRQ變爲有效
- IRQ邊沿引起的Linux核心的中斷處理程序運行
- ISR用於設備A上運行,認定沒有中斷
- 設備A中斷髮生之前,IRQ保持有效(線或)
- ISR對於裝置B運行時,認定中斷標誌,把手和將其清除
- 核心中斷處理程序中退出
- IRQ保持活躍,沒有更多的產生的邊緣,IRQ被鎖定
看來,這是固定的,核心的中斷處理程序必須運行的所有處理程序後,檢查IRQ水平,如果仍然主動,再次運行它們。 Linux會這樣做嗎?我不認爲中斷核心知道如何檢查IRQ線的級別。
這個種族是否可以實際發生,如果是的話,我該如何處理?
感謝您的意見。我認爲我們將在FPGA中實現一箇中斷控制器,我們仍然需要在板上安裝中斷控制器。 – blueshift 2012-02-21 03:54:34