介紹
即時作業系統(Real-Time Operating System, RTOS)是一種專門為即時(real-time)應用而設計的作業系統,強調「在特定時間限制內(deadline)對事件進行回應」,試想一個情境在工業的領域若機器某部分突然產生故障,需要在極短的時間內停止所有馬達的運作,若此時使用的是傳統的作業系統如Linux,依OS內核的調度策略,最終馬達停止的動作會有些許延遲,相較之下RTOS則可以有較彈性的執行緒搶佔,讓緊急情況的處理可以更快被執行
本質上來說RTOS的內核使用起來的效果是大同小異的,基本上能做到多個執行緒的建立、輪詢執行、優先序搶佔、互斥鎖、內核級的中斷等功能,進階一點的則有可以動態記憶體管理、多核心的支援,這些RTOS主要的差異大多是在外圍模組的支援、周邊的開發生態系等,以下就分別介紹目前主流常見的幾種RTOS:
FreeRTOS
FreeRTOS 是由 Real Time Engineers Ltd. 及 Amazon 維護,完全開源並且在全球廣受使用,FreeRTOS 可以說是最最最常見的一種RTOS,成功之道大概在於早早就開源,早早就被各家IDE整合,各家晶片的SDK也都可以看到他的影子,我最早接觸他是在Arduino IDE,FreeRTOS早早就出現在Arduino library list中,使用起來也夠簡單,沒有什麼複雜的設定,加一兩行code就可以實現多執行緒,讓初學者很容易就可以踏入RTOS的世界。他背後的金主爸爸是 Amazon,後來也整合了不少 AWS 上IoT相關的功能,由於早早就開源,周圍的模組也不少。
AzureRTOS (Threadx)
ThreadX 是由 Express Logic 開發的即時作業系統(RTOS),後續被 Microsoft 收購並推出更名版本 AzureRTOS 並開源,從名字就可以看出來未來應該是要跟微軟的 Azure 搭配做一些IoT的功能,但目前好像還沒看到什麼殺手級的應用。由於開源的時間比較晚,周圍的套件比較少,像BLE、Wifi這類的Stack能用的東西好像比較少,但相信有微軟原生的支援應該可以成長的很快,我會碰到 AzureRTOS 是因為 STM32 官方原生支援 AzureRTOS,很有趣的是 STM32 的開發環境也有支援 FreeRTOS,但支援度是遠遜於 AzureRTOS 的。
Zephyr
Zephyr 是由 Linux 基金會(Linux Foundation)主導的開源即時作業系統(RTOS),Zephyr雖然出現很久了,但算是這幾年才突然紅起來,主打一個跨平台的相容性和完整的開發工具鏈,有像是West這種很好用的工具、也有像是DeviceTree者種為跨平台設計的架構,可以說要用Zephyr就要連著這一整串工具鏈一起用才會好用,不過好像也是因為綁著工具鏈跟相容性的原因,好像各家晶片雖然說有支援,但好像又支援的沒那麼好,特別是牽涉到很底層的硬體設定(像時鐘樹設定)就會變的特別麻煩,如果沒有這種需求就蠻好用的,很多設定、初始化都幫你省略了。會碰到Zephyr是因為使用 Nordic 的藍牙 SoC,最新的的 nrf connect SDK 基本上是建立在 Zephyr 上的,而 Zephyr 通訊相關的套件也很完整,很適合給 Nordic 的晶片用。
RT-Thread
RT-Thread 是一款由中國團隊主導開發的開源即時作業系統(RTOS),在中國的嵌入式系統開源社群算蠻熱門的,對中國製MCU(特別是一些RISC-V的晶片)支援度很好,但其他地方就比較少看到有人在用,跟Zephyr一樣也有蠻多工具可以使用,我自己還沒有用過,但讓我印象深刻的是RT-Thread社群有一個可以一鍵生成 STM32 bootloader 的工具,不過要使用要註冊帳號,而且還限定用中國的電話才能註冊…,就對中國以外的開發者不是很友好。
比較
幾種RTOS的差別
名稱 | AzureRTOS (ThreadX) | FreeRTOS | Zephyr | RT-Thread |
---|---|---|---|---|
維護者 | - 原為 Express Logic 開發,現由 Azure (Microsoft) 管理 - 被微軟購買後開源 | - AWS(Amazon)及大社群共同維護 - 開源專案,有廣大社群支援 | - 由 Linux Foundation 托管 - 眾多主要產業贊助商與貢獻者(如 Intel、Nordic 等) | - 中國嵌入式廠商與RT-Thread 社群 |
授權 | - MIT 授權 (開源版本) | - MIT 授權 - 完全開源、商業可使用 | - Apache 2.0 授權 - 完全開源 | - LGPL 授權 - 可商業使用,但需遵守 LGPL 條款 |
主要特色 | - 小巧的記憶體佔用 - 高效能可搶先式多工 - 整合除錯功能、其他外設控制模組 | - 模組化設計,可高度客製化內核 - 協同式及可搶先式多工 - 詳細文件與巨大社群,支援度高 | - 跨平台相容性好 - 追蹤與分析工具完善 - 與 Percepio Tracealyzer 整合 | - 輕量化設計與微核心架構 - 效率高,啟動速度快 - 著重模組化與易用性 |
使用門檻 | - 門檻中 - 提供專門的 API 與工具鏈 - 原生支援STM32,其他晶片支援則較少 | - 門檻低 - 文件全面且社群龐大 - 新手上手相對容易,維護成本低 | - 門檻高 - 須熟悉成套的開發工具鏈 - 社群與企業資源豐富,難度取決於應用深度 | - 門檻中 - 設計較為精簡易懂 - 模組化讓功能可彈性擴充,但仍需對 RTOS 原理有基礎理解 |
社群與生態 | - 因 Microsoft Azure 加持,工業界支持度高 - 開源時間較晚,社群支援相較少 | - 擁有極為廣泛的使用者社群 - 豐富的第三方套件與論壇資源 | - 企業和開源社群雙管齊下 - 大型廠商投入資源開發並提供硬體支援 - 文件與套件工具逐漸成熟 | - 亞洲市場擁有極大用戶基礎 - 社群不斷壯大,第三方資源也逐年提升 |
適用範圍 | - 消費電子、工業設備 - 高度資源受限或需要高效能的應用 | - 廣泛用於各類微控制器與嵌入式裝置 - 適合中小型專案或原型開發 | - 高度跨平台相容性的產品 - 需要整合多種通訊協定的裝置 | - 小型物聯網裝置、家電產品、工業控制等 - 適合資源有限且需高即時性的情境 |
範例 | - 高度整合 SoC 平台 - 網路裝置、醫療器械、消費性電子設備 - 資源特別有限但需穩定度的系統 | - 物聯網邊緣設備 - 小型感測器、可攜式產品 - 工業自動化控制 | - 高速通訊設備 - 需要完整追蹤與調試能力的工業設備 - 精密儀器及高可靠度應用 | - 嵌入式微控制器 - 智能家居與可穿戴式裝置 - 需要快速啟動、高效率排程的場景 |
內核功能層面的差異
名稱 | AzureRTOS (ThreadX) | FreeRTOS | Zephyr | RT-Thread |
---|---|---|---|---|
內核架構 | - 輕量級、模組化設計 - 單核心即時系統 - 提供 preemption-threshold | - 單核心設計 - 透過設定檔自由啟用/停用功能 - 針對 MCU 移植方便 | - 類微核心(microkernel)概念 - Kconfig 編譯時可裁剪/擴充 - 可支援多核心 (SMP) | - 微核心 + 模組化 - 通過 Packages 擴充 - 預設核心輕量、啟動速度快 |
排程機制 | - 可搶先式多工 - 優先順序排程 - preemption-threshold 降低不必要的搶先 | - 可搶先式或協同式多工 - 時間片 (time slicing) 可選 - 任務通知提高效能 | - 可搶先式/協同式混合 - 支援多核心下的任務搬移 - 彈性設定時間片與搶先策略 | - 以優先順序為基礎的可搶先式 - 切換開銷低 - 適合時限嚴苛的應用 |
中斷管理 | - 提供快速中斷響應 - ISR 中可使用 IPC 原語 - 建議複雜邏輯放在 Thread | - 有完整的中斷優先級設定規範 - 提供「FromISR」API 與核心互動 - 避免高優先級中斷封鎖 RTOS 服務 | - 針對不同架構有對應方法 - 允許在 ISR 後半段做較複雜處理 - 支援 irq_offload | - 中斷入口/出口簡潔 - 可在 ISR 裡做任務喚醒或 IPC - 建議將重任務放在中斷後處理或 Task |
任務通訊與同步 | - 提供 Semaphore、Mutex、Event Flags、Message Queue - Block Pool / Byte Pool 作為底層資源 | - 有 Queue、Semaphore、Mutex、Event Group、Task Notification - Queue 是核心溝通管道 | - 提供 Queue、FIFO、LIFO、Pipe、Mailbox、Semaphore、Mutex 等多樣化機制 - 信號(Signals)/事件等高階通訊 | - 提供 Semaphore、Mutex、Event、Mailbox、Message Queue - 模組化 API,易於擴充 |
記憶體管理 | - Block Pool(固定大小) - Byte Pool(彈性分配) - 適合小型系統 | - 多種 heap 實作 (heap1~heap5) - 依需求選擇靜態或動態配置 - 須注意配置 Semaphore / Mutex 以確保多任務安全 | - slab、mempool、heap 等多種分配策略 - Kconfig 可細調 - 需在編譯階段做良好配置 | - mempool、heap 二分法 - 預設輕量動態分配算法 - 可搭配自訂或高階 alloc 演算法 |
除錯與追蹤 | - 可使用 TraceX 等工具 - 整合度高,針對 Thread、Event、IPC 做可視化 | - FreeRTOS+Trace、第三方 IDE 追蹤工具多 - 與 Percepio Tracealyzer 深度整合 | - 統一的 Tracing 子系統 - 可連接 Tracealyzer、LTTng、SystemView 等 - 追蹤支援度豐富 | - RT-Thread Studio 或其他插件 - 提供簡單 log 系統與線上除錯機制 - 社群亦有類似 FreeRTOS Trace 的追蹤方案 |
可移植性與擴充性 | - 官方主要支援多數 ARM、RISC-V、MIPS - Microsoft 收購後社群逐漸擴大 | - 幾乎所有 MCU 都有移植 - 大量第三方套件與驅動 - 可透過 AWS FreeRTOS 延伸雲端功能 | - 原生支援多家大廠硬體 (Intel、NXP、Nordic…) - Kconfig + Devicetree 與 Linux 類似 - 企業支援與社群並重 | - 在亞洲(特別是中國)用得廣泛 - 與國產 MCU、RISC-V 平台整合度高 - Packages 方式讓功能彈性擴充 |
總結
總結一下前面提到的四種RTOS:
- AzureRTOS (ThreadX):以高效能與小巧佔用聞名,擅長在嚴苛的資源受限環境中執行,另有良好的除錯工具與商業案例,對STM32的支援度好。
- FreeRTOS:擁有巨大開源社群與靈活的擴充性,適用於廣泛的微控制器與嵌入式應用,在學術或商業專案皆常見,初學者適合。
- Zephyr:受到 Linux 基金會與多家企業的大力推動,硬體支援廣泛,並有強大的追蹤與分析工具,適合需要高可靠度及詳細監控的中大型嵌入式應用
- RT-Thread:架構輕量化、模組化明確,啟動速度快,適合物聯網及其他對即時性與資源效率要求高的場景。