1. VxWorks 文件系统概述

大家好,我是老李。做嵌入式这些年,跟文件系统打了太多交道。今天咱们聊聊 VxWorks 里的文件系统。

先问个问题:你写嵌入式程序时,数据存哪儿了?

很多人第一反应是「直接写 Flash 地址」。嗯,我刚开始也这么干。直到有一次项目出了问题——产品卖出去三个月,客户说设备偶尔丢数据。查了半个月,发现是不同模块同时写 Flash,把彼此的记录覆盖了。那叫一个惨。

什么是文件系统

说白了,文件系统就是一套管理数据的规则。它帮你把数据组织成「文件」和「目录」,你不用关心数据到底存在哪个扇区、哪个块。

你想想看,没有文件系统的时候,你要自己算地址、自己管擦除、自己防覆盖。有了文件系统,你只需要说「我要写一个 config.txt」,剩下的它帮你搞定。

我个人的理解是:文件系统 = 数据的管理员 + 存储的调度员。

VxWorks 支持的几种文件系统类型

VxWorks 在这方面做得挺全的。我列一下常用的几种:

文件系统类型 适用场景 特点
dosFs RAM 盘、ATA 硬盘、CF 卡 兼容 FAT12/16,轻量级
rawFs 裸 Flash 设备 无目录结构,适合日志
tapeFs 磁带机等顺序设备 顺序读写,不常用
cdromFs 光盘设备 只读,ISO 9660 格式
nfs 网络存储 远程文件访问
hrfs 高可靠性场景 掉电保护,事务日志

这里我想多说两句 dosFs。它是我用得最多的一个。为什么?因为它简单、稳定、兼容性好。你在 Windows 上插个 U 盘,里面就是 FAT 格式。dosFs 跟它是一家人。

重点提醒:dosFs 有 dosFs2 和 dosFs3 两个版本。dosFs2 是老的,dosFs3 支持长文件名。我建议新项目直接用 dosFs3。

再说说 rawFs。这个比较特殊,它没有目录结构。你写数据就是往一个连续区域里追加。适合什么场景?比如飞行数据记录器,一条一条往下写,不需要删除修改。我在做无人机项目时用过,简单粗暴,效果不错。

为什么需要文件系统

这个问题,我换个角度回答你。

没有文件系统,你面临什么?

  • 地址管理混乱:每个模块都要知道「我的数据在 0x10000 到 0x20000」,万一重叠了,数据就乱了
  • 没有权限控制:谁都能写,谁都能读,没有保护机制
  • 数据迁移困难:换个 Flash 芯片,所有地址都要重新算
  • 没有标准化接口:每个驱动读写方式不一样,上层代码没法统一

有了文件系统,这些问题都解决了。

举个例子。我之前做的一个通信基站项目,需要记录运行日志。没有文件系统时,日志是直接写 Flash 块的。后来要加一个功能——按日期查询日志。你猜怎么着?得从头扫描整个 Flash,找到日期标记,再定位数据位置。效率低得吓人。

换成文件系统后,每个日志文件按日期命名,比如 log_2024_01_15.txt。查询时直接打开对应文件,几毫秒搞定。

我的经验:文件系统带来的最大好处不是「能存数据」,而是「能方便地管理数据」。这个区别,等你项目做到后期就体会到了。

另外,文件系统还提供了标准 API。open、read、write、close,这套接口在 Linux、Windows、VxWorks 上几乎一样。你想想看,这意味着什么?

意味着你的上层应用代码可以跨平台。我在 VxWorks 上写的日志模块,稍微改改就能跑到 Linux 上。没有文件系统,你得重写整个存储层。

注意:文件系统不是万能的。它带来便利的同时,也增加了开销。比如 dosFs 需要维护 FAT 表,会占用内存。在资源极度受限的 MCU 上,有时候裸写 Flash 反而是更好的选择。

我曾经在一个只有 64KB RAM 的项目上尝试用 dosFs,结果 FAT 表就占了 8KB,太奢侈了。最后换成了 rawFs,只用了 1KB 就搞定了。

总结一下我的看法:

文件系统是嵌入式系统的「基础设施」。它帮你把存储这件事抽象化、标准化。你不需要关心底层硬件细节,只需要关心你的数据逻辑。

嗯,这一节就到这里。下一节我们聊聊 dosFs 的详细配置和部署,那才是真正动手的地方。


公众号:蓝海资料掘金营,微信 deep3321