2. ROM启动流程总览:VxWorks ROM启动的典型阶段与启动模式分类

VxWorks BSP 的 ROM 启动是嵌入式系统从复位到操作系统内核运行的关键过程。理解 ROM 启动的典型阶段与启动模式分类,是进行 BSP 移植与调试的基础。本章将系统梳理 ROM 启动的完整流程,并对比两种主流启动模式的技术差异。

2.1 ROM启动的典型阶段

VxWorks 的 ROM 启动通常划分为三个核心阶段:ROM init、RAM init 与 Kernel 加载。每个阶段都有明确的硬件操作目标与软件职责。

关键概念: ROM 启动的最终目标是将 VxWorks 内核从非易失性存储(Flash/ROM)中加载到 RAM,并完成必要的硬件初始化,使系统进入可运行状态。

2.1.1 阶段一:ROM init(ROM初始化)

系统上电或复位后,CPU 从复位向量指向的 ROM 地址开始执行。此阶段代码通常位于 ROM 的起始位置,负责最基础的硬件环境准备。

  • 最小系统初始化: 设置 CPU 模式、关闭中断、配置看门狗定时器。
  • 基础寄存器配置: 初始化 PLL、时钟源、内存控制器(如 SDRAM 控制器)的时序参数。
  • 堆栈指针设置: 为后续 C 语言环境建立临时堆栈。
  • 代码搬移(可选): 若为 ROM-based 模式,将 ROM init 代码自身或后续阶段代码搬移至 RAM。

2.1.2 阶段二:RAM init(RAM初始化)

在 ROM init 完成基础时钟与内存控制器配置后,此阶段专注于 RAM 子系统的完整初始化。

  • SDRAM/DDR 控制器初始化: 配置时序参数、刷新率、内存映射。
  • 内存测试: 执行简单的读写校验,确保 RAM 可用。
  • BSS 段清零: 为 C 运行环境准备未初始化数据区。
  • 数据段搬移: 将已初始化数据从 ROM 复制到 RAM 中的正确位置。

2.1.3 阶段三:Kernel 加载(内核加载与启动)

当 RAM 可用且 C 运行环境就绪后,系统进入内核加载阶段。

  • 解压缩(若压缩): 如果 VxWorks 内核镜像是压缩存储的,在此阶段进行解压。
  • 内核搬移: 将 VxWorks 内核从 ROM 或临时缓冲区加载到 RAM 中的运行地址。
  • 跳转到内核入口: 执行 usrInit() 或 sysInit(),启动 VxWorks 内核初始化流程。
实战提示: 在调试 ROM 启动问题时,建议在 ROM init 阶段通过串口输出“心跳”字符(如 'A'、'B'、'C'),以快速定位初始化失败的阶段。
VxWorks ROM 启动三阶段流程图 VxWorks ROM 启动三阶段流程 阶段一:ROM init 最小系统初始化 基础寄存器配置 阶段二:RAM init SDRAM/DDR 初始化 BSS 段清零 阶段三:Kernel 加载 解压缩 / 搬移 跳转到 usrInit() 说明:三个阶段顺序执行,前一个阶段为后一个阶段准备硬件环境。 任何阶段失败都会导致系统无法正常启动。

2.2 启动模式分类

VxWorks 支持两种主要的 ROM 启动模式:ROM-based 与 ROM-resident。两者的核心区别在于代码的执行位置与 RAM 的使用策略。

对比维度 ROM-based 模式 ROM-resident 模式
代码执行位置 初始化代码从 ROM 复制到 RAM 后,在 RAM 中执行 初始化代码直接在 ROM 中执行,不搬移
RAM 占用 需要额外 RAM 空间存放初始化代码 RAM 占用更少,初始化代码不占用 RAM
执行速度 快(RAM 执行速度远高于 ROM) 慢(受限于 ROM 读取速度)
典型应用场景 对启动速度要求高的系统 RAM 资源受限的嵌入式系统
BSP 配置宏 #define ROM_BASED #define ROM_RESIDENT
避坑指南: 在 BSP 开发中,错误配置启动模式可能导致系统在 RAM init 阶段崩溃。例如,在 ROM-resident 模式下错误地搬移了中断向量表,会导致中断处理异常。

