3. VxWorks启动流程与早期故障定位

VxWorks 的启动过程是一条从硬件复位到应用任务运行的严格链路:CPU 复位后先执行固化在 ROM 中的引导代码,再由 BootROM 加载并跳转到 VxWorks 内核映像,内核完成初始化后启动 usrRoot,最终由应用入口接管系统。这条链路上任何一环出错,系统都会停在某个阶段,表现为串口无输出、反复重启、卡在某个打印点或网络引导超时。早期故障定位的核心思路,就是先判断"系统停在哪一环",再针对该环节的输入、参数和介质逐项排查。

启动链路的四个阶段

以常见的 PowerPC 或 ARM 目标板为例,上电后的执行顺序可以拆成四个阶段。第一阶段是 BootROM 阶段:CPU 从复位向量取指,执行 romInit,完成最基本的 CPU 初始化(关闭看门狗、设置时钟、初始化内存控制器和栈),随后跳转到 romStart。第二阶段是 引导参数与介质访问阶段:BootROM 解析启动参数(boot line),决定从本地 Flash、ATA、TFTP 还是串口加载内核。第三阶段是 内核加载与解压阶段:把 VxWorks 映像搬到 RAM 的加载地址,若是压缩映像则先解压,然后跳转到内核入口。第四阶段是 内核初始化与 usrRoot 阶段:内核建立中断、时钟、内存池、任务调度,随后调用 usrRoot 完成驱动挂载、网络协议栈初始化、文件系统挂载,最后启动应用任务。

VxWorks 启动链路与早期故障定位点 ① BootROM romInit / romStart CPU·内存·栈初始化 ② 引导参数/介质 boot line 解析 Flash / TFTP / 串口 ③ 内核加载 搬移 / 解压到 RAM 跳转内核入口 ④ 内核初始化 usrRoot 驱动·网络·应用 典型故障现象 串口无任何输出 时钟/内存控制器错 TFTP 超时 / 反复重试 boot line 参数错 校验和失败 / 解压错 加载地址冲突 卡在 usrRoot 驱动挂载失败 串口 / 网络调试手段 串口侧 · 115200-8N1,确认 TX/RX/GND 与电平 · 观察 BootROM 版本号与 boot line 回显 · 用 Ctrl+C / 启动延时进入 BootROM 命令行 · 逐段打印定位最后成功点 网络侧 · 主机 TFTP 服务目录与权限 · 目标板 IP / 网关 / 子网掩码 · ping 与 tftp get 分段验证 · 抓包确认 ARP / TFTP 交互

BootROM 阶段:最先要确认的三件事

BootROM 阶段故障最典型的表现是"串口完全无输出"。此时不要急于怀疑内核,应先确认三件事:一是串口物理链路,包括线序(TX/RX 是否交叉)、电平(RS-232 还是 TTL)、波特率(常见 115200-8N1,部分老板为 9600);二是时钟与复位,晶振未起振或复位芯片持续拉低会导致 CPU 不取指;三是内存控制器配置,若 SDRAM 参数与硬件不匹配,romStart 在搬运代码时会取到错误数据,表现为打印乱码或直接死机。一个实用的判断方法是:在 romInit 之后、内存初始化之前插入一段"点亮 LED 或输出单字符"的代码,若能看到该字符,说明 CPU 与串口已工作,问题在内存;若看不到,问题在更早的时钟或串口本身。

引导参数:boot line 的字段含义

BootROM 通过 boot line 决定"从哪里、以什么方式加载内核"。一条典型的网络引导参数如下:

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

排查时逐字段核对:host name 必须是 TFTP 服务器地址且可达;file name 路径要与服务器实际目录一致;inet on ethernet 中的 IP 与子网掩码要与目标板所在网段匹配;gateway 在跨网段时才需要。若参数正确但 TFTP 仍超时,用主机上的 tftp 客户端手动 get 同一文件,可快速区分是服务器问题还是目标板网络驱动问题。

内核加载与初始化:从校验和到 usrRoot

内核加载阶段最常见的错误是校验和失败和解压错误。VxWorks 映像在制作时会附带校验信息,BootROM 加载后会先校验再跳转。若校验失败,通常意味着映像在传输或存储过程中损坏,应重新生成或重新下载。若使用压缩映像,解压失败往往与加载地址重叠有关——例如内核加载地址与 BootROM 自身占用的 RAM 区间冲突,导致解压时覆盖了正在执行的代码。此时需要检查链接地址与 LOAD_ADDR 配置。

进入内核初始化后,系统会依次打印版本信息、内存大小、挂载设备等。若卡在 usrRoot 阶段,重点看最后一条成功打印:它之后调用的驱动或服务就是嫌疑对象。常见原因包括网络驱动 PHY 未识别、文件系统介质未就绪、以及应用任务栈溢出。此时可临时在 usrRoot 中增加打印点,或使用 usrRoot 的调试版本逐步缩小范围。

定位早期故障时,建议先建立"最后成功打印点"的概念:系统停在哪里,问题就在该打印点之后、下一个预期打印点之前的那段代码里。这比盲目怀疑整个启动流程高效得多。

串口与网络调试的配合使用

串口是 BootROM 阶段唯一可靠的观察窗口,网络则是内核加载阶段的主要通道。实际排查中,两者应配合使用:先用串口确认 BootROM 能正常启动并进入命令行,再通过 boot 命令触发网络加载,同时观察串口打印和主机抓包。若串口显示 TFTP 请求已发出但无响应,问题在服务器或网络;若串口显示收到数据但校验失败,问题在传输完整性或映像本身。对于反复重启的系统,可在 BootROM 中设置启动延时,给串口留出进入命令行的窗口,从而避免系统一上电就冲过引导阶段。

掌握这条启动链路和对应的观察手段后,绝大多数早期故障都能在几分钟内定位到具体阶段,而不是停留在"系统起不来"的模糊判断上。