FreeRTOS、RT-Thread、Zephyr 怎麼選?三大 RTOS 架構差異與適用場景

FreeRTOS、RT-Thread、Zephyr 怎麼選?從核心定位、設備模型、廠商生態、Devicetree、應用層程式碼和工程維護成本幾個角度,對比三大 RTOS 的架構差異與適用場景。

FreeRTOS、RT-Thread、Zephyr 經常被放在一起比較,但它們並不在同一個層級。

更準確的問題不是「哪個 RTOS 更好」,而是你的專案需要什麼:輕量調度核心、國產 MCU 友好的 RTOS 生態,還是完整的跨平台嵌入式作業系統。

簡單來看:

  • FreeRTOS:成熟普及的調度核心,加上 AWS 維護的一組 IoT 函式庫。
  • RT-Thread:核心加較完整的元件生態,對中文社群與國產長尾 MCU 更友好。
  • Zephyr:Linux Foundation 託管的完整 RTOS,強調統一子系統、設備模型、Devicetree 和跨廠商應用複用。

先說結論

如果只需要任務、佇列、信號量、計時器和很小的資源佔用,FreeRTOS 仍然是最穩的選擇之一。

如果主要使用國產 MCU,需要現成 BSP、中文文件、ENV 工具和更多系統元件,RT-Thread 很實用。

如果要跨晶片、跨板卡、跨廠商複用應用層程式碼,並且團隊願意承擔 Kconfig、Devicetree、west 和驅動模型的學習成本,Zephyr 更像面向長期工程化的路線。

FreeRTOS:輕量、熟悉、確定

FreeRTOS 的優勢在於小、熟、普及。

FreeRTOS-Kernel 主要提供核心、移植層和 RTOS 基礎機制,例如任務調度、信號量、佇列、事件組、軟體計時器與記憶體分配。很多專案真正使用的也正是這些部分。

它適合資源很緊、硬體固定、需求明確的小系統。AWS 收購後,FreeRTOS 周邊也有 coreMQTT、coreHTTP、OTA、Device Shadow 等 IoT 函式庫,並有 LTS 長期支援線。

但 FreeRTOS 本質上不是完整 OS 平台。GPIO 怎麼抽象、UART 怎麼讀、I2C 怎麼掛設備、不同廠商 HAL 怎麼統一,FreeRTOS 自己不處理。這讓它很靈活,也讓換板、換晶片時容易牽動應用層。

RT-Thread:國產 MCU 與元件生態更友好

RT-Thread 比 FreeRTOS 更接近完整 RTOS。

它不只有調度器,也提供檔案系統、網路、設備框架、USB、感測器框架、套件與工具鏈。對很多中文團隊來說,文件、社群、ENV 和 BSP 覆蓋是很實際的優勢。

尤其是 AT32、HC32、N32、APM32、HT32、合宙、先楫等國產長尾 MCU,RT-Thread 往往能提供更快的起點。

它的限制是,很多 BSP 仍然偏具體板卡和廠商庫組織。從跨廠商硬體描述、應用層無感遷移的角度看,還沒有 Zephyr 那麼系統化。

Zephyr:不是另一個 RTOS,而是一套工程平台

Zephyr 的複雜度來自它想把 MCU 專案裡散落在廠商 SDK、BSP、HAL、手寫驅動和配置腳本中的內容,統一進一套 OS 工程。

它的關鍵包括:

  • Kconfig:管理功能開關。
  • Devicetree:描述板級硬體。
  • drivers:統一 GPIO、UART、SPI、I2C、ADC、DMA、clock、reset、pinctrl 等接口。
  • subsys:提供網路、藍牙、USB、檔案系統、input、電源管理、log 等子系統。
  • west / CMake:管理專案、模組、構建和燒錄。

因此 Zephyr 更像 MCU 尺寸的嵌入式 Linux 思路:保留系統工程能力,但把昂貴的 runtime probe 移到編譯期。

Devicetree 為什麼重要

Zephyr 在構建階段處理 DTS / overlay,生成 devicetree_generated.h 等檔案,驅動和應用再透過 DT_ 宏取得硬體資訊。這讓硬體描述和應用程式碼分離,換板主要改 DTS,而不是到處改 main.c

LED、按鍵、I2C 感測器這類外設,在傳統 FreeRTOS + HAL 工程裡可能散落在初始化、回呼、中斷、去抖和應用邏輯中;在 Zephyr 中,很多資訊可以放進 DTS 和標準子系統。

應用層為什麼更乾淨

傳統 MCU 工程常把硬體初始化、引腳號、中斷、去抖、狀態機、事件佇列和業務邏輯混在一起。專案小時很快,板卡和產品線變多後就會痛苦。

Zephyr 希望把它們拆開:

  • 硬體連線放 DTS / overlay。
  • 功能開關放 Kconfig / prj.conf
  • 驅動放主線或 module。
  • 應用只處理業務事件。

這對多板卡、多晶片、長期維護的產品尤其有價值。

資源佔用要看場景

Zephyr 的 Flash 可能比最小 FreeRTOS 工程多,因為它帶了統一驅動、子系統和設備物件。但這不是純浪費,而是一套可複用基礎設施。

如果功能少、板卡固定、資源極緊,FreeRTOS 可能更省。如果外設多、板卡多、長期演進,Zephyr 的基礎設施成本會被攤薄。

三者怎麼選

選 FreeRTOS:硬體固定、資源緊、只需要調度原語、團隊熟悉它。

選 RT-Thread:國產 MCU 多、需要中文社群、BSP 和常用元件,希望快速落地。

選 Zephyr:需要跨平台、長期維護、統一驅動、Devicetree、子系統和接近 Linux 的工程思路。

什麼時候不該用 Zephyr

如果專案只有單板、功能簡單、團隊沒有時間學 Kconfig / Devicetree,或晶片在 Zephyr 主線支持很弱,就不必急著遷移。已穩定量產的產品,也要謹慎評估遷移收益。

更穩的方式是先選主線支持好的開發板,跑通 LED、UART、GPIO、input、I2C / SPI,再決定是否導入真實專案。

AI 時代更要讀好程式碼

AI 可以生成候選程式碼,但把程式碼合進去、燒進設備、交付客戶的人仍然是工程師。真正稀缺的是判斷力:抽象是否值得、驅動接口是否能維護、配置變更是否影響其他板卡。

即使最後不選 Zephyr,讀懂它的子系統、Devicetree、Kconfig 和驅動組織方式,也能提升嵌入式架構判斷力。

總結

FreeRTOS 解決調度,RT-Thread 補齊元件並強化國產 MCU 生態,Zephyr 則試圖用統一子系統、Devicetree 和設備模型重組 MCU 軟體工程。

小型固定設備可以選 FreeRTOS;國產 MCU 產品線可以優先看 RT-Thread;多平台、多板卡、長期維護的產品,值得認真投入 Zephyr。

參考連結:

记录并分享
使用 Hugo 建立
主題 StackJimmy 設計