2012-01-11 71 views
6

我正在考慮嵌入式Linux項目中的即將發生的情況(沒有硬件),其中兩個外部芯片需要共享一個物理IRQ線。這條線在邊沿觸發的硬件中是有能力的,但是沒有水平觸發的中斷。我知道這可以用兩個單獨的驅動程序工作的方式是,每個驅動程序都會調用它們的中斷處理程序,檢查它們的硬件並在適當的時候處理它們。如何在Linux中避免共享IRQ競爭

但是,我想象下面的競爭條件,並想知道我是否錯過了什麼或者可以做些什麼來解決這個問題。比方說,有兩個外部中斷源,設備A和B:

  1. 設備B發生中斷時,IRQ變爲有效
  2. IRQ邊沿引起的Linux核心的中斷處理程序運行
  3. ISR用於設備A上運行,認定沒有中斷
  4. 設備A中斷髮生之前,IRQ保持有效(線或)
  5. ISR對於裝置B運行時,認定中斷標誌,把手和將其清除
  6. 核心中斷處理程序中退出
  7. IRQ保持活躍,沒有更多的產生的邊緣,IRQ被鎖定

看來,這是固定的,核心的中斷處理程序必須運行的所有處理程序後,檢查IRQ水平,如果仍然主動,再次運行它們。 Linux會這樣做嗎?我不認爲中斷核心知道如何檢查IRQ線的級別。

這個種族是否可以實際發生,如果是的話,我該如何處理?

回答

2

基本上,用你所描述的硬件,做一個有線或中斷將永遠不會正常工作。

如果你想做有線或者,你真的需要使用電平敏感的IRQ輸入。如果這不可行,那麼也許你可以添加某種中斷控制器。該設備將採用N個電平敏感輸入,並具有一個輸出,以及某種「清除」。當中斷控制器得到清除時,它會降低它的輸出,然後重新斷言輸出,如果它的任何輸入仍然有效。

在軟件方面,你可以看看是否正在運行IRQ線到另一個處理器輸入。這可以讓你至少檢查狀態,但是Linux核心ISR處理不會知道任何事情,所以你必須修補一些東西來檢查它,然後再次循環訪問ISR。另外,這意味着在重載中斷的情況下,你永遠不會擺脫這個ISR。考慮到你正在做一個電線或者在IRQ上,我認爲這些設備不會經常中斷。

另一件事是看看真的很難在處理器。爲了讓它再次識別中斷,可能會有某種技巧可以通過中斷設置來提取。

我不會嘗試任何過於棘手的問題,我會將源分離到單獨的IRQ輸入,更改爲電平敏感輸入或添加中斷控制器芯片。

+1

感謝您的意見。我認爲我們將在FPGA中實現一箇中斷控制器,我們仍然需要在板上安裝中斷控制器。 – blueshift 2012-02-21 03:54:34