1. BSP 概述:VxWorks BSP 的定义、作用与基本组成结构

BSP(Board Support Package,板级支持包)是 VxWorks 实时操作系统与目标硬件平台之间的关键适配层。它封装了硬件初始化、中断控制、时钟定时器配置、内存映射等底层细节,为上层的 VxWorks 内核与应用程序提供统一的硬件抽象接口。

1.1 BSP 的定义

在 VxWorks 体系中,BSP 是一组源代码、头文件、链接脚本与配置文件的集合,负责完成从系统上电到 VxWorks 内核启动的全部硬件初始化工作。BSP 直接与 CPU、内存控制器、中断控制器、定时器、串口等外设交互,是系统移植与硬件适配的核心模块。

核心定义: BSP = 硬件初始化代码 + 设备驱动框架 + 系统配置描述 + 启动加载逻辑。

1.2 BSP 的作用

BSP 在 VxWorks 系统中承担以下关键职责:

作用域 具体职责 说明
系统启动 CPU 初始化、内存控制器配置、堆栈设置 从复位向量到 C 环境就绪
中断管理 中断控制器初始化、中断向量表安装、中断使能 为内核提供中断分发基础
时钟与定时器 系统时钟定时器配置、辅助定时器驱动 提供系统心跳与时间管理
设备抽象 串口、GPIO、总线控制器等外设的底层驱动 为 I/O 系统提供硬件访问接口
内存映射 MMU 初始化、内存区域属性设置、Cache 策略 定义系统内存布局与访问权限

1.3 BSP 的基本组成结构

一个标准的 VxWorks BSP 由以下目录与文件构成:

  • config.h — 系统配置头文件,定义 CPU 类型、内存大小、中断向量基址、时钟频率等宏。
  • sysLib.c / sysALib.s — 系统初始化汇编与 C 代码,包含复位入口、BSP 初始化入口 sysInit()、sysHwInit()。
  • bspname.h — 板级特定寄存器地址与中断号定义。
  • romInit.s — ROM 启动阶段的汇编初始化代码。
  • Makefile — 编译规则与链接脚本。
  • usrConfig.c — 用户级系统配置与设备注册。
实战提示: 在中断控制器与时钟定时器初始化中,sysHwInit() 是核心入口函数,它依次调用 intVecBaseSet()、intCtlrInit()、sysClkConnect() 和 sysClkEnable()。

1.4 BSP 在系统启动中的位置

下图展示了从系统上电到 VxWorks 内核启动过程中 BSP 所处的关键阶段:

VxWorks 启动流程与 BSP 位置 VxWorks 系统启动流程与 BSP 作用阶段 复位向量 ROM 初始化 BSP 硬件初始化 (中断/时钟/内存) 内核启动 CPU 初始化 中断控制器 时钟定时器 内存映射 串口/外设 BSP 核心阶段:中断控制器与时钟定时器初始化 本课程重点覆盖 sysHwInit() 中的 intCtlrInit() 与 sysClkInit() 实现细节

1.5 BSP 文件与中断/时钟相关模块

下表列出与中断控制器和时钟定时器初始化直接相关的 BSP 文件及其职责:

文件名 中断相关 时钟/定时器相关
sysALib.s 中断向量表基址设置、异常入口 定时器中断入口汇编跳板
sysLib.c sysIntCtlrInit()、intVecBaseSet() sysClkConnect()、sysClkEnable()
config.h INUM_TO_IVEC()、中断栈大小 SYSCLK_RATE_HZ、AUX_CLK_RATE_HZ
bspname.h 中断控制器寄存器基址、中断号定义 定时器寄存器基址、时钟源选择
usrConfig.c 调用 sysHwInit() 触发中断初始化 注册系统时钟 ISR

1.6 BSP 初始化调用链示例

以下代码展示了 BSP 初始化过程中中断控制器与时钟定时器的典型调用顺序:

/* sysLib.c - BSP 硬件初始化入口 */
void sysHwInit(void)
{
    /* 1. 设置中断向量表基址 */
    intVecBaseSet((FUNCPTR *)VEC_BASE_ADRS);

    /* 2. 初始化中断控制器(GIC/APIC/INTC) */
    sysIntCtlrInit();

    /* 3. 连接系统时钟中断服务函数 */
    sysClkConnect((FUNCPTR)sysClkIsr, 0);

    /* 4. 使能系统时钟定时器 */
    sysClkEnable();

    /* 5. 初始化辅助定时器(可选) */
    sysAuxClkInit();
}
常见错误: 在 sysClkConnect() 之前未完成中断控制器初始化,会导致时钟中断无法正确路由到 CPU,系统无法产生心跳 tick。

1.7 BSP 与 VxWorks 内核的接口

BSP 通过以下标准接口与 VxWorks 内核交互,其中中断与时钟接口是系统实时性的基础:

  • sysHwInit() — 内核启动早期调用,完成所有板级硬件初始化。
  • sysHwInit2() — 内核启动后期调用,完成需要内核服务支持的初始化。
  • intConnect() — 内核中断连接函数,BSP 提供底层向量安装支持。
  • sysClkRateSet() / sysClkRateGet() — 系统时钟频率动态调整接口。
  • sysAuxClkRateSet() / sysAuxClkRateGet() — 辅助定时器频率接口。