2.2.1 ROM-based 模式详解

在 ROM-based 模式下,整个 ROM 启动代码(包括 ROM init、RAM init 和 Kernel 加载)在初始化过程中被复制到 RAM 中,随后在 RAM 中执行。这种模式的优势在于执行速度快,但需要额外的 RAM 空间。

  • 代码搬移时机: 通常在 ROM init 阶段早期,将自身代码从 Flash 复制到预定义的 RAM 地址。
  • 链接脚本要求: 需要定义 ROM_ADRS(ROM 起始地址)和 RAM_ADRS(RAM 运行地址)。
  • 典型流程: 复位 → 执行 ROM 中的最小初始化 → 搬移代码到 RAM → 跳转到 RAM 继续执行 → RAM init → Kernel 加载。

2.2.2 ROM-resident 模式详解

在 ROM-resident 模式下,初始化代码直接在 ROM/Flash 中原地执行,不进行代码搬移。这节省了 RAM 空间,但执行速度受限于 ROM 的读取速度。

  • 无代码搬移: 所有初始化阶段均在 ROM 中完成。
  • 数据段处理: 仅将需要修改的数据段(如全局变量)复制到 RAM,代码段保留在 ROM。
  • 典型流程: 复位 → 在 ROM 中执行 ROM init → 在 ROM 中执行 RAM init → 在 ROM 中执行 Kernel 加载 → 跳转到 RAM 中的内核入口。
ROM-based 与 ROM-resident 启动模式对比 ROM-based 与 ROM-resident 启动模式对比 ROM-based 模式 ① 复位后执行 ROM 中最小初始化 ② 将整个初始化代码搬移到 RAM ③ 在 RAM 中完成后续初始化 ④ 加载内核到 RAM 并跳转 ROM-resident 模式 ① 复位后直接在 ROM 中执行 ② 所有初始化阶段均在 ROM 中完成 ③ 仅搬移数据段到 RAM ④ 跳转到 RAM 中的内核入口 关键差异: • ROM-based:代码搬移后执行,速度快,RAM 占用大。 • ROM-resident:代码原地执行,速度慢,RAM 占用小。 • 选择依据:系统对启动速度与 RAM 容量的权衡。

2.3 启动流程中的关键寄存器配置

在 ROM 启动的各个阶段,寄存器配置是硬件初始化的核心。以下表格列出了各阶段涉及的关键寄存器类型。

启动阶段 关键寄存器/模块 配置目的
ROM init PLL 配置寄存器、时钟分频器 设置 CPU 核心频率与总线频率
ROM init 看门狗定时器控制寄存器 在初始化期间禁用看门狗,防止复位
RAM init SDRAM/DDR 控制器时序寄存器 配置 CAS 延迟、突发长度、刷新周期
RAM init 内存映射寄存器(MMU 基础配置) 建立物理地址到 RAM 的映射
Kernel 加载 中断控制器基础配置 初始化中断向量表基地址
实战提示: 在 BSP 开发中,建议使用 sysPhysMemDesc[] 数组来管理内存映射描述,确保 ROM 启动阶段的内存布局与内核期望的一致。

2.4 启动模式选择决策树

在实际 BSP 开发中,选择启动模式需要综合考虑硬件资源与性能需求。以下决策树可辅助选择。

是否 RAM 资源紧张?
├── 是 → 选择 ROM-resident 模式
│   └── 注意:初始化速度较慢,需优化 ROM 读取效率
└── 否 → 是否对启动速度有严格要求?
    ├── 是 → 选择 ROM-based 模式
    │   └── 注意:需确保 RAM 地址空间足够存放初始化代码
    └── 否 → 根据开发调试便利性选择
        ├── ROM-based:便于单步调试(代码在 RAM 中)
        └── ROM-resident:减少 RAM 占用,适合量产

通过以上对 ROM 启动典型阶段与启动模式的系统梳理,开发者可以更清晰地理解 VxWorks BSP 的启动架构,为后续的寄存器配置实战打下坚实基础。