2、VxWorks开发环境搭建:Workbench安装、BSP配置、交叉编译工具链设置
好,咱们直接进入正题。开发环境搭建这事儿,说简单也简单,说复杂也复杂。我见过不少新手,卡在安装这一步就折腾了两三天。其实说白了,只要理清三个核心环节——Workbench、BSP、交叉编译链,后面就顺了。
2.1 Workbench安装:别小看这个IDE
Workbench是Wind River官方的IDE,基于Eclipse。嗯,没错,就是那个Eclipse。但别因为它基于Eclipse就轻视它,VxWorks的工程管理、调试、内核配置,全得靠它。
安装步骤其实不复杂:
- 从Wind River官网或内部镜像获取安装包。注意版本匹配,比如VxWorks 6.9配Workbench 3.x,VxWorks 7配Workbench 4.x。混着用会出问题,我踩过这个坑。
- 运行安装程序,选择完整安装。别选最小安装,否则后面缺组件,你哭都来不及。
- 安装路径不要带中文,不要有空格。这是老生常谈了,但总有人犯。
- 安装完成后,启动Workbench,设置工作空间。我个人习惯把工作空间放在SSD上,编译快不少。
2.2 BSP配置:板级支持包是灵魂
BSP,全称Board Support Package。说白了,就是让VxWorks认识你的硬件。CPU型号、内存大小、外设地址、中断控制器……全在这里定义。
BSP的目录结构长这样:
target/config/
├── all/ # 通用配置
├── pcPentium/ # x86架构示例
├── mv5105/ # 某款PowerPC板卡
└── yourBoard/ # 你自己的板卡
配置BSP时,我建议你重点关注这几个文件:
- config.h:内核裁剪和功能开关。比如要不要支持网络、文件系统、USB等。
- sysLib.c:系统时钟、内存映射、设备初始化。这里写错了,板子直接起不来。
- romInit.s:启动汇编代码。嗯,这里一般不动,除非你换CPU或改启动方式。
我在项目中遇到过一件事:某款ARM板卡,BSP里内存大小写错了,结果系统只认了一半内存。排查了两天才发现,原来是config.h里的宏定义少了个0。你说冤不冤?
make clean 再重新编译。否则旧的目标文件会缓存,你改了半天等于白改。我曾经因为这个浪费了一整个下午。
2.3 交叉编译工具链设置:桥接两个世界
交叉编译,就是在PC上编译出能在目标板(比如ARM、PowerPC)上运行的代码。工具链就是干这个的。
工具链的组成:
| 组件 | 作用 | 常见名称 |
|---|---|---|
| 编译器 | 把C/C++代码变成目标机器码 | arm-wrs-vxworks-gcc |
| 链接器 | 把多个目标文件合成可执行文件 | arm-wrs-vxworks-ld |
| 调试器 | 远程调试目标板上的程序 | arm-wrs-vxworks-gdb |
| 库管理器 | 打包静态库 | arm-wrs-vxworks-ar |
设置步骤:
- 安装工具链。Workbench安装包通常自带,路径在
workbench-version/host/下。 - 配置环境变量。把工具链的bin目录加到PATH里。比如:
export PATH=$PATH:/opt/WindRiver/workbench-3.3/host/x86-linux2/bin
export CC=arm-wrs-vxworks-gcc
export AR=arm-wrs-vxworks-ar
- 在Workbench里设置工程属性。右键工程 -> Properties -> C/C++ Build -> Settings,选择对应的工具链。
你想想看,如果工具链没设对,编译出来的程序在目标板上跑不了,那多尴尬。我见过有人拿x86的工具链去编译ARM的代码,结果链接阶段报一堆莫名其妙的错误。嗯,这种低级错误,咱们尽量避免。
2.4 验证环境:跑个Hello World试试
环境搭好了,怎么知道对不对?写个简单的测试程序,编译后下载到目标板运行。
#include <vxWorks.h>
#include <stdio.h>
STATUS helloWorld(void)
{
printf("Hello, VxWorks!\n");
return OK;
}
在Workbench里新建一个可下载的工程(Downloadable Kernel Module),把这段代码放进去。编译通过后,通过调试器下载到目标板。如果终端打印出"Hello, VxWorks!",恭喜你,环境搭建成功。
如果没打印?别急。先检查网络连接,再确认目标板IP和Workbench里的配置是否一致。我当年第一次调通这个,激动得差点把咖啡洒键盘上。
2.5 避坑指南
- 我曾经因为Workbench和VxWorks版本不匹配,折腾了三天。后来发现是Workbench 3.0配了VxWorks 6.8的BSP,兼容性有问题。换成3.3版本就好了。
- 我曾经在BSP里忘了使能串口驱动,结果printf输出全丢了。排查时还以为代码有问题,其实是硬件初始化没做。
- 我曾经交叉编译工具链的路径写错了,导致编译出来的程序在目标板上段错误。后来用
file命令一看,发现是x86的ELF文件,根本不是ARM的。
嗯,这些坑你大概率也会遇到。提前知道,能省不少时间。
好了,环境搭建这部分就讲到这里。下一章咱们聊聊VxWorks的启动流程,从ROM启动到内核初始化,每一步都拆开来看。到时候你会发现,很多故障其实就藏在启动过程中。