4. 添加网络协议栈
任务目标
在VxWorks7 BSP工程中集成网络协议栈(INCLUDE_END),使目标机启动后具备以太网接口,并通过命令行配置静态IP地址,最终实现主机与目标机之间的ping连通。
环境与依赖
- VxWorks 7(本文以SR0640及以上版本为例)
- 已创建的VxWorks Image工程(VIP)及对应的BSP工程
- 目标机以太网物理接口(如Intel e1000、Freescale TSEC等,需BSP已支持对应驱动)
- 主机与目标机处于同一网段,使用网线直连或经交换机连接
实现步骤
在VIP的配置文件(vxWorks.cdf或通过Wind River Workbench的组件配置界面)中启用以下网络组件,然后重新编译生成VxWorks镜像:
INCLUDE_END // 网络协议栈基础(含TCP/IP)
INCLUDE_E1000 // 以太网驱动(以e1000为例,按实际BSP替换)
INCLUDE_IP // IPv4协议
INCLUDE_ICMP // ICMP协议(ping依赖)
INCLUDE_NETWORK // 网络初始化
INCLUDE_ARP // ARP协议
INCLUDE_IP_IFCONFIG // ifconfig命令支持
INCLUDE_PING // ping命令支持
若使用命令行构建,可在VIP目录下执行:
vxprj vip build -add INCLUDE_END -add INCLUDE_E1000 -add INCLUDE_IP -add INCLUDE_ICMP -add INCLUDE_NETWORK -add INCLUDE_ARP -add INCLUDE_IP_IFCONFIG -add INCLUDE_PING
关键完整代码
网络协议栈的集成主要通过VIP配置完成,无需编写C代码。以下为启动后配置IP并验证连通性的完整命令序列(在VxWorks shell中执行):
// 1. 查看网络接口状态(确认驱动已加载)
ifconfig
// 2. 配置静态IP地址(以192.168.1.100/24为例,按实际网络修改)
ifconfig e1000_0 inet 192.168.1.100 netmask 255.255.255.0 up
// 3. 验证接口配置
ifconfig e1000_0
// 4. 测试回环接口(验证协议栈自身正常)
ping 127.0.0.1
// 5. 从目标机ping主机(主机IP需在同一网段,如192.168.1.10)
ping 192.168.1.10
若需在启动时自动配置IP,可在VIP的configNet.h或启动脚本(bootApp.c)中添加以下初始化代码:
#include <vxWorks.h>
#include <hostLib.h>
#include <inetLib.h>
#include <ifLib.h>
void netInit(void) {
char ifname[] = "e1000_0";
struct in_addr inetAddr, netMask;
inet_aton("192.168.1.100", &inetAddr);
inet_aton("255.255.255.0", &netMask);
ifAddrSet(ifname, &inetAddr, &netMask);
ifUp(ifname);
}
在启动任务中调用netInit()即可实现开机自动配置。
运行与验证
- 编译VIP生成VxWorks镜像,通过FTP或串口下载到目标机启动。
- 在shell中执行
ifconfig,确认出现e1000_0接口且状态为UP。 - 执行
ping 127.0.0.1,预期输出类似:icmp_seq=0. time=0.1 ms,表示协议栈工作正常。 - 在主机命令行执行
ping 192.168.1.100,若收到回复(Reply from 192.168.1.100: bytes=32 time<1ms TTL=64),则目标机网络配置成功。 - 若ping不通,依次检查:网线连接、目标机与主机IP是否同网段、防火墙是否拦截ICMP、驱动是否加载(
ifconfig无接口时检查BSP驱动配置)。
通过条件:主机能够持续ping通目标机IP(丢包率0%),且目标机也能ping通主机IP,即视为本案例验证通过。
常见问题
- ifconfig无接口显示:确认BSP中已包含对应网卡驱动(如INCLUDE_E1000),且驱动与物理芯片匹配。
- ping不通但接口UP:检查IP/掩码配置是否正确、网线是否完好、主机防火墙是否允许ICMP回显。
- 启动时自动配置失败:确认
netInit()在网络协议栈初始化完成后调用(可在usrNetInit之后挂接)。