基于 NXP i.MX8M Plus 测试 Zephyr RTOS
简介Zephyr 是一个开源的小型实时操作系统RTOS专为资源受限的嵌入式系统而设计——从简单的环境传感器、LED 可穿戴设备到复杂的嵌入式控制器、智能手表和 IoT 无线应用均可使用 Zephyr 进行开发。Zephyr 采用 Apache 2.0 宽松许可证由 Linux 基金会托管拥有活跃的社区支持。Zephyr 内核支持多种处理器架构包括 ARMv6-M / ARMv7-M / ARMv8-MCortex-M 系列、ARMv7-A / ARMv8-ACortex-A 系列、RISC-V、x86、Xtensa 等。在嵌入式 ARM 应用中Zephyr 具备以下突出优势小型内核、低资源占用内核针对资源受限设备优化可在仅数十 KB RAM 的 MCU 上运行。高度模块化应用可按需裁剪功能模块仅包含所需的组件灵活控制 footprint。丰富的内核服务提供多线程协作式/抢占式、信号量、消息队列、内存管理、电源管理等完整的 RTOS 服务。原生设备树Devicetree支持使用设备树描述硬件驱动模型统一便于跨平台移植。完善的网络与通信栈内建 TCP/IP、BLE 5.0、Bluetooth Mesh、ThreadOpenThread、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_tabledemo验证异构多核间基于 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 MHzRAMA531GB / 2GB / 4GB / 8GB视型号RAMM73×32KBTCML、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. 更新开发主机系统$sudoaptupdate $sudoaptupgrade2. 安装依赖工具Zephyr 对主要构建工具的最低版本要求如下工具最低版本CMake3.20.5Python3.12Devicetree compiler1.4.6安装所需依赖包$sudoaptinstall--no-install-recommendsgitcmake ninja-build gperf\ccache dfu-util device-tree-compilerwgetpython3-dev python3-venv python3-tk\xz-utilsfilemakegcc gcc-multilib g-multilib libsdl2-dev libmagic1验证工具版本$ cmake--versioncmake version3.28.3 $ python3--versionPython3.12.3 $ dtc--versionVersion: DTC1.7.03. 创建 Zephyr 工作区创建 Python 虚拟环境并安装westZephyr 的元工具/构建前端$ python3-mvenv ~/zephyrproject/.venv $source~/zephyrproject/.venv/bin/activate(.venv)$ pipinstallwest使用west初始化 Zephyr 仓库并更新依赖(.venv)$ west init ~/zephyrprojectInitializingin/home/simon/zephyrproject --- Cloning manifest repository from https://github.com/zephyrproject-rtos/zephyr...Initialized. Now runwest updateinside /home/simon/zephyrproject.(.venv)$cd~/zephyrproject(.venv)$ west update(.venv)$ west zephyr-export(.venv)$ west packages pip--install说明west update会拉取 Zephyr 及其所有子模块HAL、第三方库等首次执行耗时较长请确保网络畅通。4. 安装 Zephyr SDKZephyr SDK 包含交叉编译工具链。由于 Cortex-M7 是 32 位 ARM 架构仅需安装arm-zephyr-eabi工具链(.venv)$cd~/zephyrproject/zephyr(.venv)$ west sdkinstall-tarm-zephyr-eabi5. 编译 Hello World 示例Zephyr 为 Verdin i.MX8M Plus 的 M7 核心提供了两种内存配置的 board targetBoard Target代码运行位置说明verdin_imx8mp/mimx8ml8/m7ITCM紧耦合存储器低延迟适合实时性要求高的场景但空间有限verdin_imx8mp/mimx8ml8/m7/ddrDDR 外部存储器空间大适合较大的应用程序分别编译# 编译 ITCM 版本(.venv)$ west build-bverdin_imx8mp/mimx8ml8/m7 samples/hello_world# 编译 DDR 版本(.venv)$ west build-bverdin_imx8mp/mimx8ml8/m7/ddr samples/hello_world6. 部署固件到目标设备将编译生成的二进制文件通过 SCP 传输到 Verdin i.MX8M Plus需确保 Linux 系统已启动并联网(.venv)$scpbuild/zephyr/zephyr.bin rootverdin_imx8mp_ip_address:/home/root将verdin_imx8mp_ip_address替换为设备的实际 IP 地址。7. 在 M7 核心上运行固件通过Cortex-A53 调试串口连接 U-Boot 控制台执行以下命令将固件加载到 M7 核心的 ITCM 并启动Verdin iMX8MP # ext4load mmc 2:2 ${loadaddr} /home/root/zephyr.bin size bytes read in 2 ms (7.7 MiB/s) Verdin iMX8MP # cp.b ${loadaddr} 0x7e0000 size Verdin iMX8MP # bootaux 0x7e0000 ## No elf image at address 0x007e0000 ## Starting auxiliary core stack 0x20000F80, pc 0x00000D8D...说明ext4load从 eMMC 的 ext4 分区读取固件到内存cp.b将固件从加载地址复制到 ITCM 起始地址0x7e0000bootaux命令启动辅助核心M7size为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-A53Linux与 Cortex-M7Zephyr之间基于 RPMsg 的核间通信。9. 修改 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 内容--- verdin-imx8mp_hmp_overlay.dts.bak 2026-06-18 17:05:15.280623216 0800 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: vdev0vring055000000 { compatible shared-dma-pool; no-map; reg 0 0x55000000 0 0x8000; }; vdev0vring1: vdev0vring155008000 { compatible shared-dma-pool; no-map; reg 0 0x55008000 0 0x8000; };修改完成后编译新的verdin-imx8mp_hmp_overlay.dtbo并替换/boot/overlays/verdin-imx8mp_hmp_overlay.dtbo然后重启设备使配置生效。10. 添加 Zephyr 端配置文件在 Zephyr 源码中为 openamp_rsc_table 示例添加板级配置文件和设备树 overlay。Kconfig 配置文件samples/subsys/ipc/openamp_rsc_table/boards/verdin_imx8mp_mimx8ml8_m7.confCONFIG_LOG_PRINTKn CONFIG_IPM_IMX_MAX_DATA_SIZE_16n CONFIG_IPM_IMX_MAX_DATA_SIZE_4y CONFIG_OPENAMP_WITH_DCACHEy CONFIG_LOGy CONFIG_LOG_BACKEND_UARTy CONFIG_LOG_DEFAULT_LEVEL0 CONFIG_LOG_MODE_MINIMALy CONFIG_OPENAMP_RSC_TABLE_IPM_RX_ID0 CONFIG_OPENAMP_RSC_TABLE_IPM_TX_ID1配置说明CONFIG_IPM_IMX_MAX_DATA_SIZE_4y将 IPM 数据包大小限制为 4 字节与 i.MX8MP 的 MU 硬件匹配CONFIG_OPENAMP_WITH_DCACHEy启用数据缓存支持确保共享内存一致性CONFIG_OPENAMP_RSC_TABLE_IPM_RX_ID0/CONFIG_OPENAMP_RSC_TABLE_IPM_TX_ID1配置 IPM 收发通道 ID设备树 Overlaysamples/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: memory55000000 { compatible mmio-sram; reg 0x55000000 0x500000; }; }; mailbox0 { status okay; };该 overlay 定义了共享内存区域shram起始地址0x55000000大小0x5000005MB与 Linux 设备树中的 vring buffer 区域对齐IPC 通道使用mailbox0作为核间通信通道11. 编译 openamp_rsc_table 示例(.venv)$ west build-palways-bverdin_imx8mp/mimx8ml8/m7 samples/subsys/ipc/openamp_rsc_table-p always选项强制重新构建确保所有配置变更生效。12. 配置 U-Boot 环境变量在 Verdin i.MX8M Plus 上Linux remoteproc 框架需要确保 M7 核心的时钟驱动已正确初始化。需要添加以下 U-Boot 环境变量使内核参数clk-imx8mp.mcore_booted1在启动时传递给 Linux告知时钟驱动 M7 核心已由 bootloader 启动。rootverdin-imx8mp-06849028:~# fw_setenv tdxargs clk-imx8mp.mcore_booted1说明fw_setenv用于在 Linux 用户空间修改 U-Boot 环境变量tdxargs是 Toradex 平台的内核启动附加参数变量clk-imx8mp.mcore_booted1告知clk-imx8mp时钟驱动 M7 核心已启动避免 remoteproc 加载固件时出现时钟初始化冲突设置完成后重启设备使 U-Boot 环境变量生效。13. 通过 Linux remoteproc 加载运行固件将编译生成的 ELF 文件部署到目标设备并通过 Linux 的 remoteproc 框架加载运行rootverdin-imx8mp-06849028:~# cp zephyr_openamp_rsc_table.elf /lib/firmware/rootverdin-imx8mp-06849028:~# echo stop /sys/class/remoteproc/remoteproc0/state 2/dev/nullrootverdin-imx8mp-06849028:~# echo zephyr_openamp_rsc_table.elf /sys/class/remoteproc/remoteproc0/firmwarerootverdin-imx8mp-06849028:~# echo start /sys/class/remoteproc/remoteproc0/state操作说明将 ELF 固件复制到/lib/firmware/目录remoteproc 默认搜索路径停止当前运行的 remoteproc 实例如果已存在指定固件文件名启动 remoteproc此时 M7 核心开始运行 Zephyr注意与 Hello World 示例通过 U-Bootbootaux手动启动不同OpenAMP demo 使用 Linux 的 remoteproc 框架管理 M7 核心的生命周期支持固件的动态加载、启动和停止。14. 查看 M7 核心启动输出切换到Cortex-M7 调试串口可看到 Zephyr 启动输出*** Booting Zephyr OS build v4.4.0-5071-gfb64460fd6e5 *** uart:~$启动成功后会进入 Zephyr Shell 命令行界面可通过 UART 进行交互。15. 测试 RPMsg 核间通信在 Linux 端通过 RPMsg 设备与 M7 核心进行通信测试rootverdin-imx8mp-06849028:~# cat /dev/ttyRPMSG1 [2]595rootverdin-imx8mp-06849028:~# echo Hello Zephyr on Toradex Verdin i.MX8MP /dev/ttyRPMSG1TTY 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.MX8MPM7 核心通过 RPMsg 将接收到的消息回显到 Linux 终端验证双向通信正常以上结果表明 LinuxCortex-A53与 ZephyrCortex-M7之间的 RPMsg 核间通信链路已成功建立并工作正常。总结本文基于 NXP i.MX8M PlusToradex Verdin 平台完整演示了 Zephyr RTOS 的开发流程包括开发环境搭建依赖安装、Python 虚拟环境、west 元工具Zephyr 源码获取west init/update 拉取完整工作区交叉编译工具链通过west sdk install安装 ARM 工具链应用编译使用west build针对不同内存配置ITCM/DDR构建固件部署与运行通过 U-Boot 将固件加载到 M7 核心并启动OpenAMP 核间通信测试修改设备树 overlay配置 Zephyr 端参数通过 Linux remoteproc 框架加载 openamp_rsc_table demo验证基于 RPMsg 的 A53-M7 双向通信Zephyr 作为现代化的开源 RTOS在 i.MX8M Plus 异构平台上为 Cortex-M7 实时核心提供了 FreeRTOS 之外的另一种选择具有设备树驱动、高度模块化、丰富的协议栈支持以及成熟的 OpenAMP 核间通信框架等优势适合工业自动化、IoT 网关、智能家居等需要 Linux RTOS 协同工作的应用场景。参考链接Zephyr Project 官方文档Zephyr on Toradex SoMsVerdin iMX8M Plus Board — Zephyr 文档Toradex Verdin i.MX8M Plus 产品页Dahlia 载板Zephyr OpenAMP rsc_table 示例