嵌入式设备启动时,有时要读取一份默认配置、校准表或界面资源。把这些文件放进VxWorks的ROMFS,系统启动后就能按固定路径读取,交付镜像时也省去了单独部署文件的步骤。这里有个容易混淆的地方,开发机上可以编辑准备打包的文件,目标机启动后访问到的ROMFS却是只读的。设备如果还要保存现场调整,就得给可变数据安排单独的存放位置。
一、VxWorks的ROMFS怎么添加文件
文件要在构建阶段加入ROMFS,再随系统镜像部署。工程入口随版本和构建方式变化,下面的目录构建方式以VxWorks 6.x为例,Workbench操作以提供ROMFS工程向导的版本为例。
1、把文件放进镜像工程的输入目录
①、打开实际用于生成目标镜像的工程,在组件配置中确认已加入【INCLUDE_ROMFS】。
②、在开发机的镜像工程目录下创建【romfs】目录。若现有构建规则通过【ROMFS_DIR】指定了其他目录,就打开该变量指向的目录。
③、将默认配置放入【romfs/config/default.ini】。已有外部输入目录时,在该目录下保持同样的【config/default.ini】层级。
④、按当前工程的构建配置重新生成【VxWorks镜像】,把新产物部署到目标板并启动。
目录构建会收录输入目录中的文件。打包前可以清点一下目录,特别是编辑器备份、旧配置和临时测试数据。主机上准备的是一棵输入目录树,目标端使用的是镜像内的路径,两者的根目录写法容易弄混。
2、通过Workbench的ROMFS工程添加文件
Workbench的内容编辑器可以把主机文件放到指定的目标目录。文件来源与目标路径分别设置,同名文件来自哪个构建目录,可以在编辑器里核对。
①、依次选择【File】→【New】→【Wind River Workbench Project】,选择目标操作系统,再将构建类型设为【ROMFS File System】。
②、在工程导航器里打开ROMFS内容编辑器。在【Target Contents】中选定目标目录,通过【Add】加入工作区文件,或通过【Add External】加入外部文件。
③、需要新建目录时,在【Target Contents】中右键选择【Add New Folder to File System】。添加后选中文件,核对【Host path】并保存。
④、将ROMFS工程关联到实际部署的【VxWorks Image Project】,重新构建镜像。目标板启动后,在支持命令解释器的目标Shell中运行【ls/romfs/config】,确认能看到配置文件。
二、VxWorks的ROMFS文件能否在运行时修改
ROMFS在运行时可以读取,不能在原位置写入、覆盖或删除文件。如果应用要调整配置,可以在内存里修改读取结果,或者把新配置写到另一个支持写入的文件系统。
1、按只读方式访问镜像中的文件
①、在目标Shell中用【ls/romfs/config】检查目录和文件名。
②、在应用中用【open()】打开【/romfs/config/default.ini】,打开方式设为【O_RDONLY】。
③、使用【read()】读取内容,处理读取失败或提前结束的情况,完成后用【close()】关闭文件。
读入内存后,应用可以修改缓冲区里的值。例如,用户调高了报警阈值,本次运行可以立即采用新值。缓冲区的变化只影响当前程序状态,重启后再次读取默认文件,得到的仍是镜像中随版本交付的内容。
2、把需要保存的修改写入可写卷
可写卷的选择取决于配置要保留多久。只在本次开机期间使用的中间文件,可以放在已配置的RAM盘。希望断电重启后还在,就要选用目标机已经挂载的持久存储。
①、确认目标机的【可写卷】名称、可用空间和应用访问权限。
②、将【/romfs/config/default.ini】作为初始化来源,把现场配置写入可写卷上的独立文件。
③、在应用的启动逻辑中优先读取【现场配置】。文件缺失或校验失败时,回退到【/romfs/config/default.ini】。
④、修改一项配置并保存,重启目标机,检查程序是否从【现场配置】恢复了修改值。
三、VxWorks的ROMFS文件更新后怎么核对
开发机上的文件已经改了,目标机却仍然读到旧内容,这时可以沿着文件来源、镜像产物和目标板启动配置逐段检查。如果应用支持现场配置,还要确认它当前读的是哪个文件。
1、查清旧内容留在哪个环节
①、在Workbench中检查【Host path】,或在目录构建方式下检查【ROMFS_DIR】,确认修改的是本轮构建使用的文件。
②、重新构建,核对【镜像输出路径】及文件生成时间,确认部署任务拿到的是这次构建的产物。
③、检查目标机的【启动配置】,确认启动所用的镜像路径或启动分区,再查看【/romfs/config】。
④、用应用的只读接口读取文件里的【配置版本】或一项明确改过的值,与构建输入对照。
文件名相同,只能证明该路径下有文件。给配置保留一个简短的版本字段,板上读到旧值时就容易区分是镜像未更新,还是镜像已经更新、应用仍在使用现场配置。
2、区分镜像默认值和设备现场值
设备升级后,保留现场值还是启用新的默认值,要看应用对配置版本的处理。例如,新版本增加了采样周期字段,旧配置仍可保留设备编号,但缺少的字段应有明确的补齐规则。
①、分别读取【ROMFS默认配置】和【可写卷现场配置】,记录各自的版本及配置值。
②、在应用启动日志中记录实际使用的【配置文件路径】,核对本次启动采用的数据来源。
③、在测试设备上分别验证保留【现场配置】和备份后暂时移开该文件两种启动情况,确认保留、回退及新增字段的处理符合预期。
总结
ROMFS适合存放随系统版本交付的默认文件。设备上的参数调整如果需要跨重启保存,可以由应用写入可写卷,并约定配置缺失、损坏或版本变化时怎么处理。维护镜像时,把默认配置的版本和设备实际读取的路径记录下来,碰到升级后参数没变化的情况,就有具体的文件可以对照。
