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 完成驱动挂载、网络协议栈初始化、文件系统挂载,最后启动应用任务。
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 中设置启动延时,给串口留出进入命令行的窗口,从而避免系统一上电就冲过引导阶段。
掌握这条启动链路和对应的观察手段后,绝大多数早期故障都能在几分钟内定位到具体阶段,而不是停留在"系统起不来"的模糊判断上。