1. 程式人生 > >中斷下半部的妙用

中斷下半部的妙用

中斷下半部

中斷處理程式是核心中很重要的一部分,但是由於本身存在著一些限制,所以他只能完成整個中斷處理程式中的上半部分。

具體侷限如下:

  1. 中斷處理程式是以非同步方式執行,並且他有可能會打斷其他重要的程式碼(甚至有可能是其他的中斷程式)的執行,因此為了避免被打斷的程式碼停止時間過長。中斷處理程式要執行的越快越好
  2. 如果當前有一箇中斷處理程式正在執行,在最好的情況下,在最好的情況下(IRQF_DISABLED沒有被設定),與該中斷同級的其他中斷會被遮蔽,如果設定了IRQF_DISABLED,當前處理器上所有其他的中斷都會被遮蔽,因為禁止中斷後硬體與系統無法通訊。
  3. 由於中斷處理程式需要對硬體進行操作,所以他們通常有很高的時限要求
  4. 中斷處理程式不再程序上下文中執行,所以他們不能阻塞。

因為上述原因,所以整個中斷處理流程就被分為了兩部分,第一部分是中斷處理程式(上半部),核心通過對他的非同步執行完成對硬體中斷的即時響應。

  1. 下半部

下半部的任務就是執行與中斷處理程式密切相關但中斷處理程式本身不執行的工作,理想的情況是,最好是中斷處理程式將所有的工作都交給下半部來執行,我們只希望在上半部執行的越少越好,我們期望中斷處理程式能夠儘快的返回。

但是中斷處理程式註定要完成一部分工作,例如,中斷處理程式幾乎都需要通過操作硬體對中斷的到達進行確認,有時他還會從硬體拷貝資料,因為這些工作對時間十分敏感,所以只能交給中斷處理程式去執行。

剩下的幾乎所有其他工作都是下半部執行的目標。實際上並不存在嚴格明確的規定來說明到底什麼任務應該在那個部分中完成,具體如何做決定完全取決於驅動程式開發者自己的判斷,在理論上不存在什麼錯誤,但是輕率的實現效果往往不理想。記住中斷處理程式會非同步執行,並且在最好的情況下他也會鎖定當前的中斷線,因此將中斷處理程式持續執行的時間縮短到最小成都線的非常重要。對於上半部和下半部之間劃分工作,儘管不存在某種嚴格的規則,但還是有一些提示可供借鑑

  • 如果一個任務對時間非常敏感,將其放在中斷處理程式中執行
  • 如果一個任務和硬體有關,將其放在中斷處理程式中執行
  • 如果一個任務要保證不被其他中斷(特別是相同的終端)打斷,將其放在中斷處理程式中執行
  • 其他所有任務,考慮放在下半部執行
  1. 為什麼要用下半部

理解為什麼要讓工作推後執行以及在什麼時候推後執行非常關鍵,你希望儘量減少中斷處理程式中要完成的工作,因為它在執行的時候,當前的中斷線在所有處理器上都會被遮蔽,更糟糕的是,如果一個處理程式是IRQF_DISABLED型別,他執行的時候會禁止所有本地終端,而且把本地中斷線全聚德遮蔽掉,而縮短中斷被遮蔽的時間對系統的響應能力和效能都至關重要,再加上中斷處理程式要與其他程式非同步執行,所以很明顯,我們必須盡力縮短中斷處理程式的執行。解決辦法就是把一些工作放到以後去做。

但具體放到以後什麼時候去執行呢?在這裡,以後僅僅用來強調不是馬上而已,理解這一點相當重要,下班並不需要知名一個確切時間,只要把這些任務推遲一點,讓他們在系統不太繁忙併且中斷恢復後執行就可以了。通常下半部在中斷處理程式一返回就馬上執行。下半部執行的關鍵在於當他們執行的時候,允許響應所有的中斷。