任務調度策略決定了實時系統的響應確定性。本文深度對比不可剝奪(合作式)與可剝奪(搶佔式)內核的架構差異、優劣勢及工程選型依據。
一、不可剝奪內核(Non-preemptive / Cooperative)
核心機制
- 任務主動釋放 CPU(調用
yield()/delay()/sem_pend())
- 中斷可打斷任務,但 ISR 返回後必須恢復被中斷任務
- 高優任務就緒也必須等待當前任務主動放棄 CPU

優點
- 中斷響應極快:無任務切換開銷,ISR 直接返回原任務
- 天然免疫可重入問題:任務運行不可被其他任務打斷,可放心調用非可重入函數
- 幾乎不需要信號量保護數據:無併發訪問風險(除共享 I/O 設備)
- 實現簡單,內核極小(適合極受限 MCU)
致命缺陷
- 任務級響應時間非確定性:取決於最長任務執行時間,高優任務可能等待任意久
- 不適合硬實時系統(汽車剎車、飛控、醫療)
- 商業級 RTOS 幾乎無純不可剝奪產品
二、可剝奪內核(Preemptive)
核心機制
- 就緒隊列中最高優先級任務永遠佔有 CPU
- 任務創建/唤醒高優任務 → 立即觸發上下文切換
- ISR 喚醒高優任務 → ISR 返回時直接切換至高優任務(不回原任務)

優點
- 任務級響應時間確定性最優:高優任務就緒→運行延遲僅為上下文切換時間
- 符合硬實時系統需求(μC/OS-II/III、FreeRTOS、VxWorks、QNX 均為此類)
- 支援優先級繼承/天花板等進階協議
代價與挑戰
- 必須面對可重入/併發問題:共享數據需互斥鎖保護
- 上下文切換開銷(保存/恢復寄存器、棧切換、快表刷新)
- 優先級反轉風險(需協議解決)
- 中斷延遲略增(關中斷保護臨界區時)
三、核心對比表
| 維度 | 不可剝奪 | 可剝奪 |
| 調度觸發條件 | 任務主動釋放 | 優先級變化/任務就緒/時間片 |
| 高優任務最長等待 | 最長任務執行時間 | 上下文切換時間 + 臨界區長度 |
| 響應時間確定性 | 低(非確定) | 高(可計算上界) |
| 併發安全責任 | 幾乎無 | 開發者全權負責 |
| 非可重入函數 | 可直接調用 | 需互斥保護 |
| 典型應用 | 前後台系統、簡單單片機、啟動引導 | 工控、車載、通訊、航空、醫療 |
四、混合策略:時間片輪轉 + 優先級搶佔
現代 RTOS 多數採用:
- 不同優先級:可剝奪(高優搶佔低優)
- 同優先級:時間片輪轉(Round Robin,默認 1-10ms)
兼顧響應性與公平性,防止同優任務餓死。
五、選型決策樹
- 系統是否有硬實時截止期(錯過即失效/危險)?
- MCU 資源是否極其受限(< 4KB RAM,無 MMU)?
- 是 → 考慮不可剝奪或超輕量可剝奪
- 否 → 可剝奪內核
- 團隊是否具備併發編程經驗(鎖、死鎖、優先級反轉)?
總結
不可剝奪內核是「單道程序的多任務擴展」,簡單但無確定性;可剝奪內核是「真正的多任務」,代價是併發複雜度。**現代嵌入式系統 99% 應選擇可剝奪內核**,並建立嚴格的併發編程規範(鎖層級、關中斷最小化、優先級分配原則)。μC/OS-II、FreeRTOS、RT-Thread 等成熟內核已將調度複雜性封裝,開發者專注於業務邏輯的線程安全即可。