在调试板卡程序时,有些模块能够正常编译,放到目标机上却没有顺利运行,终端只留下几行报错信息。RTP是VxWorks中的实时进程,程序运行在用户空间,拥有相对独立的运行环境,不能直接访问没有映射到进程中的资源。它和运行在内核空间的DKM不是同一种程序,创建方式、输出文件以及排查方向都有区别。
一、VxWorks RTP怎么创建
创建RTP时,需要把开发环境、工程类型、编译产物和运行方式对应起来。刚开始接触VxWorks时,容易把RTP和DKM混在一起,结果文件虽然生成了,放到目标端却无法按照预期启动。
1、加载SDK开发环境
Linux进入SDK根目录后执行:source toolkit/wind_sdk_env.linux
Windows进入SDK根目录后执行:toolkitwind_sdk_env.bat
这一步会更新当前终端中的环境变量,让编译工具、头文件和库文件路径能够被识别。每次重新打开终端都要重新加载环境,不要直接沿用上一次构建时的状态。官方SDK文档也将加载环境文件列为命令行开发前的准备步骤。
2、建立RTP工程
在Visual Studio Code中打开工程目录,依次点击【File】→【Open Folder】,在【Explorer】窗口中右键点击工作区,选择【New VxWorks Real Time Process】,输入工程名称。
创建完成后,先确认工程类型显示为RTP,不要误选【New VxWorks Downloadable Kernel Module】。RTP用于生成用户空间进程,DKM则运行在内核空间,两种项目不能直接互换。
3、编译生成VXE文件
进入RTP源码目录,根据当前SDK提供的编译工具执行构建。使用Makefile时可以直接执行:make
需要快速验证单个源文件时,可以执行:$CC rtp.c-o rtp.vxe-static
部分SDK示例也会使用:wr-cc-rtp rtp.c-static-o rtp.vxe
编译完成后检查输出文件,RTP程序应生成.vxe文件。使用WRDBG调试器时,RTP文件需要保留.vxe扩展名,DKM文件通常使用.out扩展名。扩展名写错以后,调试器可能无法按正确类型加载程序。
4、连接目标端并运行
打开WRDBG命令行工具,连接已经启动的目标机或虚拟机,然后执行:file RTP文件路径
加载完成后执行:run
需要在调试器中直接创建进程时,也可以使用:rtp create-w工作目录RTP文件路径参数
其中-w用于指定RTP工作目录,后面可以继续添加程序启动参数。RTP也可以通过目标端文件系统加载,常见位置包括RomFS、NFS和SD卡。
二、VxWorks RTP启动失败怎么排查
RTP无法启动时,不要反复点击运行按钮。先看进程是在加载阶段失败,还是已经建立进程但进入程序后退出。两个阶段对应的检查内容不同,混在一起排查很容易绕远。
1、检查目标端连接状态
在WRDBG中重新连接目标端,确认调试连接没有中断,然后执行:info rtps
这个命令用于查看当前正在运行的RTP。列表中没有对应进程,说明程序没有完成创建;已经出现进程但很快消失,需要继续查看程序入口和运行日志。WRDBG还提供rtp kill命令,用于清理没有正常退出的RTP。
2、核对文件类型和处理器架构
检查启动文件是否为.vxe,不要把DKM生成的.out文件当成RTP运行。继续确认当前RTP使用的SDK、处理器架构、VSB配置和VIP配置是否与目标端系统一致。
实际开发中,经常会出现旧工程仍然引用另一套SDK的情况。文件名称看起来没有变化,内部使用的架构和库版本已经不同。遇到加载报错时,清理旧产物,重新加载环境文件,再完整构建一次。
3、检查程序依赖和文件路径
确认目标端能够访问RTP文件,文件路径没有写错,挂载目录已经可用。通过NFS、RomFS或SD卡部署程序时,可以先在目标端列出目录内容,确认文件确实存在。
RTP运行在自己的用户空间环境中,不能直接访问没有映射进来的资源。程序依赖共享库、配置文件或外部数据文件时,也要核对这些文件是否已经放入目标端可访问的位置。
4、查看启动日志中的第一条错误
建立WRDBG连接时,给target connect配置日志目录,保留标准输出、标准错误和调试日志。程序启动失败后,优先查看第一条异常,不要只盯着后面连续出现的报错。
报错信息涉及文件找不到时,检查部署目录;涉及符号无法解析时,检查依赖库和构建配置;程序创建后立即退出时,检查入口函数、参数传递和初始化流程。WRDBG连接参数中的-logdir用于保存相关日志。
5、确认工作目录和启动参数
使用rtp create启动程序时,重新核对-w后面的工作目录以及传入参数。程序启动后需要读取相对路径文件,工作目录填错会让配置文件、数据文件或日志目录失去对应关系。
可以先减少启动参数,只保留能够验证程序入口的内容。基础运行恢复后,再逐项补回参数,定位是哪一项配置引发异常。
三、VxWorks RTP运行前还需要检查哪些配置
RTP能够启动并不代表运行环境已经整理妥当。程序数量增加以后,建议把构建、部署和日志路径固定下来,减少重复排查。
1、固定SDK与目标系统对应关系
在工程说明中记录SDK目录、目标处理器架构、VSB名称和VIP名称。更换板卡镜像或开发环境后,重新生成RTP,不要直接复制旧版本产物继续使用。
2、整理部署目录
按照程序、共享库、配置文件和日志文件划分目录。使用NFS调试时,先确认目标端挂载正常;转为RomFS或SD卡部署后,再核对路径是否发生变化。路径整理清楚,程序退出时更容易找到问题出在哪。
3、保留基础验证程序
工程中保留一个只打印启动信息并正常退出的小型RTP。目标系统更新后,先运行这个验证程序,再加载业务模块。基础RTP无法启动时,排查重点应放在SDK环境、目标端连接和系统镜像,不必直接进入业务代码。
总结
目标机上的报错有时很短,但是背后牵涉的环节并不少。VxWorks RTP怎么创建VxWorks RTP启动失败怎么排查,需要从SDK环境、RTP工程类型、VXE文件、目标端连接、运行路径和日志信息逐项核对。把RTP和DKM分清楚,再从第一条错误开始检查,排查过程会更容易收敛。
