微處理器設計/中斷
中斷是一種會導致微處理器暫時處理不同任務,然後返回到先前任務的條件。中斷可以是內部的或外部的。內部中斷或“軟體中斷”由軟體指令觸發,其工作方式類似於跳轉或分支指令。外部中斷或“硬體中斷”是由外部硬體模組引起的。例如,許多計算機系統使用中斷驅動的 I/O,這是一個按下鍵盤上的鍵或點選滑鼠上的按鈕會觸發中斷的過程。處理器停止正在做的事情,它讀取來自鍵盤或滑鼠的輸入,然後它返回到當前程式。
下圖從概念上展示了中斷是如何發生的

灰色條表示控制流。頂行是當前正在執行的程式,底行是中斷服務例程 (ISR)。注意,當中斷 (Int) 發生時,程式停止執行,微控制器開始執行 ISR。ISR 完成後,微控制器返回到處理程式中斷的位置。
中斷效能取決於硬體和軟體。中斷效能的兩個最重要的屬性是 IRQ 延遲和吞吐量。[1]
現代硬體和軟體系統通常非常複雜,以至於幾乎不可能透過檢視原始碼和資料手冊提前推斷出中斷延遲,因此它通常是透過實驗直接測量的。[1][2]
一些處理器的指令需要多個週期才能執行,這會使延遲變得更糟。有些人建議避免使用這種高延遲指令。[3]
其他處理器專門設計用於提供可預測且更低的延遲響應時間。[4]
當處理器已經在執行先前中斷請求的 ISR 的過程中時,外部硬體請求另一箇中斷會發生什麼?
當第一個中斷被請求時,處理器中的硬體會使其完成當前指令,停用進一步的中斷,然後跳轉到中斷處理程式。
處理器會忽略進一步的中斷,直到它到達中斷處理程式中包含“從中斷返回”指令的部分,該指令會重新啟用中斷。
如果在中斷關閉時發生中斷請求,一些處理器將在中斷重新開啟後立即跳轉到該中斷處理程式。對於這種處理器,中斷風暴會“餓死”主迴圈背景任務。其他處理器至少執行主迴圈中的一個指令,然後再處理中斷,[5][6][7]因此主迴圈可能會執行得非常緩慢,但至少它永遠不會“餓死”。
少數處理器有一箇中斷控制器,支援“迴圈排程”,這可以用來防止低優先順序中斷處理程式的另一種“餓死”。[8]
一些處理器沒有“停用中斷”指令無限期地延遲中斷,而是使用“鎖定”指令暫時延遲中斷,正好 16 個機器指令,之後延遲中斷(如果有)會自動接收。[9]
通常,新手韌體程式設計師會編寫中斷服務例程,這些例程會使中斷關閉太長時間,這會導致難以除錯的問題,當處理器錯過來自同一硬體外設或無關硬體的中斷時。有幾種編寫“可以中斷的中斷處理程式”的方法,[10]包括二級中斷處理程式和巢狀中斷。
許多現代通用作業系統,包括 RTOS,都有“二級中斷處理程式”,它們像普通的使用者級程序一樣執行——中斷開啟,因此它們不僅可以被任何外部硬體中斷請求中斷,還可以被搶佔式作業系統用來了解何時迴圈遍歷所有可執行程序的計時器中斷。
一級中斷處理程式由硬體中斷直接觸發,應精心設計,以最大限度地減少它在返回之前保持中斷關閉的時間。FLIH 通常在緩衝區中儲存一些資料,並設定一些標誌,指示作業系統在該緩衝區中的資料上執行相應的二級中斷處理程式。
其他華夏公益教科書中的更多詳細資訊:作業系統設計/排程程序/搶佔#中斷延遲 和 嵌入式系統/中斷.
少數處理器支援“巢狀中斷”。中斷處理程式的第一部分應精心設計,以最大限度地減少它保持中斷關閉的時間,然後儘快重新開啟中斷。[2]與二級中斷處理程式類似,例程的其餘部分不會影響延遲,因為它在中斷開啟的情況下執行。但是,這會引入相同的中斷例程再次觸發的可能性,這需要可重入中斷處理程式,這可能會使中斷延遲更糟。[11]
從大型分散式系統到微型嵌入式計算機,可預測的低延遲中斷處理都很重要。[12]
硬即時系統需要確定性(低抖動)中斷處理。[13]
- ↑ a b Oliver Horst; Johannes Wiesböck; Raphael Wild; Uwe Baumgarten. "量化網路物理系統中外部中斷的延遲和可能的吞吐量".
- ↑ a b Jack Ganssle. "中斷延遲".
- ↑ David Kleidermacher. "最大限度地減少中斷響應時間".
- ↑ Peter Harris. "延遲測量".
- ↑ Q. "AVR 指南:中斷".
- ↑ G. C. Hill. "ATmega 中斷處理" 第 9 頁
- ↑ Nick Gammon. "Arduino 中的中斷是否會打斷其他中斷?". 引用:"處理器被設計為保證,當它從停用中斷狀態轉換到啟用中斷狀態時,始終會執行一條額外的指令。"
- ↑ "AVR1503: Xplain 訓練 - XMEGA 可程式設計多中斷控制器".
- ↑ "System 801 操作原理". 1976. 第 59 頁.
- ↑ Michael B. Jones; Stefan Saroiu. "軟調變解調器的可預測排程".
- ↑ Jim Harrison. "即時:關於微控制器中斷延遲的一些說明". 引用:"這避免了對可重入中斷處理程式的需求,可重入中斷處理程式會對中斷延遲產生負面影響。"
- ↑ Benedict Herzog; Luis Gerhorst; Bernhard Heinloth; Stefan Reif; Timo Hönig; Wolfgang Schröder-Preikschat. "INTspect:Linux 核心中的中斷延遲". doi:10.1109/SBESC.2018.00021
- ↑ Jonatan Lövgren. "使用硬體加速提高即時核心的效能和可預測性". 2016.