在QEMU上运行VxWorks 7并部署CycloneDDS的教程
简介
本教程介绍如何基于 QEMU 运行 VxWorks 7 24.03,并在其上构建和运行 CycloneDDS 示例程序。整个流程已在 Ubuntu 22.04 系统上验证可行。
本教程参考自 eclipse-cyclonedds/cyclonedds issue #1909,该 issue 中一位开发者为 CycloneDDS 增加了对 VxWorks 24.03 的支持,并编写了构建与测试的教程。
整体流程概览
- 下载 VxWorks SDK 和 CycloneDDS 源码
- 在本机编译
idlc工具 - 激活 VxWorks 工具链环境,交叉编译 CycloneDDS
- 配置网络接口并安装 QEMU
- 启动 QEMU 虚拟机并运行示例程序
第一步:下载所需资源
1.1 下载 VxWorks SDK
访问 VxWorks SDK 下载页面:
1 | https://forums.windriver.com/t/vxworks-software-development-kit-sdk/43 |
在页面中找到并下载以下版本:
1 | VxWorks SDK for IA - QEMU (x86-64) 1.14 24.03 |
下载完成后,将压缩包解压到本地目录。解压后的目录结构如下(其中 sdkenv.sh 是后续激活 VxWorks 工具链的关键脚本):
1 | wrsdk-vxworks7-qemu/ |
1.2 下载 CycloneDDS 必需依赖
1 | sudo apt install git cmake gcc build-essential |
1.3 下载 CycloneDDS 源码
将 CycloneDDS 仓库克隆到本地,并切换到当前最新发行版11.0.0。
1 | git clone https://github.com/eclipse-cyclonedds/cyclonedds.git |
第二步:构建项目
本步骤分为两个阶段:首先在本机编译 idlc 工具,然后使用 VxWorks 的交叉编译工具链为目标平台构建 CycloneDDS 库和示例程序。
2.1 编译本机版本的 idlc
idlc 是 CycloneDDS 的 IDL 编译器,在构建示例程序时会被用到。将其编译并安装到本机的 /usr/local 目录下,以便后续交叉编译时能够正确引用。
1 | cd cyclonedds |
安装完成后,idlc 可执行文件会被放置在 /usr/local/bin/ 目录下。
2.2 为 VxWorks 交叉编译 CycloneDDS
2.2.1 激活 VxWorks 工具链环境
在开始交叉编译之前,必须先激活 VxWorks SDK 提供的工具链环境。sdkenv.sh 脚本会配置编译器路径等关键环境变量。
将下面命令中的 <path/to> 替换为你实际解压 SDK 的路径:
1 | source <path/to>/sdkenv.sh |
执行 source 命令后,当前 Shell 会话中将自动设置好 VxWorks 的交叉编译环境。
注意: 每次打开新的终端窗口时,都需要重新执行上述两条命令才能激活工具链。
2.2.2 使用 VxWorks 工具链构建 CycloneDDS
回到 cyclonedds 目录,新建一个用于 VxWorks 的构建目录,然后使用 VxWorks 提供的 toolchain.cmake 文件指定交叉编译工具链:
1 | cd cyclonedds |
参数说明:
-DCMAKE_TOOLCHAIN_FILE:指定交叉编译工具链配置文件,CMake 将使用 VxWorks 的编译器而非本机 GCC。-DBUILD_EXAMPLES=ON:同时构建示例程序,包括本教程后续用到的HelloworldPublisher和HelloworldSubscriber。-DCMAKE_PREFIX_PATH=/usr/local:告知 CMake 在/usr/local中查找idlc,即第 2.1 步安装的位置。
构建完成后,在 build_vx 目录下可以找到编译好的库文件(.so)和examples示例程序二进制文件。
第三步:准备运行环境
3.1 配置 tap0 虚拟网络接口
QEMU 使用 TAP 网络设备实现与宿主机之间的网络通信。需要在宿主机上创建并配置 tap0 接口。
首先安装 uml-utilities 工具包(提供 tunctl 命令):
1 | sudo apt install uml-utilities |
创建 tap0 网络接口,并将其分配给当前用户:
1 | sudo tunctl -u $USER -t tap0 |
为 tap0 接口配置 IP 地址并启用:
1 | sudo ip addr add 192.168.200.254/24 dev tap0 |
配置完成后,宿主机在 tap0 接口上的 IP 为 192.168.200.254,VxWorks 虚拟机将使用 192.168.200.1。
3.2 安装 QEMU
1 | sudo apt install qemu-system |
安装完成后,验证版本信息:
1 | qemu-system-x86_64 --version |
预期输出示例:
1 | QEMU emulator version 6.2.0 (Debian 1:6.2+dfsg-2ubuntu6.28) |
3.3 创建 CycloneDDS 配置文件
进入之前编译 VxWorks 版本的构建目录,创建 CycloneDDS 的 XML 配置文件。该文件用于指定 DDS 通信所使用的网络接口。
1 | cd build_vx |
此配置将 DDS 通信绑定到回环地址 127.0.0.1,使发布者和订阅者之间能在同一 QEMU 实例内完成通信。
第四步:启动 QEMU 虚拟机
以下命令将启动 QEMU,并以 USB 存储设备的形式将当前的 build_vx 目录挂载到虚拟机中。VxWorks 启动后即可从该”USB 盘”中读取编译好的程序文件。
在 build_vx 目录下执行:
1 | qemu-system-x86_64 -m 512M -kernel $WIND_SDK_HOME/vxsdk/bsps/*/vxWorks \ |
参数说明:
-m 512M:为虚拟机分配 512 MB 内存。-kernel:指定 VxWorks 内核镜像路径,由 SDK 提供。-net nic -net tap,ifname=tap0,...:使用 TAP 网络接口连接虚拟机与宿主机,禁用自动配置脚本。-display none -serial mon:stdio:不显示图形界面,将 VxWorks 串口输出重定向到当前终端,同时允许使用Ctrl-A X退出 QEMU。-append "bootline:...":传递 VxWorks 启动参数,其中:h=192.168.200.254:宿主机(host)IP 地址e=192.168.200.1:VxWorks 虚拟机的 IP 地址g=192.168.200.254:网关地址u=target pw=vxTarget:登录用户名和密码o=gei0:使用的网络接口名称
-usb -device usb-ehci,...:启用 USB 控制器,并将当前目录以 FAT32 格式挂载为 USB 存储设备,虚拟机内可通过/bd0a路径访问。
启动后,终端中会出现 VxWorks 的启动日志,待系统初始化完成后,会显示命令提示符。
提示: 要退出 QEMU,在终端中按
Ctrl-A,然后按X。
第五步:运行 HelloWorld 示例
示例程序演示了 DDS 发布/订阅通信模型:HelloworldPublisher 负责发布消息,HelloworldSubscriber 负责接收消息。二者需要同时运行才能完成通信演示。
5.1 在 QEMU 串口终端中运行发布者
QEMU 启动后,在当前终端(串口控制台)中进入 VxWorks 的 shell:
1 | -> cmd |
切换到 USB 存储设备中的 bin 目录,设置必要的环境变量,然后运行发布者程序:
1 | [vxWorks *]# cd /bd0a/bin/ |
环境变量说明:
LD_LIBRARY_PATH:指定 CycloneDDS 动态库(.so文件)所在的路径,确保程序能够找到依赖库。CYCLONEDDS_URI:指定 CycloneDDS 配置文件路径,程序启动时将读取此配置。
发布者启动后会等待订阅者加入,一旦发现订阅者即开始发送消息。
5.2 通过 telnet 连接 QEMU 并运行订阅者
在宿主机上另外打开一个终端窗口,通过 telnet 连接到 VxWorks 虚拟机:
1 | telnet 192.168.200.1 |
连接成功后,同样进入 VxWorks shell,设置环境变量,运行订阅者程序:
1 | -> cmd |
同时发布者所在的终端输出:
1 | === [Publisher] Writing : Message (1, Hello World) |
订阅者成功接收到发布者发送的消息,说明 DDS 通信已正常工作。
- 标题: 在QEMU上运行VxWorks 7并部署CycloneDDS的教程
- 作者: urlyy
- 创建于 : 2026-03-10 23:46:41
- 更新于 : 2026-03-12 11:43:59
- 链接: https://urlyy.github.io/2026/03/10/在QEMU上运行VxWorks 7并部署CycloneDDS的教程/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。