工控網首頁
>

應用設計

>

基于 NXP i.MX8M Plus 測試 Zephyr RTOS

基于 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@:/home/root

替換為設備的實際 IP 地址。

7. 在 M7 核心上運行固件

通過 Cortex-A53 調試串口連接 U-Boot 控制臺,執行以下命令將固件加載到 M7 核心的 ITCM 并啟動:

Verdin iMX8MP # ext4load mmc 2:2 ${loadaddr} /home/root/zephyr.bin

bytes read in 2 ms (7.7 MiB/s)

 

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) - ext4load 命令輸出的實際文件字節數,需替換為實際值

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