4. 多核启动与复位调试

多核调试中最容易被低估的环节,是“核还没跑到 main 之前发生了什么”。在 Green Hills MULTI 中,多核启动与复位调试的核心,是让调试器准确掌握每个核的复位状态、复位向量、启动顺序与相互依赖关系。如果只把多核当成多个单核分别 attach,往往会在核间同步、共享内存初始化和外设归属上出现难以复现的异常。本节围绕同步/异步复位、核间启动顺序控制,以及从复位向量开始逐核调试展开。

一、同步复位与异步复位:先分清“谁和谁一起复位”

同步复位指多个核在同一复位事件下同时进入复位状态,通常由系统级复位控制器统一触发,例如上电复位、看门狗系统复位或调试器发出的全局复位。异步复位则允许单个核独立复位,其他核继续运行,常见于核间热复位、单核异常恢复或分阶段启动场景。两者在调试上的关键差别是:同步复位后所有核的 PC 都指向各自复位向量,状态可预期;异步复位后必须明确“被复位核”和“仍在运行核”的边界,否则共享资源访问会冲突。

在 MULTI 中,复位行为由调试配置和硬件复位控制器共同决定。以典型双核 DSP+MCU 架构为例,假设 DSP 核复位向量为 0x80000000,MCU 核复位向量为 0x00000000,系统复位控制器寄存器 RESET_CTRL 的 bit0 控制 DSP 核复位、bit1 控制 MCU 核复位。若写入 RESET_CTRL = 0x00000003,则两核同步复位;若只写 0x00000001,则仅 DSP 核异步复位,MCU 核保持运行。调试前应先确认该寄存器地址与位定义,避免误判复位范围。

同步复位与异步复位的核状态对比 同步复位(RESET_CTRL = 0x3) DSP 核 PC → 0x80000000 MCU 核 PC → 0x00000000 同一复位沿触发,状态一致 共享内存可安全初始化 调试器可同时 halt 两核 再分别设置断点 异步复位(RESET_CTRL = 0x1) DSP 核 PC → 0x80000000 MCU 核 继续运行 仅 DSP 核复位,MCU 保持现场 需防止共享资源竞争 调试器只 halt DSP 核 MCU 核断点需单独管理

二、核间启动顺序控制:谁先跑、谁等谁

多核启动顺序不是“随便谁先跑”,而是由硬件启动模式、Boot ROM 和软件握手共同决定。常见模式有三类:主核先启动并释放从核、所有核等待统一释放信号、以及各核按固定延时依次启动。调试时必须先确认当前芯片的启动模式引脚或启动配置寄存器,否则会出现“从核已经跑飞,主核还在初始化”的错位。

以主从启动为例,主核(MCU)完成时钟、内存和共享外设初始化后,向从核(DSP)的控制寄存器写入释放命令,例如向 DSP_BOOT_CTRL 写入 0x1,DSP 核才从复位向量开始取指。此时若在 MULTI 中只对 DSP 核下断点,而 MCU 核未运行到释放点,DSP 核会一直停在复位状态,表现为“断点不命中”。正确做法是先在 MCU 核的释放写操作之后设置断点,确认释放动作发生,再切换到 DSP 核观察其复位向量处是否开始执行。

核间启动顺序控制还涉及共享内存的初始化顺序。若从核启动后立即访问主核尚未初始化的共享缓冲区,会读到随机值。因此建议在启动代码中增加握手标志:主核初始化完成后置位 SHARED_READY,从核在复位向量后的早期代码中轮询该标志,直到置位再继续。该标志建议放在带复位保持或非初始化段中,避免被从核自身复位清除。

三、从复位向量开始调试各核

从复位向量开始调试,是定位启动类问题最有效的方式。操作上分四步:第一,在 MULTI 的调试配置中为每个核指定正确的复位向量地址和启动模式;第二,执行全局复位后,先让所有核 halt 在复位向量处,确认各核 PC 与预期一致;第三,逐核单步执行复位向量处的第一条指令,观察栈指针、时钟和看门狗配置是否按预期写入;第四,在核间释放点设置断点,验证启动顺序。

实际调试中,建议在复位向量处先确认三个关键点:向量表首地址是否正确映射、栈指针初值是否落在有效 RAM 区间、看门狗是否在启动早期被关闭或喂狗。若某核复位后 PC 停在 0x00000000 但该地址并无有效指令,通常是向量表重映射未生效或启动模式配置错误。此时应检查启动模式引脚采样值和重映射寄存器,而不是盲目修改链接脚本。

调试多核启动时,建议先关闭各核的看门狗或延长超时时间,避免单步调试过程中被复位打断。复位向量处的断点应使用硬件断点,软件断点可能因 Flash 不可写而失效。

四、常见异常与判断依据

多核启动调试中,典型异常包括:从核未释放、复位向量错误、共享内存竞争、以及异步复位后残留状态导致的外设误动作。判断依据可以归纳为:若所有核都停在复位向量且不前进,检查释放条件;若某核 PC 跳转到非法地址,检查向量表和重映射;若从核运行但数据异常,检查共享内存初始化顺序和握手标志;若异步复位后主核外设异常,检查被复位核是否持有共享外设所有权。

在 MULTI 中,可以借助多核调试视图同时观察各核的 PC、SP 和关键寄存器。建议在启动阶段保留一份核状态检查表,记录每个核的复位向量、释放条件、首次断点命中的 PC 以及共享标志状态。这样在出现启动失败时,可以快速判断是复位范围、启动顺序还是向量表配置的问题,而不是在多个核之间反复切换猜测。

掌握同步/异步复位的边界、核间启动顺序的释放逻辑,以及从复位向量逐核调试的方法,才能把多核启动从“碰运气”变成可观察、可复现、可定位的工程过程。