2. MULTI 工程与多核目标连接

在 Green Hills MULTI 中调试多核系统,第一步不是直接点“Debug”,而是把“工程—目标—通道—符号/可执行文件”四件事按正确顺序建立起来。MULTI 的多核调试能力建立在 MULTI IDE + 目标连接(Target Connection)+ 调试通道(Debug Channel)+ 多核工程(Multi-Core Project) 的组合之上。理解这四者的关系,比记住菜单路径更重要。

可以把 MULTI 的多核调试体系理解为一条“从工程到芯片”的链路:工程负责组织源码、编译选项和输出文件;目标连接负责描述“用什么硬件/仿真器、连到哪颗芯片、以什么方式访问”;调试通道负责把调试器与具体核(Core)绑定;符号与可执行文件负责让调试器知道“地址对应哪段代码、哪个变量”。四者缺一不可,顺序错乱会导致“连上了但看不到源码”“能下断点但停不下来”“多核只认到一个核”等典型问题。

MULTI 多核调试连接链路 工程 → 目标连接 → 调试通道 → 符号/可执行文件 → 多核调试会话 ① 多核工程 .gpj 工程文件 源码 / 编译选项 多核构建配置 输出 .elf / .out ② 目标连接 仿真器 / 硬件探针 芯片型号 / 核数 复位 / 时钟 / 电压 连接脚本 .tgt ③ 调试通道 Core0 / Core1 / Core2 JTAG / SWD / DAP 通道与核绑定 多核同步/独立控制 ④ 符号/可执行 .elf 符号表 地址映射 源码路径 加载到目标 多核调试会话(Debug Session) 各核独立断点 / 同步运行 / 交叉触发 / 共享内存观察 MULTI Debugger + 多核视图 + 寄存器/内存/变量窗口 常见连接失败点 ✗ 工程未选多核配置 → 只识别单核 ✗ 目标连接芯片型号错误 → 无法访问核 ✗ 调试通道未绑定 → 断点无效 ✗ 符号文件未加载 → 无源码显示

一、创建多核工程:先定“核的拓扑”,再定“构建目标”

MULTI 的多核工程本质上是一个普通 .gpj 工程加上“多核构建配置”。在 Project → New 创建工程时,关键不是工程名,而是选择正确的 Target Architecture 与 Multi-Core 选项。以常见的三核异构示例(Cortex-A + 两个 Cortex-R)为例,工程中应至少包含:

  • 一个共享的 Common 构建配置,用于公共头文件、链接脚本片段;
  • 每个核一个独立的 Build Target,例如 core0.elf、core1.elf、core2.elf;
  • 一个 Multi-Core Group,把上述三个 Build Target 组织为一个调试单元。

在 MULTI 中,多核工程的组织方式通常通过 Project → Properties → Multi-Core 或工程右键菜单中的 Add Multi-Core Group 完成。每个核的编译选项(如 -cpu、-core、-D 宏)必须与目标芯片实际核类型一致,否则会出现“编译通过但下载后跑飞”的情况。

建议在工程根目录下建立 build/、symbols/、target/ 三个子目录,分别存放各核输出、符号文件和目标连接脚本,便于多核工程长期维护。

二、配置目标连接:把“芯片”描述清楚

目标连接(Target Connection)是 MULTI 与硬件之间的“合同”。在 Debug → Target Connection 中新建连接时,需要依次确认:

  1. 连接类型:Green Hills Probe、Lauterbach、Segger J-Link、OpenOCD 或 MULTI 自带的 Simulator;
  2. 芯片/板卡型号:例如 NXP S32G274A、TI TDA4VM、Xilinx Zynq UltraScale+;
  3. 核数量与类型:MULTI 会据此生成可选的调试通道列表;
  4. 复位与初始化脚本:如 reset.tgt、init.gti,用于在连接前配置时钟、DDR、MMU 等。

一个典型的目标连接脚本片段如下(示例,非实测):

# target/s32g274a.tgt
CONNECTION_TYPE = "Green Hills Probe"
DEVICE = "NXP S32G274A"
CORES = 4
CORE0 = "Cortex-A53"
CORE1 = "Cortex-M7"
CORE2 = "Cortex-M7"
CORE3 = "Cortex-M7"
RESET_SCRIPT = "reset_s32g.gti"
INIT_SCRIPT = "init_ddr.gti"

配置完成后,MULTI 会在 Target Connection 面板中显示该连接下的所有核。此时不要急着下载,先执行一次 Connect,确认能读到芯片 ID、核状态和复位向量,这是后续所有调试动作的前提。

三、选择调试通道:把“调试器”与“核”绑定

调试通道(Debug Channel)是 MULTI 多核调试的核心概念。一个目标连接下可能有多个通道,每个通道对应一个物理或逻辑核。在 Debug → Debug Channels 中,需要为每个核指定:

  • 通道名称:如 Core0_A53、Core1_M7;
  • 关联的 Build Target:即该核对应的 .elf 文件;
  • 访问方式:JTAG、SWD、DAP 或仿真器专用通道;
  • 是否参与同步:多核同步运行(Sync Run)或独立控制(Independent)。

选择通道时最容易出错的是“通道与核错位”。例如把 Core1 的符号文件绑到了 Core2 的通道上,调试时会出现“断点命中但源码行号对不上”的现象。判断方法:在 Debug Channels 视图中查看每个通道的 PC 值与 符号文件入口地址是否一致。

多核系统中,若某个核处于复位保持或未启动状态,其调试通道可能显示为灰色。此时应先通过目标连接脚本释放该核,再重新扫描通道。

四、加载符号与可执行文件:让调试器“看懂”代码

符号与可执行文件的加载分为两步:下载(Download) 与 符号加载(Load Symbols)。在 MULTI 中,通常通过 Debug → Download 将 .elf 写入目标内存,再通过 Debug → Load Symbols 把符号表关联到对应调试通道。

以三核工程为例,加载顺序建议为:

  1. 先加载 Core0(主核)的 core0.elf,确认入口地址与复位向量一致;
  2. 再加载 Core1、Core2 的 .elf,分别绑定到各自通道;
  3. 最后执行一次 Symbols → Verify,检查各核符号地址是否落在预期内存区间。

若出现“无源码显示”,优先检查三项:.elf 是否包含调试信息(编译时加 -g)、源码路径是否与工程一致、符号文件是否绑定到了正确的调试通道。MULTI 的 Symbol Browser 可以按核查看已加载的符号,是排查此类问题的有效工具。

五、连接检查清单(可直接使用)

检查项预期结果异常处理
工程多核配置Multi-Core Group 包含全部核补建 Build Target 并加入组
目标连接Connect 成功,读到芯片 ID检查探针驱动、供电、复位脚本
调试通道每核一个通道,状态为 Active释放复位、重新扫描通道
符号加载Symbol Browser 显示各核符号确认 -g、路径、通道绑定
可执行文件Download 无校验错误检查链接地址、内存映射

完成以上四步后,MULTI 的多核调试会话才算真正建立。此时可以在 Multi-Core View 中同时观察各核的 PC、寄存器与调用栈,也可以对单个核设置断点而不影响其他核运行。下一阶段的多核同步、交叉触发和共享内存调试,都建立在本节这条“工程—目标—通道—符号”链路正确无误的基础之上。