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