來源 | 嵌入式大雜燴
當(dāng)下,FreeRTOS 和 Zephyr 是最熱門的兩款RTOS ,很多網(wǎng)友會(huì)問:新項(xiàng)目到底上 FreeRTOS,還是直接上 Zephyr?
我的理解是,這不是新舊之爭,也不是誰替代誰,而是兩種工程路徑:
先給結(jié)論:
邊界清楚、資源緊、團(tuán)隊(duì)已有成熟 MCU/Cube 經(jīng)驗(yàn),優(yōu)先 FreeRTOS;多板復(fù)用、連接協(xié)議多、產(chǎn)品線要長期演進(jìn),且愿意為工程體系付學(xué)習(xí)成本,更適合 Zephyr。
下面先對齊兩邊都繞不開的 RTOS 共性,再分別看 FreeRTOS 和 Zephyr 整體架構(gòu)。
不管 FreeRTOS 還是 Zephyr,RTOS 最核心的任務(wù)都不是讓程序變復(fù)雜,而是解決前后臺(tái)系統(tǒng)在復(fù)雜項(xiàng)目里調(diào)度與解耦越來越難的問題。
前后臺(tái)大家都很熟:前臺(tái)是中斷,后臺(tái)是一個(gè)大 while(1)。項(xiàng)目一復(fù)雜,順序輪詢就開始互相拖累。
RTOS 做的第一件事,就是把它拆成可搶占的多任務(wù),由調(diào)度器決定誰跑、誰等:

說明:
每個(gè)任務(wù)看起來都像一個(gè)獨(dú)立的 while(1),但 CPU 只有一個(gè)或少數(shù)幾個(gè)核心。下面幾個(gè)基礎(chǔ)概念,兩邊 RTOS 都繞不開:

說明:
從這個(gè)角度看,F(xiàn)reeRTOS 和 Zephyr 的共同點(diǎn)是:它們都在解決多任務(wù)調(diào)度、實(shí)時(shí)響應(yīng)、任務(wù)通信和資源管理問題。選型差異,主要不在“會(huì)不會(huì)調(diào)度”,而在平臺(tái)層你要不要自己拼。

FreeRTOS 官網(wǎng):https://www.freertos.org/
FreeRTOS 的主角是 kernel,不是大而全操作系統(tǒng)。
使用 FreeRTOS 開發(fā)的項(xiàng)目,工程結(jié)構(gòu)大概是這樣:

說明:
也就是說,F(xiàn)reeRTOS 很少規(guī)定我們必須怎么組織驅(qū)動(dòng)、怎么描述板級(jí)資源、怎么管理協(xié)議棧依賴。它把最核心的調(diào)度和同步機(jī)制做好,然后把大量工程組織自由度留給我們。
這就是它輕的原因,也是它長期流行的原因。
調(diào)度器是 FreeRTOS 的心臟。
FreeRTOS 調(diào)度器圍繞任務(wù)優(yōu)先級(jí)工作:就緒、延時(shí)、阻塞與上下文切換,把實(shí)時(shí)性落實(shí)在短路徑上。
FreeRTOS 調(diào)度器之前我們也有分享過:FreeRTOS調(diào)度器:搶占與輪轉(zhuǎn)機(jī)制
簡單總結(jié)如下:


說明:
對選型的含義:如果你最在意可控的搶占路徑和微秒級(jí)切換體感,F(xiàn)reeRTOS 這套模型足夠直接,也更好在現(xiàn)有 MCU 工程里落地。
隊(duì)列好用,但不是唯一選擇。寫 FreeRTOS 任務(wù)通信,不用隊(duì)列 Queue,你還有更好的選擇?
FreeRTOS 針對多種不同的應(yīng)用場景提供多種同步對象可以使用。

說明:
對選型的含義:FreeRTOS 把同步能力給齊了,但怎么組合、怎么約束團(tuán)隊(duì)用法,要靠項(xiàng)目工程約束。
FreeRTOSConfig.hFreeRTOS 把大量行為交給 FreeRTOSConfig.h 裁剪:選擇權(quán)在工程師,工程紀(jì)律也要團(tuán)隊(duì)自己補(bǔ)上。

說明:
對選型的含義:小團(tuán)隊(duì)、邊界清楚時(shí)這是優(yōu)勢;產(chǎn)品線一多,缺少統(tǒng)一配置規(guī)范就會(huì)變成隱性成本。
理解 FreeRTOS 工程化,繞不開 heap 選型;高可靠項(xiàng)目更常見的是啟動(dòng)期一次分配、運(yùn)行期不再動(dòng)態(tài)申請。
關(guān)于 FreeRTOS heap 五種實(shí)現(xiàn)之前也有簡單分享過:FreeRTOS 的 5 種堆方案,如何理解?
簡單總結(jié)如下:

