2、开发环境搭建:Workbench安装、目标机与主机连接、启动方式(网络/串口/仿真器)、工程创建与编译

VxWorks BSP与设备驱动开发的第一步,是构建一个可靠、可复现的开发环境。与Linux下“交叉编译器+Makefile”的轻量组合不同,VxWorks的开发体系以Wind River Workbench(基于Eclipse)为核心,强调主机-目标机之间的紧密协同。本章将围绕Workbench的安装与授权、目标机连接方式(网络/串口/仿真器)、VxWorks启动引导机制以及工程创建与编译流程展开,帮助开发者建立起从“裸机调试”到“系统级开发”的完整环境认知。

VxWorks BSP开发环境搭建链路 主机侧(Windows/Linux) Workbench IDE(Eclipse内核) BSP源码包 + 交叉编译器 Target Shell / 调试器 目标机侧(VxWorks) Boot ROM(引导程序) VxWorks 内核镜像 BSP驱动 / 应用任务 连接通道(三选一) 网络(以太网/TCP/IP) 串口(RS-232/485) 仿真器(JTAG/BDM) 启动流程 上电复位 Boot ROM VxWorks 内核加载 工程创建与编译 创建BSP工程 配置VSB/VIP 编译生成镜像

2.1 Workbench安装与授权管理

核心原理:Workbench并非一个简单的IDE,而是基于Eclipse平台深度定制的嵌入式开发套件。它集成了源码编辑器、编译器驱动、调试器(支持任务级与系统级调试)、目标机浏览器(Target Browser)、实时内核对象查看器以及性能分析工具。其核心价值在于:通过统一的图形界面管理从BSP移植、内核配置(VxWorks Image Project,VIP)、到应用编译与下载调试的全过程。安装包通常包含Workbench主程序、对应架构的交叉编译工具链(如ccppc、ccarm)、以及VxWorks源码与BSP模板。

操作流程:安装时需注意以下关键点:

  1. 版本匹配:Workbench版本必须与VxWorks版本严格对应(例如Workbench 3.3对应VxWorks 6.9,Workbench 4.0对应VxWorks 7.0)。混用版本会导致BSP工程无法识别。
  2. 授权(License):Wind River采用浮动授权(Floating License)或节点锁定授权。安装后需通过lmadmin工具配置License Server地址,或导入license.dat文件。若未激活授权,编译时会出现License Error,且无法生成可下载的镜像。
  3. 主机环境:推荐使用64位Windows 10/11或Ubuntu 18.04+。安装路径避免包含中文与空格,否则可能导致Makefile解析异常。
常见误区:许多初学者在安装时忽略“目标机架构”选择。例如,为ARM Cortex-A9目标板安装x86工具链,虽然Workbench能启动,但编译BSP时会报“Unknown architecture”错误。务必在安装时勾选与目标机CPU匹配的“Architecture Support”组件。

2.2 目标机与主机连接:网络、串口与仿真器

核心原理:主机与目标机之间的物理连接是调试的基础。三种连接方式各有侧重:网络连接用于高速下载镜像、挂载NFS文件系统以及运行Target Shell;串口连接主要用于早期Boot ROM调试、控制台输出以及无网络环境下的应急通信;仿真器(JTAG/BDM)则用于硬件初始化阶段、内核崩溃后的调试以及Flash编程。

判断方法与配置流程:

连接方式适用场景关键配置参数调试能力
网络(以太网)镜像下载、文件挂载、多任务调试目标机IP、子网掩码、主机IP、FTP/HTTP启动路径任务级调试、系统级断点
串口(RS-232)Boot ROM输出、内核早期启动日志波特率(通常115200)、数据位8、停止位1、无校验仅文本控制台,无断点
仿真器(JTAG)硬件初始化、Flash烧写、内核死机救援仿真器型号(如Lauterbach Trace32)、目标板JTAG链配置硬件级调试、内存/寄存器读写

实战场景:假设我们使用一颗NXP i.MX6ULL处理器,板卡提供百兆以太网口和调试串口。初始调试时,我们通过串口连接Boot ROM,观察DDR初始化是否通过。当串口输出DDR: 512MB OK后,再配置网络启动参数:

-> bootDevice: eth
-> bootFile: vxWorks
-> hostIP: 192.168.1.10
-> targetIP: 192.168.1.20
-> gatewayIP: 192.168.1.1
-> netmask: 255.255.255.0
-> bootp: off
-> ftpCtrl: off
-> ftpData: off
-> user: target
-> passwd: target
-> boot

