扫码加入

  • 正文
  • 相关推荐
申请入驻 产业图谱

RT117x 双核 SDRAM 调试:M7+M4 协同调试配置方案

7小时前
347
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

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 内存空间定义

  1. 打开 M7 项目(evkmimxrt1170_rpmsg_lite_pingpong_cm7);
  2. 进入工程配置:右键工程→「Properties」→「C/C++ Build」→「Settings」→「MCU Linker」→「Memory Settings」;
  3. 添加内存区域:
    • 点击「Add RAM」,添加BOARD_SDRAM:地址0x81000000,大小0x1000000(供 M7 使用);
    • 再添加SDRAM:地址0x80000000,大小0x1000000(供 M4 使用);
    • 确保rpmsg_sh_mem(共享内存)已存在,地址0x20300000,大小0x40000

(2)添加 SDRAM 使能宏定义

  1. 进入「MCU C Compiler」→「Preprocessor」;
  2. 在「Defined symbols」中添加以下宏,启用 SDRAM 初始化代码:
    USE_SDRAM
    XIP_BOOT_HEADER_DCD_ENABLE=1
    MULTICORE_APP=1
    _USE_SHMEM
    
  3. 点击「Apply」保存配置。

(3)配置代码链接到 SDRAM

  1. 在工程配置中,勾选「Link application to RAM」(将代码链接到 RAM/SDRAM,而非 Flash);
  2. 选择「Plain load image」,确保代码直接加载到 SDRAM 运行。

(4)关联 M4 项目与内存区域

  1. 进入「Multicore Configuration」(多核配置);
  2. 在「Multicore slaves」中添加 M4 核心:
    • Slave:选择M4
    • Master memory region:选择SDRAM(即0x80000000区域);
    • Slave application object:选择 M4 项目的编译产物(evkmimxrt1170_rpmsg_lite_pingpong_cm4.axf)。

(5)调试器配置(关键:SDRAM 初始化与脚本替换)

  1. 进入「Run/Debug Settings」,选择 M7 项目的调试配置,点击「Edit」;
  2. 切换到「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
      
  3. 取消「Reset on Connect」(避免重置后 SDRAM 初始化失效),勾选「Attach only」。

(6)更新 M4 启动地址代码

  1. 打开 M7 项目的main_master.c文件;
  2. 修改 M4 核心启动地址宏定义,指向 M4 的 SDRAM 起始地址:
    // 原地址可能为SRAM地址,修改为SDRAM地址0x80000000
    #define CORE1_BOOT_ADDRESS (void*)0x80000000
    
  3. 保存文件,确保 M7 启动 M4 时能正确定位代码。

步骤 2:M4 项目配置(简单适配)

  1. 打开 M4 项目(evkmimxrt1170_rpmsg_lite_pingpong_cm4);
  2. 进入工程「Memory Settings」;
  3. 添加 SDRAM 内存区域:地址0x80000000,大小0x1000000(与 M7 项目中 M4 的 SDRAM 配置完全一致);
  4. 无需添加额外宏定义,保持默认编译配置即可。

步骤 3:编译双核项目

  1. 先编译 M4 项目:右键 M4 项目→「Build Project」,生成evkmimxrt1170_rpmsg_lite_pingpong_cm4.axf
  2. 再编译 M7 项目:右键 M7 项目→「Build Project」,确保编译无错误,生成 M7 的 ELF 文件。

步骤 4:启动双核调试

  1. 连接 RT1170-EVK 开发板到 PC,确保调试器识别设备;
  2. 选择 M7 项目的调试配置,点击「Debug」启动调试;
  3. IDE 会自动加载 M7 和 M4 的代码,分别在两个核心的main函数处暂停(需提前设置断点):
    • M7 断点:main_master.cmain函数(地址0x81000c52,位于 SDRAM);
    • M4 断点:main_remote.cmain函数(地址0x80000bea,位于 SDRAM);
  4. 调试操作:
    • 单步调试:可分别控制 M7、M4 核心逐行执行;
    • 变量查看:可查看各自核心的局部变量与全局变量;
    • 通信验证:运行项目后,可通过串口查看rpmsg通信日志(如 “Primary core received a msg”)。

3. 关键注意事项

  1. 内存地址冲突:M7 与 M4 的 SDRAM 区域必须完全独立,不可重叠;BOARD_SDRAM需紧邻BOARD_FLASH,否则链接失败;
  2. 宏定义完整:M7 项目必须添加USE_SDRAM宏,否则 SDRAM 初始化代码不执行,调试时会卡死;
  3. 脚本配置正确:调试脚本必须包含 SDRAM 初始化与 M4 唤醒逻辑,否则 M4 无法启动;
  4. 编译顺序:需先编译 M4 项目,再编译 M7 项目,确保 M7 能正确引用 M4 的编译产物;
  5. 缓存配置:调试器需添加--cachelib libm7_cache.so,否则 SDRAM 访问可能出现数据不一致。

4. 常见问题排查

4.1 调试时 M4 核心无响应

  • 排查方向:
    1. M7 项目中 M4 的启动地址是否为0x80000000
    2. 调试脚本是否选择了RT1170_connect_M7_wake_M4_SDRAM_init.scp
    3. M4 项目的 SDRAM 地址是否与 M7 配置一致;
  • 解决方法:重新检查启动地址宏定义与调试脚本,确保 M7 能正常唤醒 M4。

4.2 SDRAM 初始化失败,程序跑飞

  • 排查方向:
    1. 是否添加XIP_BOOT_HEADER_DCD_ENABLE=1宏(启用 DCD 初始化);
    2. 内存区域定义是否错误(如地址超出 SDRAM 实际容量);
  • 解决方法:添加缺失宏定义,核对 SDRAM 实际容量(RT1170-EVK 板载 SDRAM 容量通常为 512MB 或 1GB)。

4.3 双核通信失败(无 rpmsg 日志)

  • 排查方向:
    1. 是否添加_USE_SHMEM宏(启用共享内存);
    2. 共享内存rpmsg_sh_mem地址是否一致;
  • 解决方法:在 M7 和 M4 项目中确认共享内存配置一致,重新编译项目。
RT117x 在 SDRAM 中调试双核项目的核心是 “M7 主导配置 + SDRAM 分区隔离 + 调试脚本适配”。关键步骤包括 SDRAM 内存规划、M7 项目的宏定义与调试器配置、M4 项目的内存适配,最终实现双核代码在 SDRAM 中的同步调试。该方案避免了 Flash 频繁擦写,提升开发效率,适用于双核项目的前期调试阶段。
实际开发中,可根据代码规模调整 SDRAM 分区大小,若需优化性能,调试完成后可将 M7 代码迁移至 Flash(XIP 模式),M4 代码保留在 SRAM 中运行。

相关推荐