說明:
對選型的含義:資源緊、要強(qiáng)確定性時(shí),F(xiàn)reeRTOS 這套自己選堆策略的自由度很有價(jià)值。
FreeRTOS 的強(qiáng)項(xiàng)是把 kernel 做小、做穩(wěn)、做容易移植;驅(qū)動(dòng)、協(xié)議棧和平臺(tái)層怎么長,通常由項(xiàng)目自己決定。

說明:
對選型的含義:已有穩(wěn)定 HAL/中間件資產(chǎn)、交付周期緊時(shí),F(xiàn)reeRTOS 遷移成本通常更低;反過來,若你準(zhǔn)備長期跨硬件演進(jìn)卻不打算自建平臺(tái),后面會(huì)一直在補(bǔ)課。
往期相關(guān)文章:
Zephyr 不只是一個(gè) RTOS kernel,它更像一個(gè)面向嵌入式產(chǎn)品的平臺(tái)工程體系。

https://docs.zephyrproject.org/latest/introduction/index.html#
它不是把一個(gè) kernel 放進(jìn)我們的工程,而是要求我們進(jìn)入它的工程體系——這也是很多人覺得它「重」的原因。

說明:
對選型的含義:你買到的是一套平臺(tái)施工規(guī)范;小項(xiàng)目會(huì)覺得重,產(chǎn)品線才更容易賺回成本。
Zephyr 的 Devicetree 把硬件信息從業(yè)務(wù)代碼里拿出來。
硬件信息寫進(jìn) dts / overlay,業(yè)務(wù)只拿設(shè)備名;抽象發(fā)生在構(gòu)建期,固件仍是靜態(tài)編譯結(jié)果。

說明:
對選型的含義:如果未來大概率多板復(fù)用、換芯片不換業(yè)務(wù)骨架,Devicetree 這筆前期成本更值得付。
Zephyr 的 Kconfig 是軟件能力的開關(guān)系統(tǒng)。
Devicetree 描述「板子上有什么」,Kconfig 決定「這次固件開什么」;價(jià)值在依賴關(guān)系,學(xué)習(xí)曲線也多半在這里。

說明:
對選型的含義:團(tuán)隊(duì)愿意建立統(tǒng)一裁剪習(xí)慣時(shí),Kconfig 是資產(chǎn);若只有 1–2 人且交付很緊,學(xué)習(xí)曲線往往比協(xié)議棧紅利更先到來。
Zephyr 的 Driver Model 很適合跨板遷移。
驅(qū)動(dòng)不只是 HAL 函數(shù),而是配置、binding、統(tǒng)一 API 和初始化優(yōu)先級(jí)一套模型;小項(xiàng)目覺得重,產(chǎn)品線才慢慢賺回成本。

說明:
對選型的含義:單板單產(chǎn)品很少立刻感到爽;多 SKU、多硬件平臺(tái)時(shí),這套模型才開始回本。
Zephyr 內(nèi)核能力齊全,但更強(qiáng)調(diào)和日志、電源、userspace、驅(qū)動(dòng)模型等平臺(tái)能力協(xié)同——?jiǎng)e把它當(dāng)「另一個(gè) FreeRTOS」硬套。

說明:
對選型的含義:選 Zephyr,本質(zhì)上是選平臺(tái)協(xié)同方式,不是只選另一個(gè)調(diào)度器 API。
west + CMake + Kconfig/Devicetree 把「固件怎么拼出來」標(biāo)準(zhǔn)化了;從 Keil/CubeIDE 過來需要時(shí)間消化 workspace 與模塊概念。

說明:
對選型的含義:團(tuán)隊(duì)若已有穩(wěn)定 IDE 交付鏈路,切換成本要算進(jìn)排期;若本來就要做多倉協(xié)作和長期平臺(tái)維護(hù),這套工具鏈更對口。
往期相關(guān)文章:

FreeRTOS 和 Zephyr 的差異,不是簡單的新舊之爭,也不是誰替代誰的問題。
團(tuán)隊(duì)只有 1–2 人、交付周期很緊時(shí),Zephyr 的學(xué)習(xí)曲線往往比協(xié)議棧紅利先到;這時(shí) FreeRTOS 通常更穩(wěn)。
總結(jié):選 FreeRTOS,是選可控的內(nèi)核自由;選 Zephyr,是選可演進(jìn)的平臺(tái)標(biāo)準(zhǔn)。
------------ END ------------

Cursor即將消失!SpaceX 600 億美元收購,最快下周五就能完成!

在MPU上部署離線版DeepSeek -R1模型