LiteOS-M轻量系统内核——FAT
FAT
概述
FAT文件系统是File Allocation Table(文件配置表)的简称,FAT文件系统有FAT12、FAT16、FAT32。FAT文件系统将硬盘分为MBR区、DBR区、FAT区、DIR区、DATA区等5个区域。
FAT文件系统支持多种介质,特别在可移动存储介质(U盘、SD卡、移动硬盘等)上广泛使用。可以使嵌入式设备和Windows、Linux等桌面系统保持很好的兼容性,方便用户管理操作文件。
OpenHarmony内核的FAT文件系统具有代码量和资源占用小、可裁切、支持多种物理介质等特性,并且与Windows、Linux等系统保持兼容,支持多设备、多分区识别等功能。
OpenHarmony内核支持硬盘多分区,可以在主分区以及逻辑分区上创建FAT文件系统。同时OpenHarmony内核也可以识别出硬盘上其他类型的文件系统。
注意事项
-
最多支持同时打开的fatfs文件(文件夹)数为512。
-
以可写方式打开一个文件后,未close前再次打开会失败。多次打开同一文件,必须全部使用只读方式。长时间打开一个文件,没有close时数据会丢失,必须close才能保存。
-
FAT文件系统中,单个文件不能大于4G。
-
当有两个SD卡插槽时,卡0和卡1不固定,先插上的为卡0,后插上的为卡1。
-
当多分区功能打开,存在多分区的情况下,卡0注册的设备节点/dev/mmcblk0(主设备)和/dev/mmcblk0p0(次设备)是同一个设备,禁止对主设备进行操作。
-
FAT文件系统的读写指针没有分离,所以以O_APPEND(追加写)方式打开文件后,读指针也在文件尾,读文件前需要用户手动置位。
-
FAT文件系统的stat及lstat函数获取出来的文件时间只是文件的修改时间。暂不支持创建时间和最后访问时间。微软FAT协议不支持1980年以前的时间。
-
open打开一个文件,参数有O_TRUNC时,会将文件中的内容清空。
-
FAT文件系统支持的操作有:open, close, read, write, seek, sync, opendir, closedir, readdir, rewinddir, readdir_r, statfs, remove, unlink, mkdir, rmdir, rename, stat, stat64, seek64, fallocate, fallocate64, truncate, truncate64,mount, umount。
-
为避免SD卡使用异常和内存泄漏,SD卡使用过程中拔卡,用户必须先关闭正处于打开状态的文件和目录,之后umount挂载节点。
-
在format操作之前,若fat文件系统已挂载,需确保所有目录及文件全部关闭,否则format会失败。
-
FAT支持只读属性挂载:
-
当mount函数的入参为MS_RDONLY时,FAT将开启只读属性,所有的带有写入的接口,如write、mkdir、unlink,以及通过非O_RDONLY属性打开的文件,将均被拒绝,并传出EACCESS错误码(format接口除外)。
-
当mount函数的入参为MS_NOSYNC时,FAT不会主动将cache的内容写回存储器件。FAT的如下接口(open、close、 unlink、rename、mkdir、rmdir、truncate)不会自动进行sync操作,速度可以提升,但是需要上层主动调用sync来进行数据同步,否则下电可能会数据丢失。
-
-
FAT文件系统有定时刷cache功能。在menuconfig中开启LOSCFG_FS_FAT_CACHE_SYNC_THREAD选项,打开后系统会创建一个任务刷cache,默认每隔5秒检查cache中脏数据块比例,超过80%时进行sync操作,将cache中的脏数据全部写回磁盘。任务优先级、刷新时间间隔以及脏数据块比例的阈值可分别通过接口LOS_SetSyncThreadPrio、 LOS_SetSyncThreadInterval和LOS_SetDirtyRatioThreshold设置。
-
当前cache的默认大小为16个块,每个块256个扇区。
开发指导
设备识别
-
在ffconf.h文件中配置FF_MULTI_PARTITION为1,可使用多分区功能。
-
在ffconf.h文件中配置FF_VOLUMES大于2时,可使用多设备功能。
多设备、多分区功能开启后,系统对于插上的sd卡自动识别,自动注册设备节点如上图所示。mmcblk0和mmcblk1为卡0和卡1,是独立的主设备,mmcblk0p0、mmcblk0p1为卡0的两个分区,可作为分区设备使用。在有分区设备存在的情况下,禁止使用主设备。
可以使用 partinfo命令查看所识别的分区信息。
OHOS # partinfo /dev/mmcblk0p0
part info :
disk id : 0
part_id in system: 0
part no in disk : 0
part no in mbr : 1
part filesystem : 0C
part dev name : mmcblk0p0
part sec start : 8192
part sec count : 31108096
FAT文件系统的挂载
运行命令:
OHOS # mount /dev/mmcblk0p0 /vs/sd vfat
将从串口得到如下回应信息,表明挂载成功。
OHOS # mount /dev/mmcblk0p0 /vs/sd vfat
mount ok
FAT文件系统的卸载
运行命令:
OHOS # umount /vs/sd
将从串口得到如下回应信息,表明卸载成功。
OHOS # umount /vs/sd
umount ok