2. MULTI 工程与多核目标连接
在 Green Hills MULTI 中调试多核系统,第一步不是直接点“Debug”,而是把“工程—目标—通道—符号/可执行文件”四件事按正确顺序建立起来。MULTI 的多核调试能力建立在 MULTI IDE + 目标连接(Target Connection)+ 调试通道(Debug Channel)+ 多核工程(Multi-Core Project) 的组合之上。理解这四者的关系,比记住菜单路径更重要。
可以把 MULTI 的多核调试体系理解为一条“从工程到芯片”的链路:工程负责组织源码、编译选项和输出文件;目标连接负责描述“用什么硬件/仿真器、连到哪颗芯片、以什么方式访问”;调试通道负责把调试器与具体核(Core)绑定;符号与可执行文件负责让调试器知道“地址对应哪段代码、哪个变量”。四者缺一不可,顺序错乱会导致“连上了但看不到源码”“能下断点但停不下来”“多核只认到一个核”等典型问题。
一、创建多核工程:先定“核的拓扑”,再定“构建目标”
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 中新建连接时,需要依次确认:
- 连接类型:Green Hills Probe、Lauterbach、Segger J-Link、OpenOCD 或 MULTI 自带的 Simulator;
- 芯片/板卡型号:例如
NXP S32G274A、TI TDA4VM、Xilinx Zynq UltraScale+; - 核数量与类型:MULTI 会据此生成可选的调试通道列表;
- 复位与初始化脚本:如
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 把符号表关联到对应调试通道。
以三核工程为例,加载顺序建议为:
- 先加载 Core0(主核)的
core0.elf,确认入口地址与复位向量一致; - 再加载 Core1、Core2 的
.elf,分别绑定到各自通道; - 最后执行一次 Symbols → Verify,检查各核符号地址是否落在预期内存区间。
若出现“无源码显示”,优先检查三项:.elf 是否包含调试信息(编译时加 -g)、源码路径是否与工程一致、符号文件是否绑定到了正确的调试通道。MULTI 的 Symbol Browser 可以按核查看已加载的符号,是排查此类问题的有效工具。
五、连接检查清单(可直接使用)
| 检查项 | 预期结果 | 异常处理 |
|---|---|---|
| 工程多核配置 | Multi-Core Group 包含全部核 | 补建 Build Target 并加入组 |
| 目标连接 | Connect 成功,读到芯片 ID | 检查探针驱动、供电、复位脚本 |
| 调试通道 | 每核一个通道,状态为 Active | 释放复位、重新扫描通道 |
| 符号加载 | Symbol Browser 显示各核符号 | 确认 -g、路径、通道绑定 |
| 可执行文件 | Download 无校验错误 | 检查链接地址、内存映射 |
完成以上四步后,MULTI 的多核调试会话才算真正建立。此时可以在 Multi-Core View 中同时观察各核的 PC、寄存器与调用栈,也可以对单个核设置断点而不影响其他核运行。下一阶段的多核同步、交叉触发和共享内存调试,都建立在本节这条“工程—目标—通道—符号”链路正确无误的基础之上。