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)。建议为每个驱动项目单独创建工作空间,避免工程文件混乱。

  1. 启动Workbench:运行 workbench.exe(Windows)或 ./workbench(Linux)。
  2. 选择工作空间:例如 D:\vxworks7_driver_workspace,勾选“Use this as default”以跳过后续提示。
  3. 配置VxWorks安装路径:
    • 进入 Window > Preferences > Wind River > VxWorks 7。
    • 在 VxWorks Installation Root 中填入你的VxWorks 7安装目录,例如 C:\WindRiver\vxworks-7。
    • 确认 Kernel Source 路径自动指向 ${VxWorksInstallDir}/pkgs/os/kernel。
  4. 验证工具链:在 Preferences > Wind River > Build Tools 中检查编译器路径是否包含 ccppc 或 ccarm 等交叉编译工具。
避坑提示:如果工作空间路径包含中文字符或空格,VxWorks的Make系统可能报路径解析错误。请始终使用纯英文路径。

2.2 VSB 项目创建:构建内核基础平台

VSB(VxWorks Source Build)项目负责从源码编译VxWorks内核的基础库、BSP(板级支持包)和核心组件。它是所有后续VIP项目的基础。

2.2.1 创建VSB项目的步骤

  1. 在Workbench中,点击 File > New > VxWorks Source Build Project。
  2. 输入项目名称,例如 myVSB_arm64。
  3. 选择目标架构:例如 ARMARCH64(针对ARMv8平台)或 SIMLINUX(用于仿真调试)。
  4. 选择BSP:例如 qemu-aarch64(QEMU仿真)或 p2020rdb(物理板卡)。
  5. 在 Source Packages 选项卡中,至少勾选以下组件:
    • Kernel Core(内核核心)
    • BSP(板级支持包)
    • IO System(I/O子系统,字符设备驱动必需)
    • POSIX PSE52(如果需要标准锁接口)
  6. 点击 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项目的步骤

  1. 点击 File > New > VxWorks Image Project。
  2. 输入项目名称,例如 myVIP_qemu。
  3. 在 Source Build Project 下拉框中选择之前创建的VSB项目(如 myVSB_arm64)。
  4. 在 Image Type 中选择 vxWorks(标准内核镜像)或 vxWorks_romfs(包含ROMFS文件系统)。
  5. 在 Kernel Components 选项卡中,添加以下组件以支持驱动调试:
    • INCLUDE_IO_SYSTEM(I/O子系统)
    • INCLUDE_LOADER(模块加载器,用于加载.ko文件)
    • INCLUDE_SHELL(内核Shell,用于调试命令)
    • INCLUDE_SYM_TBL(符号表,调试器依赖)
  6. 点击 Finish,Workbench将生成VIP工程文件。

2.3.2 VIP与VSB的关系

VSB 与 VIP 项目关系图 VSB 项目 编译内核基础库 生成 vxWorks 镜像 VIP 项目 配置启动参数 添加内核组件 依赖 VSB 输出 驱动模块 (.ko) 可加载到 VIP 内核 加载到内核空间 引用内核符号

2.4 内核与可加载模块编译

在VxWorks 7中,驱动模块通常以可加载内核模块(LKM)的形式编译,生成 .ko 文件。编译过程需要引用VSB项目的头文件和Makefile变量。

2.4.1 创建驱动模块工程

  1. 点击 File > New > VxWorks Kernel Module Project。
  2. 输入项目名称,例如 myCharDriver。
  3. 在 Source Build Project 中选择对应的VSB项目(如 myVSB_arm64)。
  4. 选择 Module Type 为 Kernel Loadable Module。
  5. 点击 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 编译流程总结

驱动编译完整流程 1. 创建VSB项目 编译内核基础库 2. 创建VIP项目 配置内核组件 3. 编译VIP 生成vxWorks镜像 4. 创建驱动模块工程 引用VSB头文件 5. 编译驱动模块 生成 .ko 文件 6. 加载到目标 ld < myDriver.ko 关键依赖关系 驱动模块编译时必须引用VSB项目的头文件路径和Makefile变量 VIP项目必须基于同一个VSB输出,否则符号表不匹配

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 来显式链接库。