新闻详情

新闻详情

首页 / 资讯中心 / 详情

Zephyr 在 NXP i.MX8MQ EVK 上运行 Cortex-M4 核的完整指南:异构架构、内存映射与 U-Boot 加载调试

发布时间:2026/9/19 12:57:26来源:尧图网络
Zephyr 在 NXP i.MX8MQ EVK 上运行 Cortex-M4 核的完整指南:异构架构、内存映射与 U-Boot 加载调试
Zephyr 在 NXP i.MX8MQ EVK 上运行 Cortex-M4 核的完整指南异构架构、内存映射与 U-Boot 加载调试【免费下载链接】zephyrPrimary Git Repository for the Zephyr Project. Zephyr is a new generation, scalable, optimized, secure RTOS for multiple hardware architectures.项目地址: https://gitcode.com/GitHub_Trending/ze/zephyrNXP i.MX8MQ EVK 是一块以 quad Cortex-A53 为主处理器、单 Cortex-M4 为协处理器的异构开发板Zephyr RTOS 被移植到其中的 Cortex-M4 核心上运行与运行 Linux 的 A53 构成典型的主从heterogeneous系统。本文以 Zephyr 仓库中的 boards/nxp/imx8mq_evk/doc/index.rst 为骨架结合板级设备树、SoC 设备树、defconfig、board.cmake 等源码文件系统讲解该板卡的硬件资源、M4 侧 Zephyr 的编译配置、A53 与 M4 的双核内存映射以及如何通过 U-Boot 从 SD 卡或串口将 Zephyr 固件加载到 M4 上运行并完成 J-Link 调试。读完本文你将掌握 imx8mq_evk/mimx8mq6/m4 这个板卡目标从构建到运行调试的完整闭环。板卡概述与硬件资源i.MX8MQ EVK 基于 NXP i.MX8MQ 应用处理器由四核 Cortex-A53 集群与单个 Cortex-M4 核心构成。Zephyr OS 被移植到 Cortex-M4 核心上运行——这决定了整个开发流程的特殊性M4 不是独立启动的主核而是由 A53 一侧U-Boot 或 Linux负责加载与引导。板卡的主要硬件特性如下RAM3GB LPDDR4存储16GB eMMC5.0、32MB QSPI NOR、microSD 卡座无线WiFi 2.4/5GHz IEEE 802.11 a/b/g/n/acBluetooth v4.1USB1x Type-C OTG、1x Type-A HOST接口Ethernet、PCI-E M.2LED1x 电源状态 LED、1x UART LED调试10-pin JTAG 连接器MicroUSB 提供 UART 调试暴露 A53 与 M4 两个 COM 口从 Zephyr 板级描述文件可以印证这一板卡的官方标识boards/nxp/imx8mq_evk/board.yml声明板卡名为imx8mq_evk、全称MIMX8MQ EVK、厂商nxpSoC 为mimx8mq6而boards/nxp/imx8mq_evk/imx8mq_evk_mimx8mq6_m4.yaml则定义了 Zephyr 中的具体目标标识imx8mq_evk/mimx8mq6/m4类型为mcu架构armCortex-M4并声明 128KB RAM 与 128KB flash对应 TCM 区域详见下文内存映射一节。支持的硬件特性.. zephyr:board-supported-hw::指令会从板级设备树与 Kconfig 中自动汇总当前板卡在 Zephyr 中启用的硬件支持能力。结合源码可以确认imx8mq_evk/mimx8mq6/m4 目标当前实际启用的能力集中在最小运行集上串口UART2用作 console 与 shell时钟控制clock controlXIP片上执行代码直接从内存执行这些能力由 imx8mq_evk_mimx8mq6_m4_defconfig 中的配置项支撑CONFIG_CLOCK_CONTROLy CONFIG_UART_CONSOLEy CONFIG_SERIALy CONFIG_UART_INTERRUPT_DRIVENy CONFIG_CONSOLEy CONFIG_XIPy其中CONFIG_XIPy与下文的 TCM/OCRAM 代码区选择直接相关当 XIP 使能时Zephyr 固件直接从所选的内存区域取指执行而不是先拷贝到 SRAM。其余外设GPIO、ECSPI、UART1/3/4、Mailbox 等在 SoC 设备树中均已定义但默认为disabled需要时可通过 overlay 使能。引脚连接与 IO 配置MIMX8MQ EVK 板在 Zephyr 中经过验证的 pinmux 配置如下Board NameSoC NameUsageUART2 RXDUART2_TXDUART ConsoleUART2 TXDUART2_RXDUART Console表中 Board Name 与 SoC Name 的交叉对应是原文档的既有表述实际含义为板级上 UART2 的 RXD/TXD 引脚复用为 UART2 的接收/发送功能用于串口控制台。引脚复用配置在 imx8mq_evk-pinctrl.dtsi 中实现。该文件由gen_board_pinctrl.py从 NXP 官方引脚配置工具文件生成定义了uart2_default状态pinctrl { uart2_default: uart2_default { group0 { pinmux iomuxc_uart2_rxd_uart_rx_uart2_rx, iomuxc_uart2_txd_uart_tx_uart2_tx; slew-rate fast; drive-strength 45-ohm; }; }; };注意这里出现了两组看似矛盾的uart2_rxd_uart_rx_uart2_rx/uart2_txd_uart_tx_uart2_tx——这正是异构系统中从 M4 视角看 UART2的复用关系引脚所属 pad 由 A53 侧主导M4 通过 IOMUXC 将这些 pad 配置为 UART2 的 RX/TX 功能。系统时钟M4 核被配置为以266 MHz时钟运行。时钟框架由 SoC 设备树中的ccmClock Controller Module节点提供地址0x30380000#clock-cells 3见 dts/arm/nxp/imx/nxp_imx8m_m4.dtsiUART2 等外设的时钟源即通过clocks ccm IMX_CCM_UART2_CLK 0x68 28这样的三元组引用。CONFIG_CLOCK_CONTROLy使能时钟控制驱动保证 UART 波特率等外设时序正确。串口i.MX8MQ SoC 共有四个 UARTZephyr 将UART_2 配置为控制台其余 UART 未使用/未测试。板级设备树 imx8mq_evk_mimx8mq6_m4.dts 中aliases { uart-2 uart2; }; chosen { zephyr,flash tcml_code; zephyr,sram tcmu_sys; zephyr,console uart2; zephyr,shell-uart uart2; }; uart2 { status okay; current-speed 115200; pinctrl-0 uart2_default; pinctrl-names default; };UART2 在 SoC 设备树中位于0x30890000兼容nxp,imx-iuart见 nxp_imx8m_m4.dtsi。板级文件将其status置为okay、波特率设为 115200并把zephyr,console与zephyr,shell-uart都指向 UART2因此串口终端需以 115200 波特率连接。内存映射A53 与 M4 的双视图i.MX8MQ EVK 板没有可供 M4 独立启动的 QSPI flashM4 固件必须由 A53 核心加载A53 负责把 M4 应用程序二进制载入 RAM、将 M4 置于复位、设置 M4 的程序计数器PC与栈指针SP、再解除 M4 复位。这些步骤既可以在 bootloaderU-Boot阶段完成也可以在 Linux 系统启动后完成。M4 最多可使用 3 种不同的 RAM。下表是 A53 与 M4 视角下的内存映射两个核通过不同总线地址访问同一物理存储RegionCortex-A53Cortex-M4 (System Bus)Cortex-M4 (Code Bus)SizeOCRAM0x00900000-0x0091FFFF0x20200000-0x2021FFFF0x00900000-0x0091FFFF128KBTCMU0x00800000-0x0081FFFF0x20000000-0x2001FFFF—128KBTCML0x007E0000-0x007FFFFF—0x1FFE0000-0x1FFFFFFF128KBOCRAM_S0x00180000-0x00187FFF0x20180000-0x20187FFF0x00180000-0x00187FFF32KB这些区域在 SoC 设备树 nxp_imx8m_m4.dtsi 中有完整的节点定义tcml_code: code1ffe0000 { compatible nxp,imx-itcm; reg 0x1ffe0000 DT_SIZE_K(128); }; tcmu_sys: memory20000000 { compatible nxp,imx-dtcm; reg 0x20000000 DT_SIZE_K(128); }; ocram_code: code900000 { compatible nxp,imx-code-bus; reg 0x00900000 DT_SIZE_K(256); }; ocram_sys: memory20200000 { compatible nxp,imx-sys-bus; reg 0x20200000 DT_SIZE_K(256); }; ocram_s_code: code180000 { compatible nxp,imx-code-bus; reg 0x00180000 DT_SIZE_K(32); }; ocram_s_sys: memory20180000 { compatible nxp,imx-sys-bus; reg 0x20180000 DT_SIZE_K(32); };而 nxp_imx8mq_m4.dtsi 进一步将 OCRAM 收敛为与文档一致的 128KBocram_code的reg覆盖为0x00900000起始 128KBocram_sys覆盖为0x20200000起始 128KBM4 System Bus 视角的 OCRAM 别名。在编译时需要选择固件放在哪块 RAM。该配置在板级设备树 imx8mq_evk_mimx8mq6_m4.dts 中通过zephyr,flash当CONFIG_XIPy时生效与zephyr,sram属性完成。可选组合如下zephyr,flash - tcml_code (TCMLCode Bus 0x1FFE0000128KB) - ocram_code (OCRAMCode Bus 0x00900000128KB) - ocram_s_code (OCRAM_SCode Bus 0x0018000032KB) zephyr,sram - tcmu_sys (TCMUSystem Bus 0x20000000128KB) - ocram_sys (OCRAMSystem Bus 0x20200000128KB) - ocram_s_sys (OCRAM_SSystem Bus 0x2018000032KB)板级默认选择为zephyr,flash tcml_code;与zephyr,sram tcmu_sys;即代码放在 TCML、数据放在 TCMU——这也是 defconfig 中CONFIG_XIPy的落点固件直接在 TCM 中取指执行。修改内存布局时只需在设备树 overlay 中改这两个chosen属性并确保与 U-Boot 侧的加载地址见下一节一致。从 A53 加载并运行 ZephyrU-Boot 方式编译目标为imx8mq_evk/mimx8mq6/m4。以 hello_world 为例标准构建命令为west build -b imx8mq_evk/mimx8mq6/m4 samples/hello_world产物为build/zephyr/zephyr.bin。注意板卡默认的内存选择TCML 代码 TCMU 数据意味着 128KB 的代码容量上限若固件超出可改用 OCRAM 布局。方式一从 SD 卡加载将编译好的zephyr.bin复制到 SD 卡第一个 FAT 分区插入板卡。上电并在 U-Boot 提示符处停下执行。将 M4 二进制加载到目标内存并启动fatload mmc 0:1 0x40480000 zephyr.bin cp.b 0x40480000 0x7e0000 0x8000 bootaux 0x7e0000逐条说明fatload mmc 0:1 0x40480000 zephyr.bin从 SD 卡第 0 个控制器、第 1 个分区读取zephyr.bin到 DDR 临时地址0x40480000。cp.b 0x40480000 0x7e0000 0x8000将固件从 DDR 拷贝到0x7e0000。0x7e0000正是 A53 视角下 TCML 的起始地址见内存映射表0x007E0000-0x007FFFFF0x800032KB为拷贝长度——即把 128KB 的 TCML 分四段拷入或按实际固件大小调整。bootaux 0x7e0000U-Boot 的bootaux命令将 M4 置于复位、设置 PC 为0x7e0000、设置 SP然后解除复位使 M4 开始执行。方式二从串口加载此方式需要宿主机安装screen与lrzsz。启动screen上电板卡并在 U-Boot 提示符处停下screen tty-device 115200在 U-Boot 中启动loadx偏移量7e0000同样是 TCML 的 A53 地址波特率 115200loadx 7e0000 115200回到 screen 会话按下 :kbd:Ctrl-a后跟:进入命令模式输入以下命令用sx发送编译好的zephyr.binexec !! sx /full/path/to/zephyr.binsx会通过 XMODEM 协议把文件经串口发送给 U-Boot 的loadx并写入0x7e0000。启动执行bootaux 0x7e0000关键点回顾无论哪种方式核心三要素是加载地址必须是 A53 视角下与所选代码区一致的内存地址TCML 为 0x7e0000拷贝/传输长度要覆盖整个固件通过bootaux让 A53 完成对 M4 的复位释放与 PC/SP 设置。如果你在设备树中把代码区改到 OCRAMA53 地址0x00900000则上述命令中的目标地址应相应替换。调试J-Link 外部调试器MIMX8MQ EVK 可以通过外接 J-Link JTAG 调试器调试将 J-Link 连接到板上的J401 调试连接器并接到 PC之后即可按常规方式调试应用。以hello_world为例调试命令为west build -b imx8mq_evk/mimx8mq6/m4 samples/hello_world west debug板级支持文件 board.cmake 说明了调试器的接线方式board_set_debugger_ifnset(jlink) board_set_flasher_ifnset(jlink) board_runner_args(jlink --deviceMIMX8MQ6_M4) include(${ZEPHYR_BASE}/boards/common/jlink.board.cmake)即默认调试器与烧录器均为 J-Link且以MIMX8MQ6_M4作为 J-Link 目标器件。打开串口终端在调试器中单步执行应用应能在终端看到如下输出***** Booting Zephyr OS build zephyr-v2.6.99-30942-g6ee70bd22058 ***** Hello World! imx8mq_evk上方 boot banner 中的具体 commit 哈希随仓库版本变化属于示例输出。Hello World!之后的板名由 samples/hello_world/src/main.c 中的printf(Hello World! %s\n, CONFIG_BOARD_TARGET)打印CONFIG_BOARD_TARGET在该板目标上即imx8mq_evk。常见问题与注意事项M4 无法独立启动板卡没有 M4 可用的 QSPI flash脱离 A53 的 M4 固件无法自行引导必须走 U-Bootbootaux或 Linux 侧的远程处理器框架流程。内存容量TCML/TCMU 各 128KBOCRAM_S 仅 32KB。代码放不下时可改用zephyr,flash ocram_code128KB或将数据区移到ocram_sys。地址一致性设备树中的代码区地址M4 Code Bus 视角与 U-Boot 加载地址A53 视角必须对应同一物理存储TCML 的 A53 地址是0x7e0000而设备树中 TCML 的 M4 地址是0x1ffe0000二者指向同一块物理内存。测试范围板卡 yaml 中声明测试忽略net与bluetooth标签即网络与蓝牙相关测试默认不在此板目标上运行。延伸阅读板卡文档原文boards/nxp/imx8mq_evk/doc/index.rst板级设备树boards/nxp/imx8mq_evk/imx8mq_evk_mimx8mq6_m4.dtsSoC 设备树M4 视角内存与外设定义dts/arm/nxp/imx/nxp_imx8m_m4.dtsi、dts/arm/nxp/imx/nxp_imx8mq_m4.dtsi板级默认配置boards/nxp/imx8mq_evk/imx8mq_evk_mimx8mq6_m4_defconfigJ-Link 调试接线与参数boards/nxp/imx8mq_evk/board.cmakehello_world 示例samples/hello_world/README.rst【免费下载链接】zephyrPrimary Git Repository for the Zephyr Project. Zephyr is a new generation, scalable, optimized, secure RTOS for multiple hardware architectures.项目地址: https://gitcode.com/GitHub_Trending/ze/zephyr创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Apollo Quick Start 快速上手指南:五分钟在本地启动 Apollo 配置中心(all-in-one 单机部署) 2026/9/19 13:51:34

