1. VxWorks BSP 概述:BSP 的定义、作用与在 VxWorks 系统中的位置
1.1 BSP 的定义
板级支持包(Board Support Package,BSP) 是介于 VxWorks 内核与目标硬件平台之间的软件层。它封装了特定硬件平台的初始化、驱动和配置细节,为上层 VxWorks 内核提供统一的硬件抽象接口。
核心理解: BSP 是 VxWorks 系统“软硬解耦”的关键桥梁。没有 BSP,VxWorks 内核无法直接操作任何具体硬件。
一个完整的 BSP 通常包含以下组件:
| 组件 | 说明 | 典型文件 |
|---|---|---|
| 启动代码 | CPU 复位后的第一条指令,完成最小系统初始化 | romInit.s、sysALib.s |
| 系统初始化 | 配置 MMU、Cache、中断控制器、时钟等 | sysLib.c、sysHwInit.c |
| 设备驱动 | 串口、以太网、Flash、I2C 等外设驱动 | sysSerial.c、sysFlash.c |
| 配置头文件 | 定义内存映射、中断号、设备寄存器基址 | config.h、sysPpc.h |
| Makefile | 编译链接规则,指定目标板类型 | Makefile |
1.2 BSP 在 VxWorks 系统中的位置
VxWorks 系统采用分层架构,BSP 位于最底层,直接与硬件交互。上层组件通过 BSP 提供的接口访问硬件资源,无需关心具体硬件实现细节。
关键位置特征:
- BSP 是 VxWorks 系统中唯一直接访问硬件寄存器的软件层。
- 内核通过 BSP 提供的
sys*系列函数间接操作硬件。 - 更换硬件平台时,只需替换 BSP 层,上层软件无需修改。
1.3 BSP 的核心作用
BSP 在 VxWorks 系统中承担以下关键职责:
- 硬件初始化:完成 CPU、内存、中断控制器、定时器等核心外设的初始化配置。
- 启动加载:支持从 ROM、Flash、网络等多种介质引导 VxWorks 内核。
- 中断管理:注册中断向量表,实现中断响应与分发。
- 设备驱动:提供串口、网口、存储等基本设备的底层驱动。
- 内存映射:配置 MMU,建立虚拟地址到物理地址的映射关系。
- 时钟与定时器:提供系统 tick 时钟和硬件定时器服务。
1.4 BSP 与 VxWorks 内核的接口
BSP 通过一组标准化的接口函数与 VxWorks 内核交互。这些接口定义在 sysLib.h 和 vxLib.h 中,是 BSP 开发必须遵循的契约。
| 接口函数 | 功能描述 | 调用时机 |
|---|---|---|
sysHwInit() |
初始化所有板级硬件设备 | 内核启动早期 |
sysHwInit2() |
第二阶段硬件初始化(依赖内核服务) | 内核初始化后 |
sysMemTop() |
返回可用物理内存的顶端地址 | 内存系统初始化 |
sysBusIntCtl() |
中断控制器配置与使能 | 中断系统初始化 |
sysSerialHwInit() |
串口硬件初始化 | 控制台初始化 |
sysFlashInit() |
Flash 设备初始化与分区探测 | 文件系统挂载前 |
开发注意事项:
sysHwInit()中不能调用任何依赖内核服务的函数(如malloc、taskDelay)。- 中断向量表的注册必须在
sysHwInit2()之前完成。 - Flash 驱动需要实现
flashDevInit、flashRead、flashWrite、flashErase四个基本接口。
1.5 BSP 的启动流程
VxWorks 系统从复位到正常运行,BSP 参与的关键阶段如下:
- ROM 启动阶段:执行
romInit(),完成 CPU 模式设置、堆栈初始化、最小系统配置。 - RAM 加载阶段:将 VxWorks 内核从 ROM/Flash 复制到 RAM 中。
- 内核初始化阶段:调用
usrInit()→sysHwInit()→sysHwInit2()。 - 系统启动阶段:创建根任务,启动文件系统、网络协议栈等组件。
- 应用运行阶段:用户应用程序开始执行。
1.6 BSP 开发的核心原则
- 硬件无关性:BSP 上层代码不应包含任何硬件寄存器直接操作。
- 可移植性:BSP 应尽量使用 VxWorks 提供的标准接口,减少对特定编译器的依赖。
- 模块化:将不同外设的初始化代码分离到独立文件中,便于维护和复用。
- 可配置性:通过
config.h中的宏定义控制 BSP 功能开关,避免硬编码。 - 实时性:中断服务程序和关键初始化路径必须满足实时性要求。
BSP 开发黄金法则: 尽可能多地使用 VxWorks 提供的标准 BSP 模板(如
template BSP)作为起点,只修改与目标硬件相关的部分。这可以大幅降低开发难度和出错概率。