4. VxWorks启动流程与镜像构建

VxWorks 的启动过程本质上是一条“从上电到应用运行”的链:CPU 复位后先执行固化在 ROM 中的引导代码,再由引导程序把真正的 VxWorks 映像装载到内存并跳转执行。理解这条链的关键,是分清 BootROM 与 VxWorks 映像 两类二进制各自的职责,以及它们如何通过启动参数(boot line)衔接起来。

一、BootROM 与 VxWorks 映像的分工

BootROM 是“引导用”的映像,通常烧写在 Flash 或 EPROM 的起始地址,上电后由 CPU 直接取指执行。它内部包含最小化的内核、串口/网口驱动、网络协议栈(如 TFTP、BOOTP/DHCP)以及一个引导命令行。BootROM 的目标不是跑应用,而是把目标机“拉起来”,具备下载能力。

VxWorks 映像是“运行用”的映像,包含完整内核、组件与应用。按链接与装载方式,常见类型有:

  • vxWorks(可加载型):未压缩、未定位,由 BootROM 通过 TFTP 下载到 RAM 后运行,适合开发调试阶段,改一次编一次、下载即跑。
  • vxWorks_rom(ROM 型):把 VxWorks 与引导代码链接成一个整体,烧入 ROM/Flash,上电后从 ROM 中执行(或搬运到 RAM 执行),适合量产。
  • vxWorks_romCompress(压缩 ROM 型):在 ROM 型基础上压缩,节省 Flash 空间,启动时先解压到 RAM。
  • vxWorks.st(驻留 ROM 型):带符号表的 ROM 映像,便于现场调试。

选择原则很直接:开发阶段用可加载型 + 网络启动,量产阶段用 ROM 型或压缩 ROM 型 + 本地启动。

VxWorks 启动链与映像装载路径 上电复位 CPU 取指 BootROM 最小内核 + 网口/串口驱动 TFTP / BOOTP 客户端 启动参数 boot line 设备、主机、路径、文件名 如 fei(0,0)host:/vxWorks 启动方式 网络 / 本地 网络启动(开发调试) BootROM 通过 TFTP 从主机下载 vxWorks 到 RAM 并跳转执行 改代码 → 重编 → 下载即跑 本地启动(量产部署) vxWorks_rom 烧入 Flash 上电直接从 Flash 执行/搬运 无需主机,独立运行 VxWorks 内核启动完成 进入 usrAppInit / 应用入口,系统就绪

二、启动参数 boot line 的构成

BootROM 启动后会打印引导菜单,其中最关键的是 boot line。它决定了“从哪里、用什么协议、取哪个文件”。典型格式为:

boot device          : fei
unit number          : 0
processor number     : 0
host name            : 192.168.1.100
file name            : /vxworks/vxWorks
inet on ethernet (e) : 192.168.1.50
host inet (h)        : 192.168.1.100
gateway inet (g)     : 192.168.1.1
user (u)             : target
ftp password (pw)    : target
flags (f)            : 0x0
target name (tn)     : vxTarget

其中 fei 表示目标机第一块网卡,host inet 是 TFTP 服务器地址,inet on ethernet 是目标机自身 IP,file name 是待下载的 VxWorks 映像路径。若使用串口下载,则把 boot device 改为 tsfs 或对应串口设备。

boot line 中的 IP 必须与主机在同一网段,否则 TFTP 请求无法到达。调试时先用 ping 确认目标机与主机连通,再执行 @ 或 boot 命令。

三、网络启动实战流程

以开发板 + 主机(Linux/Windows 均可)为例,网络启动的完整闭环如下:

  1. 主机侧启动 TFTP 服务,把编译生成的 vxWorks 放入 TFTP 根目录,例如 /tftpboot/vxWorks。
  2. 目标机上电,进入 BootROM 命令行,用 c 命令修改 boot line,把 host inet 指向主机 IP,file name 指向映像路径。
  3. 执行 @ 触发下载。BootROM 通过 TFTP 读取映像,串口会打印类似 Loading... 1234567 + 89012 bytes 的进度。
  4. 下载完成后 BootROM 跳转到映像入口,内核开始初始化,最终打印 usrAppInit 或应用启动日志。

判断成功的依据:串口出现内核版本号、任务列表可查询(i 命令)、网络可 ping 通。若卡在 Loading... 不动,优先检查 TFTP 服务是否开启、防火墙是否放行 69/UDP、文件名大小写是否匹配。

四、本地启动与镜像烧写

量产时不再依赖主机,需要把 VxWorks 映像固化到目标机 Flash。常见做法是:先用网络启动把 vxWorks_rom 下载到 RAM,再通过 Flash 编程工具(如 flashProgram 或厂商提供的烧写命令)写入 Flash 起始地址。烧写完成后把启动方式切回本地,重新上电验证。

本地启动的验证要点:断开网线后仍能正常启动;串口日志中不再出现 TFTP 下载过程;version 命令显示的映像类型与烧写类型一致。若上电后无任何输出,通常是 Flash 起始地址配置错误或映像未正确链接到该地址。

烧写前务必备份原 Flash 内容,并确认目标地址不与 BootROM 自身占用的区域重叠。一旦覆盖 BootROM,目标机将无法再次进入引导菜单,只能通过 JTAG 等硬件方式恢复。

五、两种启动方式的对比与选用

对比项网络启动本地启动
映像类型vxWorks(可加载型)vxWorks_rom / romCompress
依赖主机需要 TFTP 服务器不需要
迭代速度快,改完即下载慢,需重新烧写
适用阶段开发、调试量产、现场部署
典型故障网络不通、TFTP 超时Flash 地址错、映像损坏

实际项目中常采用“双轨”策略:开发阶段保留 BootROM + 网络启动,方便快速迭代;量产阶段把最终验证过的 vxWorks_rom 烧入 Flash,并保留一个可回退的 BootROM 分区。这样既保证开发效率,又保证现场部署的独立性。

掌握启动链的关键,是把 BootROM、boot line、映像类型三者对应起来:BootROM 决定“能不能引导”,boot line 决定“从哪里引导”,映像类型决定“引导后怎么运行”。三者配置一致,启动才能顺利走到应用入口。