2. ROM启动流程总览:VxWorks ROM启动的典型阶段与启动模式分类
VxWorks BSP 的 ROM 启动是嵌入式系统从复位到操作系统内核运行的关键过程。理解 ROM 启动的典型阶段与启动模式分类,是进行 BSP 移植与调试的基础。本章将系统梳理 ROM 启动的完整流程,并对比两种主流启动模式的技术差异。
2.1 ROM启动的典型阶段
VxWorks 的 ROM 启动通常划分为三个核心阶段:ROM init、RAM init 与 Kernel 加载。每个阶段都有明确的硬件操作目标与软件职责。
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 内核初始化流程。
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 |
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 中的内核入口。
2.3 启动流程中的关键寄存器配置
在 ROM 启动的各个阶段,寄存器配置是硬件初始化的核心。以下表格列出了各阶段涉及的关键寄存器类型。
| 启动阶段 | 关键寄存器/模块 | 配置目的 |
|---|---|---|
| ROM init | PLL 配置寄存器、时钟分频器 | 设置 CPU 核心频率与总线频率 |
| ROM init | 看门狗定时器控制寄存器 | 在初始化期间禁用看门狗,防止复位 |
| RAM init | SDRAM/DDR 控制器时序寄存器 | 配置 CAS 延迟、突发长度、刷新周期 |
| RAM init | 内存映射寄存器(MMU 基础配置) | 建立物理地址到 RAM 的映射 |
| Kernel 加载 | 中断控制器基础配置 | 初始化中断向量表基地址 |
sysPhysMemDesc[] 数组来管理内存映射描述,确保 ROM 启动阶段的内存布局与内核期望的一致。
2.4 启动模式选择决策树
在实际 BSP 开发中,选择启动模式需要综合考虑硬件资源与性能需求。以下决策树可辅助选择。
是否 RAM 资源紧张?
├── 是 → 选择 ROM-resident 模式
│ └── 注意:初始化速度较慢,需优化 ROM 读取效率
└── 否 → 是否对启动速度有严格要求?
├── 是 → 选择 ROM-based 模式
│ └── 注意:需确保 RAM 地址空间足够存放初始化代码
└── 否 → 根据开发调试便利性选择
├── ROM-based:便于单步调试(代码在 RAM 中)
└── ROM-resident:减少 RAM 占用,适合量产
通过以上对 ROM 启动典型阶段与启动模式的系统梳理,开发者可以更清晰地理解 VxWorks BSP 的启动架构,为后续的寄存器配置实战打下坚实基础。