在QEMU上运行VxWorks 7并部署CycloneDDS的教程

urlyy

简介

本教程介绍如何基于 QEMU 运行 VxWorks 7 24.03,并在其上构建和运行 CycloneDDS 示例程序。整个流程已在 Ubuntu 22.04 系统上验证可行。

本教程参考自 eclipse-cyclonedds/cyclonedds issue #1909,该 issue 中一位开发者为 CycloneDDS 增加了对 VxWorks 24.03 的支持,并编写了构建与测试的教程。


整体流程概览

  1. 下载 VxWorks SDK 和 CycloneDDS 源码
  2. 在本机编译 idlc 工具
  3. 激活 VxWorks 工具链环境,交叉编译 CycloneDDS
  4. 配置网络接口并安装 QEMU
  5. 启动 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
2
3
4
5
6
7
wrsdk-vxworks7-qemu/
├── sdkenv.sh # 工具链环境激活脚本
├── vxsdk/
│ └── bsps/
│ └── */
│ └── vxWorks # QEMU 启动所需的内核镜像
└── ...

1.2 下载 CycloneDDS 必需依赖

1
sudo apt install git cmake gcc build-essential

1.3 下载 CycloneDDS 源码

将 CycloneDDS 仓库克隆到本地,并切换到当前最新发行版11.0.0

1
2
3
4
5
git clone https://github.com/eclipse-cyclonedds/cyclonedds.git

cd cyclonedds

git checkout tags/11.0.0

第二步:构建项目

本步骤分为两个阶段:首先在本机编译 idlc 工具,然后使用 VxWorks 的交叉编译工具链为目标平台构建 CycloneDDS 库和示例程序。

2.1 编译本机版本的 idlc

idlc 是 CycloneDDS 的 IDL 编译器,在构建示例程序时会被用到。将其编译并安装到本机的 /usr/local 目录下,以便后续交叉编译时能够正确引用。

1
2
3
4
5
cd cyclonedds
mkdir build
cd build
cmake ..
sudo make install

安装完成后,idlc 可执行文件会被放置在 /usr/local/bin/ 目录下。

2.2 为 VxWorks 交叉编译 CycloneDDS

2.2.1 激活 VxWorks 工具链环境

在开始交叉编译之前,必须先激活 VxWorks SDK 提供的工具链环境。sdkenv.sh 脚本会配置编译器路径等关键环境变量。

将下面命令中的 <path/to> 替换为你实际解压 SDK 的路径:

1
2
source <path/to>/sdkenv.sh
export WIND_CC_SYSROOT=$WIND_SDK_CC_SYSROOT

执行 source 命令后,当前 Shell 会话中将自动设置好 VxWorks 的交叉编译环境。

注意: 每次打开新的终端窗口时,都需要重新执行上述两条命令才能激活工具链。

2.2.2 使用 VxWorks 工具链构建 CycloneDDS

回到 cyclonedds 目录,新建一个用于 VxWorks 的构建目录,然后使用 VxWorks 提供的 toolchain.cmake 文件指定交叉编译工具链:

1
2
3
4
5
6
7
8
cd cyclonedds
mkdir build_vx
cd build_vx

cmake .. -DCMAKE_TOOLCHAIN_FILE=$WIND_SDK_CC_SYSROOT/mk/toolchain.cmake \
-DBUILD_EXAMPLES=ON -DCMAKE_PREFIX_PATH=/usr/local

cmake --build .

参数说明:

  • -DCMAKE_TOOLCHAIN_FILE:指定交叉编译工具链配置文件,CMake 将使用 VxWorks 的编译器而非本机 GCC。
  • -DBUILD_EXAMPLES=ON:同时构建示例程序,包括本教程后续用到的 HelloworldPublisherHelloworldSubscriber
  • -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
2
sudo ip addr add 192.168.200.254/24 dev tap0
sudo ip link set tap0 up

配置完成后,宿主机在 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
2
QEMU emulator version 6.2.0 (Debian 1:6.2+dfsg-2ubuntu6.28)
Copyright (c) 2003-2021 Fabrice Bellard and the QEMU Project developers

3.3 创建 CycloneDDS 配置文件

进入之前编译 VxWorks 版本的构建目录,创建 CycloneDDS 的 XML 配置文件。该文件用于指定 DDS 通信所使用的网络接口。

1
2
3
4
5
6
7
8
9
10
11
12
13
cd build_vx

cat <<EOF > cyclonedds.xml
<CycloneDDS>
<Domain id="any">
<General>
<Interfaces>
<NetworkInterface address="127.0.0.1"></NetworkInterface>
</Interfaces>
</General>
</Domain>
</CycloneDDS>
EOF

此配置将 DDS 通信绑定到回环地址 127.0.0.1,使发布者和订阅者之间能在同一 QEMU 实例内完成通信。


第四步:启动 QEMU 虚拟机

以下命令将启动 QEMU,并以 USB 存储设备的形式将当前的 build_vx 目录挂载到虚拟机中。VxWorks 启动后即可从该”USB 盘”中读取编译好的程序文件。

build_vx 目录下执行:

1
2
3
4
qemu-system-x86_64 -m 512M -kernel $WIND_SDK_HOME/vxsdk/bsps/*/vxWorks \
-net nic -net tap,ifname=tap0,script=no,downscript=no -display none -serial mon:stdio \
-append "bootline:fs(0,0)host:vxWorks h=192.168.200.254 e=192.168.200.1 g=192.168.200.254 u=target pw=vxTarget o=gei0" \
-usb -device usb-ehci,id=ehci -device usb-storage,drive=fat32 -drive file=fat:rw:`pwd`,id=fat32,format=raw,if=none

参数说明:

  • -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
2
3
4
5
[vxWorks *]# cd /bd0a/bin/
[vxWorks *]# set env LD_LIBRARY_PATH="/bd0a/lib"
[vxWorks *]# set env CYCLONEDDS_URI="/bd0a/cyclonedds.xml"
[vxWorks *]# ./HelloworldPublisher
=== [Publisher] Waiting for a reader to be discovered ...

环境变量说明:

  • LD_LIBRARY_PATH:指定 CycloneDDS 动态库(.so 文件)所在的路径,确保程序能够找到依赖库。
  • CYCLONEDDS_URI:指定 CycloneDDS 配置文件路径,程序启动时将读取此配置。

发布者启动后会等待订阅者加入,一旦发现订阅者即开始发送消息。

5.2 通过 telnet 连接 QEMU 并运行订阅者

在宿主机上另外打开一个终端窗口,通过 telnet 连接到 VxWorks 虚拟机:

1
telnet 192.168.200.1

连接成功后,同样进入 VxWorks shell,设置环境变量,运行订阅者程序:

1
2
3
4
5
6
7
-> cmd
[vxWorks *]# cd /bd0a/bin/
[vxWorks *]# set env LD_LIBRARY_PATH="/bd0a/lib"
[vxWorks *]# set env CYCLONEDDS_URI="/bd0a/cyclonedds.xml"
[vxWorks *]# ./HelloworldSubscriber
=== [Subscriber] Waiting for a sample ...
=== [Subscriber] Received : Message (1, Hello World)

同时发布者所在的终端输出:

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 进行许可。
评论