【鸿蒙南向开发】LiteOS-M小型系统内核——FAT

打印 上一主题 下一主题

主题 580|帖子 580|积分 1740

基本概念

FAT文件系统是File Allocation Table(文件配置表)的简称,重要包括DBR区、FAT区、DATA区三个地区。其中,FAT区各个表项记录存储设备中对应簇的信息,包括簇是否被使用、文件下一个簇的编号、是否文件末端等。FAT文件系统有FAT12、FAT16、FAT32等多种格式,其中,12、16、32表示对应格式中FAT表项的字节数。FAT文件系统支持多种介质,特殊在可移动存储介质(U盘、SD卡、移动硬盘等)上广泛使用,使嵌入式设备和Windows、Linux等桌面系统保持很好的兼容性,方便用户管理操纵文件。
OpenHarmony内核支持FAT12、FAT16与FAT32三种格式的FAT文件系统,具有代码量小、资源占用小、可裁切、支持多种物理介质等特性,并且与Windows、Linux等系统保持兼容,支持多设备、多分区识别等功能。OpenHarmony内核支持硬盘多分区,可以在主分区以及逻辑分区上创建FAT文件系统。
开发指导

驱动适配

FAT文件系统的使用需要底层MMC相干驱动的支持。在一个带MMC存储设备的板子上运行FATFS,需要:
1、适配板端EMMC驱动,实现disk_status、disk_initialize、disk_read、disk_write、disk_ioctl接口;
2、新增fs_config.h文件,配置FS_MAX_SS(存储设备最大sector巨细)、FF_VOLUME_STRS(分区名)等信息,例如:
  1. #define FF_VOLUME_STRS     "system", "inner", "update", "user"
  2. #define FS_MAX_SS          512
  3. #define FAT_MAX_OPEN_FILES 50
复制代码
开发流程

   阐明:
  

  • FATFS文件与目录操纵:
  • 单个文件巨细不超过4G。
  • 支持同时打开的文件数最大为FAT_MAX_OPEN_FILES,文件夹数最大为FAT_MAX_OPEN_DIRS。
  • 暂不支持根目录管理,文件/目录名均以分区名开头,例如“user/testfile”就是在“user”分区下名为“testfile”的文件或目录。
  • 若需要同时多次打开同一文件,必须全部使用只读方式(O_RDONLY)。以可写方式(O_RDWR、O_WRONLY等)只能打开一次。
  • 读写指针未分离,例如以O_APPEND(追加写)方式打开文件后,读指针也在文件尾,从头读文件前需要用户手动置位。
  • 暂不支持文件与目录的权限管理。
  • stat及fstat接口暂不支持查询修改时间、创建时间和最后访问时间。微软FAT协议不支持1980年从前的时间。
  • FATFS分区挂载与卸载:
  • 支持以只读属性挂载分区。当mount函数的入参为MS_RDONLY时,所有的带有写入的接口,如write、mkdir、unlink,以及非O_RDONLY属性的open,将均被拒绝。
  • mount支持通过MS_REMOUNT标记修改已挂载分区的权限。
  • 在umount操纵前,需确保所有目录及文件全部关闭。
  • umount2支持通过MNT_FORCE参数逼迫关闭所有文件与文件夹并umount,但可能造成数据丢失,请谨慎使用。
  • FATFS支持重新划分存储设备分区、格式化分区,对应接口为fatfs_fdisk与fatfs_format:
  • 在fatfs_format操纵之前,若需要格式化的分区已挂载,需确保分区中的所有目录及文件全部关闭,并且分区umount。
  • 在fatfs_fdisk操纵前,需要该设备中的所有分区均已umount。
  • fatfs_fdisk与fatfs_format会造成设备数据丢失,请谨慎使用。
  编程实例

实例形貌

本实例实现以下功能:

  • 创建目录“user/test”
  • 在“user/test”目录下创建文件“file.txt”
  • 在文件起始位置写入“Hello OpenHarmony!

  • 将文件内容刷入设备中
  • 设置偏移到文件起始位置
  • 读取文件内容
  • 关闭文件
  • 删除文件
  • 删除目录
示例代码

条件条件:


  • 系统已将MMC设备分区挂载到user目录
代码实现如下:
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include "sys/stat.h"
  4. #include "fcntl.h"
  5. #include "unistd.h"
  6. #define LOS_OK 0
  7. #define LOS_NOK -1
  8. int FatfsTest(void)
  9. {     
  10.     int ret;
  11.     int fd = -1;
  12.     ssize_t len;
  13.     off_t off;
  14.     char dirName[20] = "user/test";
  15.     char fileName[20] = "user/test/file.txt";
  16.     char writeBuf[20] = "Hello OpenHarmony!
  17. ";
  18.     char readBuf[20] = {0};
  19.     /* 创建目录“user/test” */
  20.     ret = mkdir(dirName, 0777);
  21.     if (ret != LOS_OK) {
  22.         printf("mkdir failed.\n");
  23.         return LOS_NOK;
  24.     }
  25.     /* 创建可读写文件"user/test/file.txt" */
  26.     fd = open(fileName, O_RDWR | O_CREAT, 0777);
  27.     if (fd < 0) {
  28.         printf("open file failed.\n");
  29.         return LOS_NOK;
  30.     }
  31.     /* 将writeBuf中的内容写入文件 */
  32.     len = write(fd, writeBuf, strlen(writeBuf));
  33.     if (len != strlen(writeBuf)) {
  34.         printf("write file failed.\n");
  35.         return LOS_NOK;
  36.     }
  37.     /* 将文件内容刷入存储设备中 */
  38.     ret = fsync(fd);
  39.     if (ret != LOS_OK) {
  40.         printf("fsync failed.\n");
  41.         return LOS_NOK;
  42.     }
  43.     /* 将读写指针偏移至文件头 */
  44.     off = lseek(fd, 0, SEEK_SET);
  45.     if (off != 0) {
  46.         printf("lseek failed.\n");
  47.         return LOS_NOK;
  48.     }
  49.     /* 将文件内容读出至readBuf中,读取长度为readBuf大小 */
  50.     len = read(fd, readBuf, sizeof(readBuf));
  51.     if (len != strlen(writeBuf)) {
  52.         printf("read file failed.\n");
  53.         return LOS_NOK;
  54.     }
  55.     printf("%s\n", readBuf);
  56.     /* 关闭文件 */
  57.     ret = close(fd);
  58.     if (ret != LOS_OK) {
  59.         printf("close failed.\n");
  60.         return LOS_NOK;
  61.     }
  62.     /* 删除文件"user/test/file.txt" */
  63.     ret = unlink(fileName);
  64.     if (ret != LOS_OK) {
  65.         printf("unlink failed.\n");
  66.         return LOS_NOK;
  67.     }
  68.     /* 删除目录“user/test” */
  69.     ret = rmdir(dirName);
  70.     if (ret != LOS_OK) {
  71.         printf("rmdir failed.\n");
  72.         return LOS_NOK;
  73.     }
  74.     return LOS_OK;
  75. }
复制代码
结果验证

编译运行得到的结果为:
  1. Hello OpenHarmony!
复制代码
写在最后

●如果你以为这篇内容对你还蛮有帮助,我想约请你帮我三个小忙:
●点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
●关注小编,同时可以期待后续文章ing

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

数据人与超自然意识

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表