2、开发环境搭建:Workbench安装、目标机与主机连接、启动方式(网络/串口/仿真器)、工程创建与编译
VxWorks BSP与设备驱动开发的第一步,是构建一个可靠、可复现的开发环境。与Linux下“交叉编译器+Makefile”的轻量组合不同,VxWorks的开发体系以Wind River Workbench(基于Eclipse)为核心,强调主机-目标机之间的紧密协同。本章将围绕Workbench的安装与授权、目标机连接方式(网络/串口/仿真器)、VxWorks启动引导机制以及工程创建与编译流程展开,帮助开发者建立起从“裸机调试”到“系统级开发”的完整环境认知。
2.1 Workbench安装与授权管理
核心原理:Workbench并非一个简单的IDE,而是基于Eclipse平台深度定制的嵌入式开发套件。它集成了源码编辑器、编译器驱动、调试器(支持任务级与系统级调试)、目标机浏览器(Target Browser)、实时内核对象查看器以及性能分析工具。其核心价值在于:通过统一的图形界面管理从BSP移植、内核配置(VxWorks Image Project,VIP)、到应用编译与下载调试的全过程。安装包通常包含Workbench主程序、对应架构的交叉编译工具链(如ccppc、ccarm)、以及VxWorks源码与BSP模板。
操作流程:安装时需注意以下关键点:
- 版本匹配:Workbench版本必须与VxWorks版本严格对应(例如Workbench 3.3对应VxWorks 6.9,Workbench 4.0对应VxWorks 7.0)。混用版本会导致BSP工程无法识别。
- 授权(License):Wind River采用浮动授权(Floating License)或节点锁定授权。安装后需通过
lmadmin工具配置License Server地址,或导入license.dat文件。若未激活授权,编译时会出现License Error,且无法生成可下载的镜像。 - 主机环境:推荐使用64位Windows 10/11或Ubuntu 18.04+。安装路径避免包含中文与空格,否则可能导致Makefile解析异常。
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镜像进行本地启动验证。
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小时。
watchdog超时复位。建议在调试脚本中先屏蔽看门狗,或使用sysWdtDisable()函数。
2.4 工程创建与编译:VSB与VIP的协同
核心原理:VxWorks 7.x引入了VxWorks Source Build(VSB)与VxWorks Image Project(VIP)两级构建体系。VSB负责编译内核组件和驱动库,生成lib和bin目录;VIP则基于VSB产物,配置内核参数(如内存大小、驱动包含、启动脚本),最终生成可启动的vxWorks镜像。理解这一分层是掌握工程创建的关键。
操作流程:
- 创建VSB工程:在Workbench中点击
File -> New -> VxWorks Source Build,选择BSP路径(例如bsp/imx6ull)。在配置界面勾选需要的组件,如INCLUDE_END(网络)、INCLUDE_SHELL(命令行)。 - 编译VSB:右键工程选择
Build。编译产物位于vsb/imx6ull/目录下。此步骤耗时较长,首次编译可能需要10-20分钟。 - 创建VIP工程:新建
VxWorks Image Project,选择刚编译好的VSB路径。在Kernel Configuration中调整参数,例如设置DEFAULT_BOOT_LINE为网络启动参数。 - 编译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后全量重编,避免旧对象文件干扰。
usrConfig.c或sysLib.c的修改都应通过VSB完成。否则,在下次重新生成VIP时,修改会被覆盖且无任何提示。