Apollo Quick Start 快速上手指南:五分钟在本地启动 Apollo 配置中心(all-in-one 单机部署)

Apollo Quick Start 快速上手指南:五分钟在本地启动 Apollo 配置中心(all-in-one 单机部署) 【免费下载链接】apollo Apollo is a reliable configuration management system suitable for microservice configuration management scenarios.…

阅读更多 →
SAP标准成本核算从取数到发布:常见差异排查与验证指南 2026/9/19 13:51:34

SAP标准成本核算从取数到发布:常见差异排查与验证指南

简介:这份《SAP标准成本核算问题大全.pdf》是一份面向SAP财务与成本模块顾问、企业成本会计及后勤支持人员的实操问答合集,聚焦CK11N、CK40N、CK13N、MR21等事务代码在标准成本估算与发布中的常见报错与业务影响,并给出排查思路和配置建议。资…

阅读更多 →
RIOT OS 测试应用深度解析:Atmel IO1 Xplained 扩展板的驱动测试程序 2026/9/19 13:51:34

RIOT OS 测试应用深度解析:Atmel IO1 Xplained 扩展板的驱动测试程序

物联网嵌入式操作系统实时系统 【免费下载链接】RIOT RIOT - The friendly OS for IoT 项目地址: https://gitcode.com/GitHub_Trending/riot/RIOT 点击查看 免费下载 IO1 Xplained 是 Atmel Xplained Pro 评估平台的一款扩展板,板载温度传感器、光照传…

阅读更多 →
DeepSeek生成的HTML代码怎么运行?从保存到浏览器完整指南 2026/9/19 13:51:34

DeepSeek生成的HTML代码怎么运行?从保存到浏览器完整指南

1. 从对话框到浏览器&#xff1a;DeepSeek生成的HTML代码到底该怎么跑起来很多人第一次用DeepSeek生成网页代码时&#xff0c;都会经历一个很微妙的瞬间&#xff1a;对话框里哗啦啦吐出一大段以<!doctype html>开头、以</html>结尾的代码&#xff0c;看起来特别专业…

阅读更多 →
Oracle GoldenGate 安装配置与故障排查实战指南 2026/9/19 13:51:34

Oracle GoldenGate 安装配置与故障排查实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
51单片机电梯楼层显示器:干簧管检测、数码管驱动与Proteus仿真调试 2026/9/19 13:48:34

51单片机电梯楼层显示器:干簧管检测、数码管驱动与Proteus仿真调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