嵌入式與裸機

中斷延遲(interrupt latency)與確定性

當火警響起時,重要的不只是終究有人回應,而是回應「多快」開始——警報響起到消防員真正開始行動之間的間隔。中斷延遲就是處理器的那個間隔:從硬體發出中斷訊號,到對應中斷服務常式的第一道有用指令真正執行之間的時間。

有好幾樣東西填滿這個間隔,而細心的工程師會逐一計入。第一,CPU 可能需要完成(或放棄)當前指令。第二,也常是最大的貢獻者,中斷可能被暫時「關閉」——若你的程式碼正處在一個遮蔽中斷的臨界區間裡,新的中斷得等到它們重新啟用,所以關中斷最長的那一段就為最壞情況延遲設下底線。第三,已在服務中的較高優先中斷可能延遲較低優先的。第四,硬體花固定的週期數去保存上下文並從向量表取得處理常式位址(在 Cortex-M 上這是個小而固定、確定的數字,約十幾個週期)。與延遲緊密相關的是確定性:若一個系統的時序可預測且有上界,它就是確定的——相同情況總是花一個可知、有上限的時間。讓你能保證期限的是確定性,而非原始速度。一個延遲不可預測(因為快取、作業系統或長段關中斷區間)的快處理器,對即時工作而言可能「比」一個較慢卻完全可預測的更糟。

它之所以重要,是因為對硬即時系統而言,決定期限能否達成的是「最壞情況」中斷延遲而非平均——你必須為它設上界。誠實、務實的重點:延遲最可控的單一成因是「你」把中斷關閉多久,所以讓臨界區間與最高優先的 ISR 保持簡短。快取、分支預測與作業系統都引入損害確定性的變異,這是簡單裸機 MCU 能給出比跑 Linux 的快應用處理器更緊延遲保證的原因之一。而「平均延遲」對攸關安全的時序是個令人安心卻危險的數字——你必須就最壞情況推理。

最壞情況中斷延遲 ~= 中斷關閉最長的那段時間 + 較高優先 ISR 仍在執行 + 固定硬體進入成本(約 12 週期) + ISR 序言到第一道有用指令。 // 你最能控制的部分:縮短最長的「關中斷」臨界區間。 // 一段 50 us 的遮蔽區間意味著最壞情況 >= 50 us。

最壞情況延遲由最長的關中斷區間主導——這是你最直接能控制的部分。對硬即時而言平均延遲不夠。

對即時工作而言,重要的是「最壞情況」延遲而非平均——而最可控的成因是你把中斷關閉多久。快取與作業系統增加變異,所以一台快的 Linux 機器最壞情況延遲可能比一顆慢的 MCU 還糟。

又稱
interrupt response timeIRQ latencydeterminism中斷延遲中斷反應時間