2. 驱动开发环境搭建
在VxWorks 7驱动开发中,环境搭建是决定后续调试效率的关键步骤。本章将引导你完成从Workbench IDE配置到最终生成可加载内核模块(LKM)的完整流程。我们将重点区分VSB(VxWorks Source Build)与VIP(VxWorks Image Project)两个核心项目的职责,并演示如何通过它们分别编译内核与驱动模块。
学习目标:完成本章后,你将能够独立创建一个可编译的VSB基础平台、一个VIP内核镜像工程,并成功编译一个可加载的字符设备驱动.ko文件。
2.1 Workbench IDE 配置与工作空间设置
Workbench 4.0+ 基于Eclipse框架,首次启动时需要指定一个干净的工作空间(Workspace)。建议为每个驱动项目单独创建工作空间,避免工程文件混乱。
- 启动Workbench:运行
workbench.exe(Windows)或./workbench(Linux)。 - 选择工作空间:例如
D:\vxworks7_driver_workspace,勾选“Use this as default”以跳过后续提示。 - 配置VxWorks安装路径:
- 进入
Window > Preferences > Wind River > VxWorks 7。 - 在
VxWorks Installation Root中填入你的VxWorks 7安装目录,例如C:\WindRiver\vxworks-7。 - 确认
Kernel Source路径自动指向${VxWorksInstallDir}/pkgs/os/kernel。
- 进入
- 验证工具链:在
Preferences > Wind River > Build Tools中检查编译器路径是否包含ccppc或ccarm等交叉编译工具。
避坑提示:如果工作空间路径包含中文字符或空格,VxWorks的Make系统可能报路径解析错误。请始终使用纯英文路径。
2.2 VSB 项目创建:构建内核基础平台
VSB(VxWorks Source Build)项目负责从源码编译VxWorks内核的基础库、BSP(板级支持包)和核心组件。它是所有后续VIP项目的基础。
2.2.1 创建VSB项目的步骤
- 在Workbench中,点击
File > New > VxWorks Source Build Project。 - 输入项目名称,例如
myVSB_arm64。 - 选择目标架构:例如
ARMARCH64(针对ARMv8平台)或SIMLINUX(用于仿真调试)。 - 选择BSP:例如
qemu-aarch64(QEMU仿真)或p2020rdb(物理板卡)。 - 在
Source Packages选项卡中,至少勾选以下组件:Kernel Core(内核核心)BSP(板级支持包)IO System(I/O子系统,字符设备驱动必需)POSIX PSE52(如果需要标准锁接口)
- 点击
Finish,Workbench将自动调用vxprj vsb build命令开始编译。
2.2.2 VSB项目结构
| 目录/文件 | 说明 |
|---|---|
default/ |
编译输出目录,包含内核镜像 vxWorks 和所有目标文件 |
config.h |
内核配置头文件,定义宏开关(如 INCLUDE_IO_SYSTEM) |
Makefile |
顶层Makefile,驱动模块编译时需引用此文件中的变量 |
prjParams.h |
项目参数文件,记录BSP、架构等编译选项 |
关键点:VSB编译完成后,会在
default/ 目录下生成 vxWorks 内核镜像和 vxWorks.sym 符号表文件。驱动调试时,必须确保VSB与VIP使用同一个VSB输出目录,否则符号解析会失败。
2.3 VIP 项目创建:配置内核镜像与启动参数
VIP(VxWorks Image Project)项目基于VSB的输出,进一步配置内核的启动参数、文件系统、网络栈等运行时特性。驱动开发者通常通过VIP来指定驱动模块的加载方式。
2.3.1 创建VIP项目的步骤
- 点击
File > New > VxWorks Image Project。 - 输入项目名称,例如
myVIP_qemu。 - 在
Source Build Project下拉框中选择之前创建的VSB项目(如myVSB_arm64)。 - 在
Image Type中选择vxWorks(标准内核镜像)或vxWorks_romfs(包含ROMFS文件系统)。 - 在
Kernel Components选项卡中,添加以下组件以支持驱动调试:INCLUDE_IO_SYSTEM(I/O子系统)INCLUDE_LOADER(模块加载器,用于加载.ko文件)INCLUDE_SHELL(内核Shell,用于调试命令)INCLUDE_SYM_TBL(符号表,调试器依赖)
- 点击
Finish,Workbench将生成VIP工程文件。
2.3.2 VIP与VSB的关系
2.4 内核与可加载模块编译
在VxWorks 7中,驱动模块通常以可加载内核模块(LKM)的形式编译,生成 .ko 文件。编译过程需要引用VSB项目的头文件和Makefile变量。
2.4.1 创建驱动模块工程
- 点击
File > New > VxWorks Kernel Module Project。 - 输入项目名称,例如
myCharDriver。 - 在
Source Build Project中选择对应的VSB项目(如myVSB_arm64)。 - 选择
Module Type为Kernel Loadable Module。 - 点击
Finish,Workbench将自动生成Makefile和module.c模板文件。
2.4.2 编写驱动代码并编译
在 module.c 中编写字符设备驱动框架代码(后续章节详解),然后通过以下方式编译:
- Workbench图形化编译:右键点击工程 →
Build Project。 - 命令行编译:进入工程目录,执行
make命令。Workbench会自动调用VSB的交叉编译器。
编译成功后,在工程 default/ 目录下会生成 myCharDriver.ko 文件。
2.4.3 编译输出文件清单
| 文件 | 说明 |
|---|---|
myCharDriver.ko |
可加载内核模块文件,可直接通过 ld 命令加载到运行中的VxWorks内核 |
myCharDriver.o |
未链接的目标文件,用于静态编译进内核 |
myCharDriver.map |
符号映射表,调试时用于地址解析 |
Makefile |
工程Makefile,包含编译规则和依赖路径 |
2.5 编译流程总结
2.6 常见编译错误与排查
| 错误现象 | 可能原因 | 解决方案 |
|---|---|---|
undefined reference to 'xxx' |
驱动模块引用了内核符号,但VSB未包含对应组件 | 在VSB的 config.h 中添加 #define INCLUDE_xxx,重新编译VSB |
cannot find -lxxx |
缺少链接库文件 | 检查VSB的 default/lib/ 目录是否存在对应 .a 文件 |
fatal error: vxWorks.h: No such file or directory |
驱动模块工程未正确引用VSB头文件路径 | 在工程属性中确认 Source Build Project 已正确关联VSB |
module version mismatch |
驱动模块编译时的VSB版本与运行时的内核版本不一致 | 确保驱动模块和VIP使用同一个VSB输出目录 |
调试技巧:在Workbench的
Console 视图中查看编译输出,搜索 error: 或 warning: 关键字。如果遇到链接错误,可以尝试在驱动模块的 Makefile 中添加 EXTRA_LIBS += -lxxx 来显式链接库。