此时,目标机通过TFTP从主机下载vxWorks镜像。若网络不通,可回退到串口使用vxWorks_rom镜像进行本地启动验证。

经验提醒:在调试BSP早期代码时,建议同时连接串口与网络。串口用于输出打印信息(通过printf或logMsg),网络用于下载镜像。这样即使网络驱动尚未初始化,也能通过串口定位问题。

2.3 启动方式深度解析:网络、串口与仿真器引导

核心原理:VxWorks启动分为两个阶段:Boot ROM引导与内核加载。Boot ROM是一段极小的代码,固化在Nor Flash或SD卡中,负责初始化CPU、DDR、串口和网卡,然后根据配置从不同介质加载VxWorks镜像。启动方式决定了BSP中bootConfig.c和configNet.h的编译选项。

三种启动方式对比:

  • 网络启动:Boot ROM通过TFTP或FTP从主机获取镜像。优点:镜像更新无需烧写Flash,适合频繁调试。缺点:依赖网络环境,且Boot ROM中必须包含网卡驱动。
  • 串口启动:通过XMODEM/YMODEM协议传输镜像。速度慢(约10KB/s),仅适用于小镜像(如vxWorks_rom小于2MB)或应急恢复。
  • 仿真器启动:通过JTAG接口直接加载镜像到DDR中运行。不依赖目标板上的Boot ROM,适合在Boot ROM尚未移植成功时使用。但需要仿真器硬件和专用软件(如TRACE32、OpenOCD)。

案例拆解:某项目使用FPGA+ARM架构,ARM侧需运行VxWorks。由于FPGA逻辑尚未稳定,DDR控制器时序可能存在问题。此时若直接烧写Boot ROM,一旦DDR初始化失败,板卡将变砖。我们采用仿真器启动方案:使用Lauterbach Trace32连接JTAG,编写初始化脚本startup.cmm,手动配置DDR控制器寄存器,然后加载vxWorks_romCompress镜像到DDR运行。通过仿真器内存窗口观察DDR读写校验值,逐步调整时序参数,最终成功启动内核。此过程避免了反复烧写Flash的风险,将调试周期从3天缩短至4小时。

复盘要点:仿真器启动是BSP移植初期的“安”。但需注意,仿真器调试时,目标机的中断控制器和定时器可能未完全初始化,导致watchdog超时复位。建议在调试脚本中先屏蔽看门狗,或使用sysWdtDisable()函数。

2.4 工程创建与编译:VSB与VIP的协同

核心原理:VxWorks 7.x引入了VxWorks Source Build(VSB)与VxWorks Image Project(VIP)两级构建体系。VSB负责编译内核组件和驱动库,生成lib和bin目录;VIP则基于VSB产物,配置内核参数(如内存大小、驱动包含、启动脚本),最终生成可启动的vxWorks镜像。理解这一分层是掌握工程创建的关键。

操作流程:

  1. 创建VSB工程:在Workbench中点击File -> New -> VxWorks Source Build,选择BSP路径(例如bsp/imx6ull)。在配置界面勾选需要的组件,如INCLUDE_END(网络)、INCLUDE_SHELL(命令行)。
  2. 编译VSB:右键工程选择Build。编译产物位于vsb/imx6ull/目录下。此步骤耗时较长,首次编译可能需要10-20分钟。
  3. 创建VIP工程:新建VxWorks Image Project,选择刚编译好的VSB路径。在Kernel Configuration中调整参数,例如设置DEFAULT_BOOT_LINE为网络启动参数。
  4. 编译VIP:生成vxWorks镜像。右键工程选择Build,输出文件位于default/目录下。

常见编译错误与对策:

错误现象可能原因解决方案
undefined reference to 'sysHwInit'BSP源码未正确关联到VSB检查VSB工程属性中的BSP_DIR路径
Error: CPU type not defined工具链与目标架构不匹配重新选择正确的交叉编译器
No rule to make target 'vxWorks'VIP未关联VSB或VSB编译失败先单独编译VSB,确认无错误后再编译VIP

实战技巧:在BSP驱动开发阶段,我们通常只修改VSB中的驱动源码,然后增量编译VSB,再重新链接VIP。Workbench支持Build Project的增量编译,但若修改了config.h或Makefile,建议执行Clean后全量重编,避免旧对象文件干扰。

风险提示:不要直接在VIP工程中修改内核源码。VIP的编译环境与VSB隔离,任何对usrConfig.c或sysLib.c的修改都应通过VSB完成。否则,在下次重新生成VIP时,修改会被覆盖且无任何提示。