尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

VxWorks 6.8与Workbench 3.2开发环境搭建实战指南(含踩坑记录)

VxWorks 6.8与Workbench 3.2开发环境搭建实战指南(含踩坑记录) 如果你刚拿到一台下一个老项目的维护任务大概率会遇到这套组合VxWorks 6.8 加 Workbench 3.2。说句实话在 2024 年的今天这套工具链已经属于爷爷辈了——它大概是 2011 年前后的产物官方支持的主机系统还是 Windows XP 和 Windows 7。但存量市场摆在那里航空航天、国防、电力控制、轨道交通、工业机器人一大批已经跑稳定了的设备还在用 VxWorks 6.8。新人接手的第一关往往是把开发环境搭起来。这篇文章就是围绕这件事写的从零开始搭建 VxWorks 6.8 与 Workbench 3.2 的开发环境把环境模型讲清楚把安装、License、建工程、编译、跑模拟器、下载 hello world 这条链路完整走一遍最后把我这些年遇到的高频坑位和排查思路整理出来。适合刚接触 VxWorks、需要维护老项目、或者纯粹想搞明白这套环境到底怎么转起来的嵌入式工程师。1. 这个组合的价值为什么要折腾 VxWorks 6.8 与 Workbench 3.21.1 VxWorks 在嵌入式江湖中的位置VxWorks 是个实时操作系统它的强项是确定性任务调度、中断响应、内核服务都带着可预测的时序再加上风河多年的商用操作系统生态让它成了高可靠场景的老牌选择。很多飞行器、导弹、舰载设备、电力保护装置里面跑的就是 VxWorks。这类设备生命周期极长可能出厂十年八年还在服役于是老版本 VxWorks的需求并不会消失反而随着新人入场不断出现。Workbench 3.2 就是配套 VxWorks 6.x 的集成开发环境底层是 Eclipse 那一代框架但风河做了大量改造加入了工程管理、交叉编译、Target Server 连接、调试器、内核级查看工具。它跟现在大家习惯的 VS Code 那种轻量 IDE 完全是两回事更像是一个重武器所有和 VxWorks 相关的操作都被塞进同一个工具里了。1.2 为什么是 6.8 这个版本VxWorks 6.x 系列里6.8 算是比较成熟的收官版本。它引入并完善了 RTPReal Time Process用户态进程机制和老的 5.x 那种所有代码都塞进内核的玩法相比多了一层隔离。同时它的组件化配置已经非常成熟内核裁剪、功能开关都能在 Workbench 里点出来。还有一个现实原因是很多老项目的 BSP、驱动、应用代码都是基于 6.8 开发的升级到 VxWorks 7 是大工程BSP 结构变了、构建系统也变了没几个项目经理愿意承担这种风险。所以 6.8 的学习价值不仅仅是学新知识更多的是能看懂现网设备里跑的到底是什么。1.3 你需要的准备和预期搭这套环境你需要准备的东西不算多但有一点心理建设要先做好这套老工具对现代硬件的兼容性并不好所以大概率要开一台虚拟机。我建议立刻确认三件事一是拿到 Workbench 3.2 的安装包ISO 或者 DVD 都行二是拿到对应这套工具的 License不管是正版授权文件还是公司内部 License Server 地址三是确认你目标板卡对应的 BSP没有 BSP 光有环境也没法上板。这篇文章的路径是宿主机 虚拟机 VxSim 模拟器先跑通再给你留出替换成真实目标板卡的接口。从零到能把镜像编出来、能下载内核模块跑起来完成这个目标大概需要半天到一天取决于你对老工具链的熟悉程度。2. 动手之前先把环境模型装进脑子2.1 宿主机、目标机、工具链之间的关系很多人第一次接触 VxWorks 环境会被一堆名词绕晕Host、Target、BSP、VIP、DKM、Target Server、WDB、VxSim。其实它们之间的关系特别简单就三块宿主机Host你面前这台开发电脑安装 Workbench 3.2负责编辑代码、交叉编译、下载、调试。目标机Target真正运行 VxWorks 系统的设备可以是工控板、单板机、或者一个模拟器程序。工具链Toolchain交叉编译器跑在宿主机上编译出能在目标机上运行的代码。VxWorks 6.8 默认用的是 GNU 工具链按目标 CPU 架构区分比如 x86、PowerPC、ARM、MIPS。它们之间的通信由 Target Server 负责。Target Server 是跑在宿主机里的一个服务进程它通过 WDB 协议跟目标机上的 Target Agent 通信实现下载模块、启动任务、读写内存、调试这些能力。你可以把它理解成宿主机 IDE 和目标机系统之间的桥梁。2.2 BSP 是什么为什么它决定后续一切BSPBoard Support Package是板级支持包。VxWorks 镜像要能在一款板卡上起来必须知道怎么初始化 CPU、访问内存、配置串口、网口等这些都在 BSP 里。官方安装包里自带一批 BSPx86 系列比如 Pentium4PowerPC 系列比如 mvme5500ARM 系列还有专门给模拟器用的 VxSim BSP。每个 BSP 都有配套的 config.h、sysLib.c、romInit.s 这些文件分别定义内存布局、时钟、驱动配置、启动入口。选择 BSP 是搭建环境的第一步因为你后面所有镜像工程的属性都挂在 BSP 上。选对了编译出来的镜像能引导选错了整个过程都会在目标机起不来的阶段反复折腾。初学阶段用 VxSim 模拟器对应的 BSP 最省心它可以绕开真实硬件。2.3 License、安装包和目录规划Wind River 的授权机制用的是 FLEXlm 体系。授权方式主要有两种本地 License 文件一个 .lic 文本文件或者指向一台 License Server。环境变量WIND_LICENSE_FILE决定了 Workbench 去找哪个 license常见值是类似C:\WindRiver\license\license.lic或者170010.0.0.5这种 server 地址。安装目录规划是一个特别值得提前注意的点整个安装路径绝对不能有中文也不建议放在带空格的目录比如 C:\Program Files因为 VxWorks 的构建脚本是 make 文件体系对路径空格非常敏感。通常大家会直接装在C:\WindRiver这种路径下干净利落。2.4 虚拟机方案让老工具跑在现代硬件上Workbench 3.2 官方支持的是 Windows XP 和 Windows 7越老的系统反而跑得越稳。如果你的主力机器是 Windows 10/11直接装一定会遇到各种诡异问题最典型的就是安装程序不兼容、激活时 FlexLM 服务起不来。我的建议是直接上虚拟机。VMware Workstation 或者 VirtualBox 都行。我给一个参考配置项目建议值说明客户机系统Windows 7 32/64 位兼容性好内存管理比 XP 强CPU 核数2 核即可VxSim 不需要太多核内存2~4 GB虚拟机内跑 Workbench 和 VxSim 够用磁盘40 GB安装完 Workbench 约 10 GB后面工程会膨胀网络桥接模式如果后续要连接真实目标板建议桥接快照安装完成后打快照老工具经不起折腾快照是后悔药有一类问题要注意虚拟机本身有定时精度问题VxSim 模拟出的时间可能偶尔不准但这不影响学习。真正要核对的是网卡类型尽量选 e1000 或 VMXNET3后面 Target Server 通过网口连目标机时能少出毛病。3. 完整安装与许可证联调一次装对的步骤清单3.1 Workbench 3.2 安装过程安装包拿到手后进入安装流程我按实际能落地的顺序写一遍把 Workbench 3.2 的 ISO 挂载到虚拟机光驱进入根目录找到 setup.exe管理员权限运行。安装程序会进入 InstallShield 界面先选择语言和安装类型。这里强烈建议选自定义安装不要无脑全选。到了组件选择页面你会看到一堆可选项。其中跟 VxWorks 直接相关的是 VxWorks 6.8 和 Workbench 两大部分下面还能按 CPU 架构勾选目标支持。学习阶段只勾 x86 和 VxSim 相关支持就够了PowerPC/ARM 等后续有板卡需求再补装能省不少时间和磁盘。设置安装路径我按前面说的用C:\WindRiver这种无空格路径。安装过程会跑挺久尤其是最后一两步在配置 Eclipse 环境和注册工具链的时候看起来像卡住了实际上在动耐心等。安装完成之后建议检查安装根目录下的结构C:\WindRiver\vxworks-6.8是 VxWorks 6.8 本体里面有 target 目录target 下面是 config、lib、src 这些子目录C:\WindRiver\workbench-3.2是 IDE 本体。这个结构认识一下后面很多路径问题都要回到这里找答案。3.2 配置 Wind River License这一步是环境搭建的分水岭License 配不好后面建任何工程都会在中途弹窗报错。顺序是这样的找到你的 License 文件确认后缀是 .lic。如果是 License Server 授权先确认服务器地址和端口比如1700192.168.1.100。在 Windows 系统环境变量里新建WIND_LICENSE_FILE把 license 文件路径或 server 地址填进去。首次启动 Workbench 3.2它会让你指定 workspace 路径。这个路径同样别用中文我一般放在D:\wr_ws。在 Workbench 菜单栏打开Window - Preferences - Wind River - License确认 License 路径已经正确加载。这里的输出看起来像一行普通配置但它决定了所有下游操作。如何验证 License 是否真的有效最靠谱的不是看界面而是直接新建一个最小 VIP 工程并尝试编译编译过程会校验 license如果输出窗口出现License error、Feature checkout fail之类的关键字说明 License 还是没对上。3.3 验证安装启动编译一个最小工程新建最小工程这一步其实就是验证环境的最终手段具体操作在下一节展开。先说明验收标准新建一个 VxWorks Image Project选择 x86 或 VxSim 对应的 BSP默认组件配置直接编译能在工程输出目录下生成vxWorks文件那你的安装和 License 就算彻底通了。如果你在编译刚开始就报一堆Fatal error, cannot find ...不要慌先看是不是 License 环境变量没生效——很多时候修改完环境变量需要重启 Workbench 甚至重启虚拟机才会加载。4. 创建 VxWorks 镜像工程让系统在模拟器上先转起来4.1 三种工程类型的边界Workbench 3.2 里最常用的工程类型有三种它们的边界必须搞清楚工程类型产出物运行位置典型用途VxWorks Image ProjectVIPvxWorks 镜像文件目标机启动时加载生成目标系统本体Downloadable Kernel ModuleDKM.out 文件下载到目标机内核地址空间内核模块、驱动、任务代码调试Application 工程RTP.vxe 文件下载到目标机用户态进程VxWorks 6.x 用户态应用学习路径里VIP 是第一步DKM 是第二步。因为 DKM 需要先有一个跑起来的 VxWorks 系统你才能把模块下载进去。4.2 选择 BSP 与 CPU 型号打开 Workbench执行File - New - VxWorks Image Project或者直接在 Project Explorer 里右键新建进入向导。给它取个名字比如vxWorks_demo然后到了最关键的一步选择 BSP。如果你准备用 VxSim 模拟器跑就找名字里带sim或vxsim的 BSP例如vxsim-win32具体名称跟你安装时勾选的架构有关。如果要用真实 x86 工控机选x86或Pentium4这类。接下来会让你选择内核类型常见的是Uniprocessor和SMP。初学阶段选Uniprocessor少一层复杂度和不确定性真要在多核板卡上跑再单独研究 SMP 版本。4.3 组件配置与编译工程创建完后Workbench 会显示一个 Components 配置视图默认加载的是一套开发型组件集已经包含了不少基础服务但不是全量的。这里我列出初学阶段最需要注意的组件INCLUDE_SHELL对应 VxWorks 内核 Shell启动后能在控制台敲命令。调试阶段没有 Shell 会非常痛苦。INCLUDE_WDBWDB Target Agent宿主机的 Target Server 能不能连上目标机就看它有没有编进去。INCLUDE_NETWORK 系列网络协议栈相关如果后续要网口通信必须确认打开。INCLUDE_STANDALONE 这类代表系统引导方式一般不手动改保持默认。组件配置不是随便勾的VxWorks 6.x 组件之间存在依赖关系你打开 A 组件如果 A 依赖 B编译器会要求 B 也出现在配置里。Workbench 通常能自动处理大部分依赖但偶尔也会出现undefined symbol或者编译中途停止的情况那时就要回头检查组件依赖树。配置完后右键工程 -Build Project。第一次编译可能要等几分钟因为要生成 BSP 相关的目标文件。编译输出日志在 Console/Output 窗口最后能在工程的default目录下看到著名的两个产物文件bootrom引导程序和vxWorks内核镜像。4.4 用 VxSim 模拟器把镜像跑起来拿到 vxWorks 镜像之后最直观的验证方式是启动 VxSim。在 Workbench 的 Target 相关菜单里可以新建一个 Target Server 配置连接类型选择 VxSim然后启动。它会拉起一个模拟目标机进程加载你编译好的镜像之后模拟机会输出内核启动日志一路显示到 Shell 就绪。这个时候其实你已经完成了环境搭建的第一个里程碑能编译、能启动、能看见运行输出。很多初学者卡在编译不了或不知道编译完怎么算成功到这里至少心里有底了。5. Hello World 与 Target Server 联调从能编译到能调试5.1 DKM 工程怎么建镜像跑起来之后下一步是编译一个可以下载到目标机运行的内核模块。在 Workbench 里新建工程选择Downloadable Kernel Module给工程起名hello_dkm然后添加一个源文件hello.c#include vxWorks.h #include stdio.h void helloInit(void) { printf(hello from vxworks\n); }注意函数名不要叫main内核模块没有 main 入口。把它编译成hello.out这个文件就是 DKM 成品。5.2 配置 Target Server 连上目标机Target Server 是宿主机侧的关键服务。在 Workbench 的 Target Server 视图里新建配置连接类型依赖你自己选择的方式如果用了 VxSim就选 vxsim 连接如果后面接真实目标板选网络连接并填目标板 IP。配置时要注意 Target Server 的启动参数里是否指定了正确的 WDB 端口和目标机 IP。VxSim 场景下大多数默认值就能工作真实板卡场景下目标机上的 WDB 网络配置IP、端口、target agent 的启动参数和宿主机 Target Server 的配置必须一一对应。连接建立成功后Target Server 视图的状态会变成 connected。此时 Workbench 已经能够和目标机内核交互。5.3 下载、运行并查看输出下载 DKM 有以下常见方式右键工程里的hello.out选择Target - Download File这个操作会把模块加载到目标机内核地址空间但还没有启动函数。打开 Kernel Shell 视图也就是 Workbench 里的 WindSh在里面执行ld hello.out这个命令会把文件加载到内核。加载之后调用函数helloInit如果一切正常Target Console 或者 Kernel Shell 的输出窗口会打出hello from vxworks。如果没有任何输出先别急着怀疑代码。按照排查顺序看Target Server 是不是真的连接成功模块是不是真的加载了可以用lkup命令查模块列表以及 printf 的输出是不是被 console 重定向到了别的地方。5.4 为什么这套联调逻辑值得花时间弄明白Hello World 简单但背后跑通的是一条完整链路交叉编译 - 镜像启动 - 目标机系统就绪 - 宿主机通过 WDB 通信 - 模块加载 - 函数调用 - 输出回传。这条链路正是你后面所有开发工作的主心骨。后面写驱动、调任务、查内存全都走这条路。在这里多花时间后面会省大量排查时间。6. 高频踩坑记录与排查思路6.8 时代的老朋友6.1 License 相关坑位我见过最多的问题是License not found或者Feature expired。这类问题有一个共性套路不是 license 坏了是路径配错了。排查链路确认环境变量WIND_LICENSE_FILE是否被正确设置命令行执行echo %WIND_LICENSE_FILE%查看。确认 license 文件里的服务器 IP、端口是否可达如果是 License Server用 ping 或者 telnet 测试 1700 端口是否通。检查系统时间。FLEXlm 的 license 对时间非常敏感系统时间往回拨哪怕一分钟都可能直接失效。最后确认 license 里的 hostid 是否和当前机器 MAC 匹配很多企业授权是绑定网卡的。还有一种隐藏问题Windows 7 虚拟机的网卡 MAC 地址在多次挂起/恢复后发生变化导致 hostid 对不上。这种情况在虚拟机设置里固定网卡 MAC 地址即可。6.2 Target Server 连不上连接失败可以分三层来查Target Server 服务本身有没有起来看 Workbench 里 Target Server 状态如果红色 disconnected先重启服务看日志。WDB 通信链路通不通VxSim 场景下检查模拟机是否真正启动真实板卡场景下在宿主机 ping 目标板 IP确认链路通。组件配置对不对目标系统里没编入 INCLUDE_WDB或者 WDB 网络端口没配置宿主机再努力也连不上。这种问题只能回到内核镜像重新配置组件、重新编译、重新启动目标系统。在实际调试里我还碰到过防火墙把 WDB 端口拦掉的情况尤其 Windows 新版本默认防火墙策略比较严。给 Workbench 进程加一条放行规则问题就消失了。6.3 编译相关坑位VxWorks 6.8 的编译体系对路径和文件名的要求比现代工具链苛刻得多。高频报错和对应解法报错症状常见根因处理方式cannot open source file vxWorks.h头文件搜索路径没配上检查工程属性里的 include path是否指向target/hUnknown type name一堆报错没加对应头文件或宏定义确认 CPU 宏和工具链宏是否一致中文路径导致编译乱码源码文件路径含中文把所有文件挪到纯英文路径No rule to make targetmake 依赖关系被打乱干净重编译Clean 后重新 Build工具链找不到安装时未勾选对应架构支持回安装程序补装架构支持编译报错时要先看输出日志的最前面一行一行往上翻。Workbench 的编译日志默认不会高亮真正的首个错误经常是后面的错误淹没了前面的根因。6.4 VxSim 与虚拟机的坑VxSim 在虚拟机里跑本质是虚拟机里跑模拟器对资源有些要求。如果遇到 VxSim 启动后界面没有反应、内核日志停在启动早期我的经验是优先检查虚拟机的 CPU 配置是否开启了虚拟化引擎以及内存是否足够。VxSim 镜像加载需要的内存并不小给虚拟机 2GB 以上比较稳。另外VxSim 的网络模式依赖宿主机网络环境。如果你用 NAT 模式VxSim 的网络设备可能工作不正常改成桥接模式常常立刻见效。7. 环境跑通之后接下来怎么学7.1 补上 VxWorks 内核的基本功Hello World 只是起点。你接下来要面对的是 VxWorks 的内核编程模型和 Linux 用户态编程完全是两个世界。我建议按这个顺序打基础任务taskSpawn、taskDelete、taskPrioritySet理解优先级抢占调度和时间片轮转。同步与互斥semBCreate、semMCreate、semTake、semGive这是多任务编程的核心。消息队列msgQCreate、msgQSend、msgQReceive理解任务间数据传递。中断intConnect、中断服务程序写法注意中断里不能调用可能阻塞的服务。看门狗wdStart理解定时回调机制。看书的时候你会发现 VxWorks 的 API 特别老派全是前缀缩写但恰恰因为这种稳定老项目的代码才那么容易一眼看懂。7.2 从模拟器走向真实板卡模拟器只能帮你验证逻辑真实板卡的难点在于 BSP 和驱动。VxWorks 6.8 的 BSP 目录在target/config下每个 BSP 包含启动代码romInit.s、板级初始化sysLib.c、配置头文件config.h。理解 BSP 的方法是打印它的启动流程CPU 上电执行 ROM 启动代码。初始化最小硬件环境时钟、串口。解压并搬移 vxWorks 镜像到内存。内核启动执行usrInit、usrKernelInit等 C 初始化例程。进入usrRoot创建系统任务最终启动 Shell。这份流程在《VxWorks BSP Developers Guide 6.8》里写得很清楚对照你自己的 BSP 看一遍收获会非常大。7.3 别急着升级先把老代码读透环境跑通之后我特别想提醒一句你手上很可能有一堆历史代码。先别觉得老代码丑VxWorks 6.8 时代的代码风格和现在的嵌入式代码风格差异很大里面蕴含了大量对硬件时序、中断处理的经验。把老代码读懂的过程其实就是对系统理解加深的过程。7.4 学习资料怎么选就我自己的经验最正经的资料就是风河官方文档。VxWorks 6.8 对应的 Programmers Guide 系列包括 Kernel Programmers Guide、BSP Developers Guide、Application Programmers Guide这三本足够啃很久。网络上有不少论坛和旧帖子还在讨论 VxWorks 6.8 的问题虽然发布时间早但技术内容依然有效。最后分享一个我自己的习惯每次搭完这套环境我都会在同一台虚拟机里打一个干净快照再把 License 文件、安装包 ISO、常用脚本一并归档到一个固定目录。原因很简单老工具链太脆弱谁也不能保证哪次操作把系统搞坏。有了快照十分钟就能恢复到可用的基线状态这比任何教程都管用。另外我习惯给每个目标板卡单独建一个 BSP 备份目录把被改动过的 config.h、sysLib.c 等文件统一管理。VxWorks 6.8 的 BSP 改动很容易被覆盖而这个版本又没有特别好的版本管理工具配合手动备份成本不高但关键时刻能救命。环境搭建这件事做一次是踩坑做三次就变成熟练工了。
返回列表