2. Stellar多核启动与系统初始化

Stellar 系列 MCU 内部集成多个 Cortex-M 内核(典型为 M0+ 与 M4/M7 组合),上电后并非所有内核同时开始执行用户代码。理解多核启动流程,是搭建最小多核工程、定位“从核不运行”“共享内存访问异常”等问题的前提。本节围绕 BootROM、用户引导代码、内核间同步启动、时钟与电源域初始化,以及最小多核工程的创建与调试展开。

一、上电复位后的启动链路

Stellar 上电或复位后,硬件首先将 CPU 的控制权交给片内 BootROM。BootROM 是固化在芯片中的只读引导程序,负责最基本的系统建立:读取启动模式引脚或选项字节,判断从 Flash、系统存储器还是外部接口启动;初始化最基础的时钟源(通常为内部 RC);校验并跳转到用户引导代码。BootROM 阶段通常只让主核(Master Core)运行,从核(Slave Core)被保持在复位或等待状态,等待主核显式释放。

用户引导代码位于 Flash 起始区域,是开发者可修改的第一段程序。它需要完成:向量表重定位、栈指针设置、必要的外设时钟使能、从核固件镜像的加载或地址指定,以及最终通过内核间通信机制唤醒从核。BootROM 与用户引导代码的分工可以概括为“BootROM 建立最小可运行环境,用户引导代码完成系统级初始化并启动多核”。

Stellar 多核启动链路与内核间同步 BootROM 启动模式判定 基础时钟建立 用户引导代码 向量表/栈指针设置 从核镜像地址指定 主核系统初始化 时钟树/电源域配置 共享内存与IPC准备 从核保持复位/等待 等待主核释放信号 内核间同步启动 IPC/事件标志握手 从核开始执行 跳转至从核入口函数 共享内存/SRAM 标志位与数据交换 同步标志读写 阶段顺序:BootROM → 用户引导代码 → 主核初始化 → 同步释放从核 → 从核运行 关键机制:从核在同步完成前保持复位;共享内存用于标志位握手与数据交换

二、内核间同步启动机制

从核的释放不能简单依靠“延时等待”,而应使用硬件同步机制。Stellar 通常提供内核间通信外设(如 IPCC、HSEM 或专用邮箱),主核通过写入特定寄存器或事件标志通知从核,从核在复位释放后首先读取该标志,确认主核已完成必要初始化后再继续执行。典型握手流程如下:

  1. 主核完成时钟、电源域、共享内存区域配置。
  2. 主核向从核启动寄存器写入从核入口地址,并置位“释放”位。
  3. 从核退出复位,从入口地址开始执行,首先检查共享内存中的同步标志。
  4. 从核置位“已就绪”标志,主核轮询该标志确认从核已进入运行态。

若缺少同步,从核可能在主核尚未配置好共享外设时访问总线,导致 HardFault 或数据错误。因此同步标志应放在主核与从核均可访问的 SRAM 区域,并注意该区域不能被 Cache 单独缓存而导致可见性问题。

三、时钟与电源域初始化

Stellar 的时钟树通常包含多个时钟源:内部高速 RC(HSI)、外部晶振(HSE)、PLL,以及为不同电源域服务的分频器。多核场景下,主核负责配置系统时钟,从核通常共享同一时钟树,但部分外设时钟可独立门控。初始化顺序建议为:

  • 使能目标时钟源并等待稳定标志(如 HSE 的 HSERDY)。
  • 配置 PLL 倍频/分频参数,切换系统时钟前先确认 PLL 锁定。
  • 按电源域使能对应外设时钟,避免从核访问未使能时钟的外设。
  • 配置低功耗模式相关寄存器,明确各内核在待机时的状态。

电源域方面,Stellar 可能将内核、外设、SRAM 划分到不同域。若从核需要访问某 SRAM 区域,该区域所在电源域必须保持开启。调试阶段常见问题是“从核能启动但访问共享变量即出错”,往往源于该 SRAM 域未上电或时钟未使能。

四、最小多核工程创建与调试

以 STM32CubeIDE 或 ST 提供的 Stellar 专用工具链为例,创建最小多核工程的步骤如下:

  1. 新建工程时选择对应 Stellar 型号,工具会自动生成主核与从核的启动文件、链接脚本和基本初始化代码。
  2. 在主核工程的 main() 中,于外设初始化之后、进入主循环之前,调用从核启动函数,例如 HAL_IPC_StartSlaveCore(&hipc, SLAVE_CORE_ID, slave_entry_addr);。
  3. 在从核工程中实现入口函数,例如 void slave_entry(void),内部先等待同步标志,再执行从核任务。
  4. 为两个核分别配置调试会话:主核使用一个调试配置,从核使用另一个,确保下载时两个核的固件都被正确烧录。

调试时建议先单独验证主核能正常运行并打印日志,再验证从核是否被释放。可在从核入口函数第一行翻转一个 GPIO 或写入共享内存标志,用示波器或调试器观察。若从核未运行,依次检查:从核复位是否释放、入口地址是否正确、从核时钟是否使能、从核向量表是否指向正确位置。

从核固件通常与主核固件位于同一 Flash 的不同扇区,链接脚本中需为从核分配独立的代码段和栈空间。若两个核的栈区域重叠,会出现难以定位的随机崩溃。
在从核尚未完成初始化前,主核不应向从核发送依赖其外设的数据。同步标志应使用 volatile 修饰,并在必要时插入内存屏障,防止编译器优化导致标志读写顺序异常。