基于 NXP i.MX8M Plus 測試 Zephyr RTOS
簡介
Zephyr 是一個開源的小型實時操作系統(RTOS),專為資源受限的嵌入式系統而設計——從簡單的環境傳感器、LED 可穿戴設備,到復雜的嵌入式控制器、智能手表和 IoT 無線應用,均可使用 Zephyr 進行開發。Zephyr 采用 Apache 2.0 寬松許可證,由 Linux 基金會托管,擁有活躍的社區支持。
Zephyr 內核支持多種處理器架構,包括 ARMv6-M / ARMv7-M / ARMv8-M(Cortex-M 系列)、ARMv7-A / ARMv8-A(Cortex-A 系列)、RISC-V、x86、Xtensa 等。在嵌入式 ARM 應用中,Zephyr 具備以下突出優勢:
? 小型內核、低資源占用:內核針對資源受限設備優化,可在僅數十 KB RAM 的 MCU 上運行。
? 高度模塊化:應用可按需裁剪功能模塊,僅包含所需的組件,靈活控制 footprint。
? 豐富的內核服務:提供多線程(協作式/搶占式)、信號量、消息隊列、內存管理、電源管理等完整的 RTOS 服務。
? 原生設備樹(Devicetree)支持:使用設備樹描述硬件,驅動模型統一,便于跨平臺移植。
? 完善的網絡與通信棧:內建 TCP/IP、BLE 5.0、Bluetooth Mesh、Thread(OpenThread)、LwM2M 等協議棧。
? 活躍的社區與廠商支持:NXP、Nordic、STMicroelectronics 等主流芯片廠商均積極參與 Zephyr 上游開發,板級支持(BSP)持續增長。
在 NXP i.MX 8M Plus 這類異構多核 SoC 上,Zephyr 運行于 Cortex-M7 實時核心,與 Linux 運行的 Cortex-A53 應用核心協同工作,是 FreeRTOS 之外的一個現代化替代方案。
本文基于 Toradex Verdin i.MX8M Plus 嵌入式平臺,演示 Zephyr RTOS 的環境搭建、交叉編譯以及在 Cortex-M7 核心上的部署運行流程,并進一步測試 OpenAMP 資源表(rsc_table)demo,驗證異構多核間基于 RPMsg 的核間通信。
硬件平臺介紹
Verdin i.MX8M Plus 是 Toradex 推出的核心板(Computer on Module),基于 NXP i.MX 8M Plus SoC,主要規格如下:
項目 | 規格 |
應用處理器 | 4× Arm Cortex-A53 @ 1.6 GHz |
實時微控制器 | 1× Arm Cortex-M7F @ 800 MHz |
RAM(A53) | 1GB / 2GB / 4GB / 8GB(視型號) |
RAM(M7) | 3×32KB(TCML、TCMU、OCRAM_S)+ 128KB OCRAM + 256MB DDR |
存儲(A53) | 最高 32GB eMMC |
網絡 | 千兆以太網(TSN)、Wi-Fi 802.11ac 2×2 MU-MIMO、藍牙 5.0 |
接口 | USB 3.1、CAN、I2C、SPI、UART、GPIO 等 |
AI 加速 | NPU(神經處理單元)、ISP(圖像信號處理器) |
Cortex-M7 微控制器具備 800 MHz 主頻和浮點運算單元(FPU),配合緊耦合存儲器(TCM)可實現極低中斷延遲,適用于實時控制場景。Zephyr 在該核心上運行,與 Cortex-A53 上的 Linux 系統形成異構多核協作。
準備
硬件
? Verdin i.MX8M Plus 核心板,搭配 Dahlia 載板
? 連接 Dahlia 載板 X18 調試串口——該接口同時提供 Cortex-A53 調試串口和 Cortex-M7 調試串口,需分別連接以便后續操作
軟件
? 參考 Toradex Easy Installer 使用說明,將當前最新版本 Toradex Yocto Linux BSP 7.x Reference Image 燒寫至 Verdin i.MX8M Plus
? 開發主機操作系統:Ubuntu 24.04 LTS(或更新版本)
測試步驟
1. 更新開發主機系統
$ sudo apt update
$ sudo apt upgrade
2. 安裝依賴工具
Zephyr 對主要構建工具的最低版本要求如下:
工具 | 最低版本 |
CMake | 3.20.5 |
Python | 3.12 |
Devicetree compiler | 1.4.6 |
安裝所需依賴包:
$ sudo apt install --no-install-recommends git cmake ninja-build gperf \
ccache dfu-util device-tree-compiler wget python3-dev python3-venv python3-tk \
xz-utils file make gcc gcc-multilib g++-multilib libsdl2-dev libmagic1
驗證工具版本:
$ cmake --version
cmake version 3.28.3
$ python3 --version
Python 3.12.3
$ dtc --version
Version: DTC 1.7.0
3. 創建 Zephyr 工作區
創建 Python 虛擬環境并安裝 west(Zephyr 的元工具/構建前端):
$ python3 -m venv ~/zephyrproject/.venv
$ source ~/zephyrproject/.venv/bin/activate
(.venv) $ pip install west
使用 west 初始化 Zephyr 倉庫并更新依賴:
(.venv) $ west init ~/zephyrproject
=== Initializing in /home/simon/zephyrproject
--- Cloning manifest repository from https://github.com/zephyrproject-rtos/zephyr
...
=== Initialized. Now run "west update" inside /home/simon/zephyrproject.
(.venv) $ cd ~/zephyrproject
(.venv) $ west update
(.venv) $ west zephyr-export
(.venv) $ west packages pip --install
說明:west update 會拉取 Zephyr 及其所有子模塊(HAL、第三方庫等),首次執行耗時較長,請確保網絡暢通。
4. 安裝 Zephyr SDK
Zephyr SDK 包含交叉編譯工具鏈。由于 Cortex-M7 是 32 位 ARM 架構,僅需安裝 arm-zephyr-eabi 工具鏈:
(.venv) $ cd ~/zephyrproject/zephyr
(.venv) $ west sdk install -t arm-zephyr-eabi
5. 編譯 Hello World 示例
Zephyr 為 Verdin i.MX8M Plus 的 M7 核心提供了兩種內存配置的 board target:
Board Target | 代碼運行位置 | 說明 |
verdin_imx8mp/mimx8ml8/m7 | ITCM(緊耦合存儲器) | 低延遲,適合實時性要求高的場景,但空間有限 |
verdin_imx8mp/mimx8ml8/m7/ddr | DDR 外部存儲器 | 空間大,適合較大的應用程序 |
分別編譯:
# 編譯 ITCM 版本
(.venv) $ west build -p always -b verdin_imx8mp/mimx8ml8/m7 samples/hello_world
# 編譯 DDR 版本
(.venv) $ west build -p always -b verdin_imx8mp/mimx8ml8/m7/ddr samples/hello_world
6. 部署固件到目標設備
將編譯生成的二進制文件通過 SCP 傳輸到 Verdin i.MX8M Plus(需確保 Linux 系統已啟動并聯網):
(.venv) $ scp build/zephyr/zephyr.bin root@
將
7. 在 M7 核心上運行固件
通過 Cortex-A53 調試串口連接 U-Boot 控制臺,執行以下命令將固件加載到 M7 核心的 ITCM 并啟動:
Verdin iMX8MP # ext4load mmc 2:2 ${loadaddr} /home/root/zephyr.bin
Verdin iMX8MP # cp.b ${loadaddr} 0x7e0000
Verdin iMX8MP # bootaux 0x7e0000
## No elf image at address 0x007e0000
## Starting auxiliary core stack = 0x20000F80, pc = 0x00000D8D...
說明: - ext4load 從 eMMC 的 ext4 分區讀取固件到內存 - cp.b 將固件從加載地址復制到 ITCM 起始地址 0x7e0000 - bootaux 命令啟動輔助核心(M7) -
8. 查看運行結果
切換到 Cortex-M7 調試串口,可看到 Zephyr 啟動輸出:
*** Booting Zephyr OS build v4.4.0-4978-g8cb75f4fbdde ***
Hello World! verdin_imx8mp/mimx8ml8/m7
至此,Zephyr RTOS 已成功在 i.MX8M Plus 的 Cortex-M7 核心上運行。
OpenAMP rsc_table Demo:異構核間通信測試
在完成 Hello World 基礎運行驗證后,進一步測試 Zephyr 的 OpenAMP 資源表(rsc_table)示例,驗證 Cortex-A53(Linux)與 Cortex-M7(Zephyr)之間基于 RPMsg 的核間通信。
1. 修改 Yocto Linux 設備樹 Overlay
為了使 Linux 端的 RemoteProc 框架能夠正確加載 Zephyr 固件并進行 RPMsg 通信,需要修改設備樹 overlay 文件 verdin-imx8mp_hmp_overlay.dts。
主要修改點:
? 調整 mailbox 通道配置(mboxes 屬性),使其與 Zephyr 端的 IPM 配置匹配
? 移除 rsc_table 內存區域引用(由 Zephyr 固件自行管理資源表)
? 為 vring buffer 添加 shared-dma-pool 兼容屬性
diff 內容:
--- a/verdin-imx8mp_hmp_overlay.dts 2026-06-18 17:05:15.280623216 +0800
+++ b/verdin-imx8mp_hmp_overlay.dts 2026-07-02 17:22:03.948562862 +0800
@@ -22,10 +22,10 @@
compatible = "fsl,imx8mp-cm7";
clocks = <&clk IMX8MP_CLK_M7_DIV>;
mbox-names = "tx", "rx", "rxdb";
- mboxes = <&mu 0 1
- &mu 1 1
- &mu 3 1>;
- memory-region = <&vdevbuffer>, <&vdev0vring0>, <&vdev0vring1>, <&rsc_table>, <&m7_reserved>;
+ mboxes = <&mu 0 0
+ &mu 1 0
+ &mu 3 0>;
+ memory-region = <&vdevbuffer>, <&vdev0vring0>, <&vdev0vring1>, <&m7_reserved>;
rsc-da = <0x55000000>;
syscon = <&src>;
fsl,startup-delay-ms = <500>;
@@ -50,11 +50,13 @@
};
vdev0vring0: vdev0vring0@55000000 {
+ compatible = "shared-dma-pool";
no-map;
reg = <0 0x55000000 0 0x8000>;
};
vdev0vring1: vdev0vring1@55008000 {
+ compatible = "shared-dma-pool";
no-map;
reg = <0 0x55008000 0 0x8000>;
};
修改完成后,編譯新的 verdin-imx8mp_hmp_overlay.dtbo 并替換 /boot/overlays/verdin-imx8mp_hmp_overlay.dtbo,然后重啟設備使配置生效。
2. 添加 Zephyr 端配置文件
在 Zephyr 源碼中為 openamp_rsc_table 示例添加板級配置文件和設備樹 overlay。
Kconfig 配置文件 samples/subsys/ipc/openamp_rsc_table/boards/verdin_imx8mp_mimx8ml8_m7.conf:
CONFIG_LOG_PRINTK=n
CONFIG_IPM_IMX_MAX_DATA_SIZE_16=n
CONFIG_IPM_IMX_MAX_DATA_SIZE_4=y
CONFIG_OPENAMP_WITH_DCACHE=y
CONFIG_LOG=y
CONFIG_LOG_BACKEND_UART=y
CONFIG_LOG_DEFAULT_LEVEL=0
CONFIG_LOG_MODE_MINIMAL=y
CONFIG_OPENAMP_RSC_TABLE_IPM_RX_ID=0
CONFIG_OPENAMP_RSC_TABLE_IPM_TX_ID=1
配置說明:
? CONFIG_IPM_IMX_MAX_DATA_SIZE_4=y:將 IPM 數據包大小限制為 4 字節,與 i.MX8MP 的 MU 硬件匹配
? CONFIG_OPENAMP_WITH_DCACHE=y:啟用數據緩存支持,確保共享內存一致性
? CONFIG_OPENAMP_RSC_TABLE_IPM_RX_ID=0 / CONFIG_OPENAMP_RSC_TABLE_IPM_TX_ID=1:配置 IPM 收發通道 ID
設備樹 Overlay samples/subsys/ipc/openamp_rsc_table/boards/verdin_imx8mp_mimx8ml8_m7.overlay:
/ {
chosen {
/*
* shared memory reserved for the inter-processor communication
*/
zephyr,ipc_shm = &shram;
zephyr,ipc = &mailbox0;
};
shram: memory@55000000 {
compatible = "mmio-sram";
reg = <0x55000000 0x500000>;
};
};
&mailbox0 {
status = "okay";
};
該 overlay 定義了:
? 共享內存區域(shram):起始地址 0x55000000,大小 0x500000(5MB),與 Linux 設備樹中的 vring buffer 區域對齊
? IPC 通道:使用 mailbox0 作為核間通信通道
3. 編譯 openamp_rsc_table 示例
(.venv) $ west build -p always -b verdin_imx8mp/mimx8ml8/m7 samples/subsys/ipc/openamp_rsc_table
-p always 選項強制重新構建,確保所有配置變更生效。
4. 配置 U-Boot 環境變量
在 Verdin i.MX8M Plus 上,Linux remoteproc 框架需要確保 M7 核心的時鐘驅動已正確初始化。需要添加以下 U-Boot 環境變量,使內核參數 clk-imx8mp.mcore_booted=1 在啟動時傳遞給 Linux,告知時鐘驅動 M7 核心已由 bootloader 啟動。
root@verdin-imx8mp-06849028:~# fw_setenv tdxargs "clk-imx8mp.mcore_booted=1"
說明: - fw_setenv 用于在 Linux 用戶空間修改 U-Boot 環境變量 - tdxargs 是 Toradex 平臺的內核啟動附加參數變量 - clk-imx8mp.mcore_booted=1 告知 clk-imx8mp 時鐘驅動 M7 核心已啟動,避免 remoteproc 加載固件時出現時鐘初始化沖突
設置完成后,重啟設備使 U-Boot 環境變量生效。
5. 通過 Linux remoteproc 加載運行固件
將編譯生成的 ELF 文件部署到目標設備,并通過 Linux 的 remoteproc 框架加載運行:
root@verdin-imx8mp-06849028:~# cp zephyr_openamp_rsc_table.elf /lib/firmware/
root@verdin-imx8mp-06849028:~# echo stop > /sys/class/remoteproc/remoteproc0/state 2>/dev/null
root@verdin-imx8mp-06849028:~# echo zephyr_openamp_rsc_table.elf > /sys/class/remoteproc/remoteproc0/firmware
root@verdin-imx8mp-06849028:~# echo start > /sys/class/remoteproc/remoteproc0/state
操作說明:
1. 將 ELF 固件復制到 /lib/firmware/ 目錄(remoteproc 默認搜索路徑)
2. 停止當前運行的 remoteproc 實例(如果已存在)
3. 指定固件文件名
4. 啟動 remoteproc,此時 M7 核心開始運行 Zephyr
注意:與 Hello World 示例通過 U-Boot bootaux 手動啟動不同,OpenAMP demo 使用 Linux 的 remoteproc 框架管理 M7 核心的生命周期,支持固件的動態加載、啟動和停止。
6. 查看 M7 核心啟動輸出
切換到 Cortex-M7 調試串口,可看到 Zephyr 啟動輸出:
*** Booting Zephyr OS build v4.4.0-5071-gfb64460fd6e5 ***
uart:~$
啟動成功后會進入 Zephyr Shell 命令行界面,可通過 UART 進行交互。
7. 測試 RPMsg 核間通信
在 Linux 端通過 RPMsg 設備與 M7 核心進行通信測試:
root@verdin-imx8mp-06849028:~# cat /dev/ttyRPMSG1 &
[2] 595
root@verdin-imx8mp-06849028:~# echo "Hello Zephyr on Toradex Verdin i.MX8MP" > /dev/ttyRPMSG1
TTY 0x0402: Hello Zephyr on Toradex Verdin i.MX8MP
測試結果說明:
? cat /dev/ttyRPMSG1 &:在后臺監聽 RPMsg 通道 1 的接收數據
? echo ... > /dev/ttyRPMSG1:通過 RPMsg 通道 1 向 M7 核心發送字符串
? TTY 0x0402: Hello Zephyr on Toradex Verdin i.MX8MP:M7 核心通過 RPMsg 將接收到的消息回顯到 Linux 終端,驗證雙向通信正常
以上結果表明 Linux(Cortex-A53)與 Zephyr(Cortex-M7)之間的 RPMsg 核間通信鏈路已成功建立并工作正常。
總結
本文基于 NXP i.MX8M Plus(Toradex Verdin 平臺)完整演示了 Zephyr RTOS 的開發流程,Zephyr 作為現代化的開源 RTOS,在 i.MX8M Plus 異構平臺上為 Cortex-M7 實時核心提供了 FreeRTOS 之外的另一種選擇,具有設備樹驅動、高度模塊化、豐富的協議棧支持以及成熟的 OpenAMP 核間通信框架等優勢,適合工業自動化、IoT 網關、智能家居等需要 Linux + RTOS 協同工作的應用場景。
參考鏈接
? Zephyr Project 官方文檔
? Zephyr on Toradex SoMs
? Verdin iMX8M Plus Board — Zephyr 文檔
? Zephyr OpenAMP rsc_table 示例
提交
Verdin iMX8M Plus 實現上電亮屏的無閃爍啟動
基于 Verdin i.MX95 的單目深度估計
從0開始點亮DSI屏幕
基于 NXP iMX8MP ARM平臺安裝測試 Openclaw
在NXP iMX8QM上使用 Jailhouse


投訴建議