NXP i.MX RT117x 系列 MCU 搭载 Cortex-M7(高性能核心)与 Cortex-M4(低功耗核心),支持多核协同工作。默认 SDK 例程中,M7 代码运行于 Flash、M4 代码运行于 SRAM,而开发阶段将双核代码均部署到外部 SDRAM 调试,可避免频繁擦写 Flash、提升调试效率(仅牺牲部分性能)。本文基于官方rpmsg_lite_pingpong双核通信例程,详解 RT117x 在 SDRAM 中调试双核项目的完整配置流程,核心通过 M7 加载并启动 M4 代码,实现双核同步调试。
资料获取:如何下载RT1170 ARMGCC SDRAM代码到外部flash
1. 核心原理与环境准备
1.1 双核调试核心逻辑
- 启动流程:RT117x 默认从 M7 核心启动,由 M7 完成 SDRAM 初始化、M4 代码加载,再通过多核管理接口(mcmgr)启动 M4 核心;
- 内存分配:SDRAM 需划分为独立区域,分别供 M7 和 M4 运行代码与存储数据,同时预留共享内存用于双核通信;
- 调试依赖:需通过 IDE 配置 SDRAM 初始化脚本、内存映射与核心关联,确保调试器能同时识别两个核心。
1.2 软硬件与工具环境
- 硬件:NXP MIMXRT1170-EVK 开发板(板载外部 SDRAM)、USB 调试线;
- 软件:MCUXpresso IDE、RT117x SDK(含双核例程
rpmsg_lite_pingpong); - 核心工具:LinkServer Debugger(IDE 集成,支持多核调试)、SDRAM 初始化脚本(SDK 自带)。
1.3 关键内存规划(示例)
| 内存区域 | 起始地址 | 大小 | 用途 |
|---|---|---|---|
| BOARD_FLASH | 0x30000000 | 0x1000000 | 外部 Flash(默认启动介质) |
| BOARD_SDRAM | 0x81000000 | 0x1000000 | M7 核心代码与数据区域 |
| SDRAM(M4 用) | 0x80000000 | 0x1000000 | M4 核心代码与数据区域 |
| rpmsg_sh_mem | 0x20300000 | 0x40000 | 双核共享通信内存 |
- 关键要求:M7 的
BOARD_SDRAM需紧邻BOARD_FLASH,避免内存地址冲突;M7 与 M4 的 SDRAM 区域需完全独立,大小根据代码规模调整。
2. 分步配置流程(核心在 M7 项目)
步骤 1:M7 项目配置(核心步骤)
(1)添加 SDRAM 内存空间定义
- 打开 M7 项目(
evkmimxrt1170_rpmsg_lite_pingpong_cm7); - 进入工程配置:右键工程→「Properties」→「C/C++ Build」→「Settings」→「MCU Linker」→「Memory Settings」;
- 添加内存区域:
- 点击「Add RAM」,添加
BOARD_SDRAM:地址0x81000000,大小0x1000000(供 M7 使用); - 再添加
SDRAM:地址0x80000000,大小0x1000000(供 M4 使用); - 确保
rpmsg_sh_mem(共享内存)已存在,地址0x20300000,大小0x40000。
- 点击「Add RAM」,添加
(2)添加 SDRAM 使能宏定义
- 进入「MCU C Compiler」→「Preprocessor」;
- 在「Defined symbols」中添加以下宏,启用 SDRAM 初始化代码:
USE_SDRAM XIP_BOOT_HEADER_DCD_ENABLE=1 MULTICORE_APP=1 _USE_SHMEM - 点击「Apply」保存配置。
(3)配置代码链接到 SDRAM
- 在工程配置中,勾选「Link application to RAM」(将代码链接到 RAM/SDRAM,而非 Flash);
- 选择「Plain load image」,确保代码直接加载到 SDRAM 运行。
(4)关联 M4 项目与内存区域
- 进入「Multicore Configuration」(多核配置);
- 在「Multicore slaves」中添加 M4 核心:
- Slave:选择
M4; - Master memory region:选择
SDRAM(即0x80000000区域); - Slave application object:选择 M4 项目的编译产物(
evkmimxrt1170_rpmsg_lite_pingpong_cm4.axf)。
- Slave:选择
(5)调试器配置(关键:SDRAM 初始化与脚本替换)
- 进入「Run/Debug Settings」,选择 M7 项目的调试配置,点击「Edit」;
- 切换到「Debugger」标签页:
- 「Reset script」:选择带 SDRAM 初始化的脚本(如
RT1170_reset.scp); - 「Connect script」:选择
RT1170_connect_M7_wake_M4_SDRAM_init.scp(M7 唤醒 M4 并初始化 SDRAM); - 「Advanced Settings」→「Additional options」:添加缓存库配置,确保 SDRAM 访问正常:
--no-packed --cachelib libm7_cache.so
- 「Reset script」:选择带 SDRAM 初始化的脚本(如
- 取消「Reset on Connect」(避免重置后 SDRAM 初始化失效),勾选「Attach only」。
(6)更新 M4 启动地址代码
- 打开 M7 项目的
main_master.c文件; - 修改 M4 核心启动地址宏定义,指向 M4 的 SDRAM 起始地址:
// 原地址可能为SRAM地址,修改为SDRAM地址0x80000000 #define CORE1_BOOT_ADDRESS (void*)0x80000000 - 保存文件,确保 M7 启动 M4 时能正确定位代码。
步骤 2:M4 项目配置(简单适配)
- 打开 M4 项目(
evkmimxrt1170_rpmsg_lite_pingpong_cm4); - 进入工程「Memory Settings」;
- 添加 SDRAM 内存区域:地址
0x80000000,大小0x1000000(与 M7 项目中 M4 的 SDRAM 配置完全一致); - 无需添加额外宏定义,保持默认编译配置即可。
步骤 3:编译双核项目
- 先编译 M4 项目:右键 M4 项目→「Build Project」,生成
evkmimxrt1170_rpmsg_lite_pingpong_cm4.axf; - 再编译 M7 项目:右键 M7 项目→「Build Project」,确保编译无错误,生成 M7 的 ELF 文件。
步骤 4:启动双核调试
- 连接 RT1170-EVK 开发板到 PC,确保调试器识别设备;
- 选择 M7 项目的调试配置,点击「Debug」启动调试;
- IDE 会自动加载 M7 和 M4 的代码,分别在两个核心的
main函数处暂停(需提前设置断点):- M7 断点:
main_master.c的main函数(地址0x81000c52,位于 SDRAM); - M4 断点:
main_remote.c的main函数(地址0x80000bea,位于 SDRAM);
- M7 断点:
- 调试操作:
- 单步调试:可分别控制 M7、M4 核心逐行执行;
- 变量查看:可查看各自核心的局部变量与全局变量;
- 通信验证:运行项目后,可通过串口查看
rpmsg通信日志(如 “Primary core received a msg”)。
3. 关键注意事项
- 内存地址冲突:M7 与 M4 的 SDRAM 区域必须完全独立,不可重叠;
BOARD_SDRAM需紧邻BOARD_FLASH,否则链接失败; - 宏定义完整:M7 项目必须添加
USE_SDRAM宏,否则 SDRAM 初始化代码不执行,调试时会卡死; - 脚本配置正确:调试脚本必须包含 SDRAM 初始化与 M4 唤醒逻辑,否则 M4 无法启动;
- 编译顺序:需先编译 M4 项目,再编译 M7 项目,确保 M7 能正确引用 M4 的编译产物;
- 缓存配置:调试器需添加
--cachelib libm7_cache.so,否则 SDRAM 访问可能出现数据不一致。
4. 常见问题排查
4.1 调试时 M4 核心无响应
- 排查方向:
- M7 项目中 M4 的启动地址是否为
0x80000000; - 调试脚本是否选择了
RT1170_connect_M7_wake_M4_SDRAM_init.scp; - M4 项目的 SDRAM 地址是否与 M7 配置一致;
- M7 项目中 M4 的启动地址是否为
- 解决方法:重新检查启动地址宏定义与调试脚本,确保 M7 能正常唤醒 M4。
4.2 SDRAM 初始化失败,程序跑飞
- 排查方向:
- 是否添加
XIP_BOOT_HEADER_DCD_ENABLE=1宏(启用 DCD 初始化); - 内存区域定义是否错误(如地址超出 SDRAM 实际容量);
- 是否添加
- 解决方法:添加缺失宏定义,核对 SDRAM 实际容量(RT1170-EVK 板载 SDRAM 容量通常为 512MB 或 1GB)。
4.3 双核通信失败(无 rpmsg 日志)
- 排查方向:
- 是否添加
_USE_SHMEM宏(启用共享内存); - 共享内存
rpmsg_sh_mem地址是否一致;
- 是否添加
- 解决方法:在 M7 和 M4 项目中确认共享内存配置一致,重新编译项目。
RT117x 在 SDRAM 中调试双核项目的核心是 “M7 主导配置 + SDRAM 分区隔离 + 调试脚本适配”。关键步骤包括 SDRAM 内存规划、M7 项目的宏定义与调试器配置、M4 项目的内存适配,最终实现双核代码在 SDRAM 中的同步调试。该方案避免了 Flash 频繁擦写,提升开发效率,适用于双核项目的前期调试阶段。
实际开发中,可根据代码规模调整 SDRAM 分区大小,若需优化性能,调试完成后可将 M7 代码迁移至 Flash(XIP 模式),M4 代码保留在 SRAM 中运行。
阅读全文
347