2. VxWorks网络开发环境搭建

在上一节中我们已经明确了VxWorks网络开发所依赖的硬件与软件前提。本节要把这些前提转化为一个真正可编译、可下载、可运行的最小网络工程。整个过程围绕四个动作展开:在Workbench中创建工程、按需裁剪网络组件、打通主机与目标机之间的通信链路、最后用回环测试确认协议栈已经正常工作。这四个动作不是孤立的,前一步的配置结果会直接影响后一步能否成功,因此建议按顺序推进,每完成一步都做一次确认。

一、Workbench工程创建

启动Workbench后,选择 File → New → VxWorks Image Project,进入镜像工程创建向导。第一步填写工程名,例如 net_loopback_demo,并指定工程存放路径。第二步选择目标机体系结构,常见选项包括 ARMARCH7、PPC32、x86_64 等,必须与实际目标板CPU一致,否则后续下载会失败。第三步选择BSP,例如基于Zynq的板卡可选 zynq_arm 或厂商提供的定制BSP。第四步选择镜像类型,调试阶段建议选 VIP(VxWorks Image Project)并勾选 Kernel Image,便于后续增量修改。

工程创建完成后,Workbench会在工程目录下生成 vxworks 镜像工程结构,其中 kernel 配置、configlette 组件、usr 应用目录是后续最常修改的位置。此时先不要急于编译,应先在 Project Explorer 中确认BSP路径、编译器工具链路径、目标机连接配置三项是否已正确关联。

二、网络组件配置

VxWorks的网络能力由组件化配置决定,默认镜像往往只包含最小内核,网络协议栈需要手动加入。在Workbench中双击工程的 Kernel Configuration,打开组件树,依次展开 Network Components。需要勾选的核心组件包括:

  • INCLUDE_NETWORK:网络子系统总开关;
  • INCLUDE_BSD_SOCKET:BSD套接字接口,回环测试将直接使用;
  • INCLUDE_IPNET 或 INCLUDE_IPCOM:IPv4协议栈,二者选其一,需与BSP驱动匹配;
  • INCLUDE_LOOPBACK:回环接口 lo0,这是本节测试的关键;
  • INCLUDE_NETDEV 及对应网卡驱动,例如 INCLUDE_TEMAC、INCLUDE_E1000。

组件勾选后,还需要在 Network Configuration 中设置接口参数。以回环测试为目标时,至少要为 lo0 配置地址 127.0.0.1、掩码 255.0.0.0。若同时接入物理网口,可给 motetsec0 或 gei0 配置一个与主机同网段的地址,例如主机 192.168.1.100,目标机 192.168.1.200,掩码 255.255.255.0。配置完成后保存,Workbench会自动更新 config.h 与 configAll.h 中的宏定义。

组件配置最容易出错的地方是“勾选了协议栈但没勾选驱动”,或者“勾选了驱动但没在 Network Configuration 中绑定接口”。编译前建议在组件树中搜索 INCLUDE_ 关键字,确认网络相关宏都已生效。

三、目标机与主机通信链路建立

目标机与主机的通信链路通常有三种:串口、以太网、JTAG。调试阶段最常用的是“串口+以太网”组合:串口用于输出启动日志和进入BootROM命令行,以太网用于下载镜像和后续网络通信。以串口为例,主机端使用USB转串口线连接目标板调试口,在Workbench中打开 Target Manager,新建连接,选择 Serial,设置波特率 115200、数据位 8、停止位 1、无校验。连接成功后应能看到目标板上电后的BootROM输出。

若使用以太网下载,需要在BootROM中配置目标机IP、主机IP和网关。典型命令如下:

-> ifconfig motetsec0 192.168.1.200 netmask 255.255.255.0 up
-> hostAdd "host", 192.168.1.100
-> ping "192.168.1.100"

当 ping 返回类似 0 packets lost 的信息时,说明链路已通。此时可在Workbench中通过 Download 将编译好的 vxWorks 镜像下载到目标机,或通过TFTP方式由BootROM自动加载。下载完成后目标机进入VxWorks Shell,提示符通常为 ->。

四、第一个网络回环测试

回环测试的目的是在不依赖外部网络的情况下,验证协议栈、套接字接口和回环接口是否正常工作。VxWorks Shell中可直接使用 ping 命令测试回环地址:

-> ping "127.0.0.1"
PING 127.0.0.1 (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0 ms
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0 ms
----127.0.0.1 PING Statistics----
2 packets transmitted, 2 packets received, 0% packet loss

若 ping 不通,优先检查 INCLUDE_LOOPBACK 是否已加入、lo0 是否已配置地址、协议栈是否已初始化。更进一步的验证是编写一个最小套接字程序,在目标机上创建TCP服务端并自连自收。示例代码如下:

#include <stdio.h>
#include <string.h>
#include <sockLib.h>
#include <inetLib.h>

void loopbackTest(void)
{
    int sfd, cfd, n;
    struct sockaddr_in addr;
    char buf[64];

    sfd = socket(AF_INET, SOCK_STREAM, 0);
    memset(&addr, 0, sizeof(addr));
    addr.sin_family = AF_INET;
    addr.sin_port = htons(8000);
    addr.sin_addr.s_addr = inet_addr("127.0.0.1");

    bind(sfd, (struct sockaddr *)&addr, sizeof(addr));
    listen(sfd, 1);

    cfd = accept(sfd, NULL, NULL);
    n = read(cfd, buf, sizeof(buf));
    printf("recv %d bytes: %s\n", n, buf);

    close(cfd);
    close(sfd);
}

在Shell中先执行 loopbackTest 启动服务端,再从主机或目标机另一任务用 telnet 127.0.0.1 8000 发送数据,若目标机打印出接收到的字节数和内容,说明从套接字创建、绑定、监听、接收到关闭的完整链路均已打通。至此,一个可运行的最小网络工程已经建立,后续章节可以在此基础上加入UDP、多播、自定义协议等更复杂的通信逻辑。

VxWorks 网络开发环境搭建与回环测试链路 主机(Host) Workbench 工程 Target Manager TFTP / 串口终端 目标机(Target) VxWorks 镜像 网络协议栈 lo0 / 物理网口 串口 115200 / 以太网 192.168.1.x 启动日志 / ping 响应 工程配置与回环验证关键路径 ① 创建 VIP 工程 选 BSP / 架构 ② 勾选网络组件 SOCKET / IPNET / LOOPBACK ③ 配置接口地址 lo0=127.0.0.1 ④ 下载并运行 ping 127.0.0.1 判断依据:0% packet loss 且套接字收发成功 否则回查组件勾选与接口绑定

需要强调的是,回环测试通过只代表协议栈和套接字接口可用,并不代表物理网口驱动已经正常。若后续要接入真实网络,还应把 lo0 之外的物理接口也纳入测试,例如用 ping 主机地址、用 ifconfig 查看接口状态、用 netstat -rn 检查路由表。只有回环与物理链路都验证通过,才算真正完成了本节所要求的网络开发环境搭建。