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 所处的关键阶段:
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() — 辅助定时器频率接口。