一、串行FLASH文件系统FatFs简介

本节主要给大家介绍以下内容:

文件系统简介

FatFs文件系统简介

FatFs文件系统移植

FatFs功能使用

一、文件系统简介

       当我们在使用SPI FLASH直接存储数据 当需要记录字符STM32 SPI FLASH时。可以把这些文字转化成ASCII码,存储在数组中,然后调用SPI_FLASH_BufferWrite函数,把数组内容写入到SPI Flash芯片的指定地址上,在需要的时候从该地址把数据读取出来,再对读出来的数据以ASCII码的格式进行解读。

但是这样存在以下弊端:

  • 难以记录有效的数据位置
  • 难以确定存储介质的剩余空间
  • 不明确应以何种格式来解读数据

       而我们接触到的Windows/Linux系统就是比较常见的文件系统,我们在Windows/Linux中查找文件只需要根据文件的存储路径就可以方便的找到需要的文件,文件内容读取可以通过文件类型(例如txt、exe等)方式去通过特定的打开方式去使用。

1.1 Windows文件系统

Windows上的文件系统:就是对数据进行管理的方式。使用文件系统可有效地管理存储介质。

文件系统在计算机中的表现形式:

磁盘的物理结构:

        使用文件系统时,它为了存储和管理数据,在存储介质建立了一些组织结构,这些结构包括操作系统引导区、目录和文件。

        常见的windows下的文件系统格式包括FAT32NTFSexFAT。在使用文件系统前,要先对存储介质进行格式化。格式化时会在存储介质上新建一个文件分配表和目录。这样,文件系统就可以记录数据存放的物理地址,剩余空间。

1.2 磁盘分区表

        Windows操作系统为了便于用户对磁盘的管理。加入了磁盘分区的概念,即将一块磁盘逻辑划分为几块,它会把磁盘的分区信息记录到硬盘分区表中。

        在硬盘分区表中,描述了各个逻辑分区的属性,如分区开始和结束位置所在的物理地址(柱面号、扇区号),空间大小等信息。 在硬盘分区表如下图:

1.3  文件系统的结构与特性

        使用文件系统时,数据都以文件的形式存储。写入新文件时,先在目录中创建一个文件索引,它指示了文件存放的物理地址,再把数据存储到该地址中。当需要读取数据时,可以从目录中找到该文件的索引,进而在相应的地址中读取出数据具体还涉及到逻辑地址、簇大小、不连续存储等一系列辅助结构或处理过程。

         文件系统的存在使存取数据时,不再是简单地向某物理地址直接读写,而是要遵循它的读写格式。如经过逻辑转换,一个完整的文件可能被分开成多段存储到不连续的物理地址,使用目录或链表的方式来获知下一段的位置。

1.4 文件系统的空间示意图

        刚刚介绍了,我们把文件系统格式化之后,它会把一个文件分配表存储在我们磁盘的开头。

        (簇:相当于扇区)

存储了A.TXT,B.TXT,C.TXT文件等

1.5 目录示意图

记录了文件的开始簇位置、大小等信息。

1.6 文件分配表

上面说的目录是记录了某个文件存储在哪个扇区,而文件分配表,记录了这个扇区存储了哪一些内容,然后这个内容的下一部分在哪里。

文件 a.txt 我们根据目录 项中指定的 a.txt 的首簇为 2,然后找到文件分配表的第 2 簇记录,上面登记 的是 3,就能确定下一簇是 3。找到文件分配表的第 3 簇记录,上面登记的 是 4,就能确定下一簇是 4......直到指到第 11 簇,发现下一个指向是 FF,就是结束。文件便读取完毕。

删除B.TXT文件,创建D.TXT文件后的空间示意图

原目录示意图

 删除B.TXT文件,创建D.TXT文件后的目录示意图

原文件分配表示意图

删除B.TXT文件,创建D.TXT文件后的文件分配表示意图 

二、FatFs文件系统简介

首先回顾下C语言中的文件操作:

      文件的打开操作 fopen 打开一个文件

      文件的关闭操作 fclose 关闭一个文件

      文件的读写操作 fgetc 从文件中读取一个字符
             
fputc 写一个字符到文件中去
             
fgets 从文件中读取一个字符串
             
fputs 写一个字符串到文件中去
             
fprintf 往文件中写格式化数据
             
fscanf 格式化读取文件中数据
             
fread 以二进制形式读取文件中的数据
             
fwrite 以二进制形式写数据到文件中去
             
getw 以二进制形式读取一个整数
             
putw 以二进制形式存贮一个整数

    文件状态检查函数  feof 文件结束
             
ferror 文件读/写出错
             
clearerr 清除文件错误标志
             
ftell 了解文件指针的当前位置

       文件定位函数 rewind 反绕
             
fseek 随机定位

        windows和linux都是系统/平台上支持这些函数,但是STM32不支持。  

         而FatFs是面向小型嵌入式系统的一种通用的FAT文件系统。它完全是由AISI C语言编写并且完全独立于底层的I/O介质。因此它可以很容易地不加修改地移植到其他的处理器当中,如8051PICAVRSHZ80H8ARM等。FatFs支持FAT12FAT16FAT32等格式。

        (他们三个的区别就是单个文件的大小的最大空间,FAT32单个文件最大支持4GB,FAT16单个文件最大支持2GB)

        有了这个文件系统之后,把它移植到STM32上以后,然后再把flash进行格式化。格式化之后,就能像我们的电脑里面使用的磁盘一样,再存储介质上建立文件了,以文件格式的形式对flash进行存储数据。

        利用前面写好的SPI Flash芯片驱动,把FatFs文件系统代码移植到工程之中,就可以利用文件系统的各种函数,在上层建立一个文件系统的代码层,来实现文件系统,对SPI Flash芯片以“文件”格式进行读写操作了。
FatFs文件系统的源码可以从fatfs官网下载:fatfs官网链接。

2.1 FatFs文件系统的源码简介

        网页的上面,这里它也有很多应用函数的一些接口:这些函数跟C语言里面的操作很类似,功能也是完全一样的。

 而下面的这些接口需要我们自己去实现。就类似于C++的虚函数,内部需要我们自己实现。

在Resources处进行下载。

 下载FatFs源码包解压后,在doc 文件夹里面是一些使用帮助文档;

在src 是FatFs文件系统的源代码。

2.1.1 FatFs帮助文档

         其中 en ja 这两个文件夹里面是编译好的html文档,讲的是FATFS里面各个函数的使用方法 00index_e.html00index_j.html是一些关于FATFS的简介

2.1.2 FATFS源码 

  • integer.h:文件中包含了一些数值类型定义。
  • diskio.c:包含底层存储介质的操作函数,这些函数需要用户自己实现,主要添加底层驱动函数。
  • ff.cFatFs核心文件,文件管理的实现方法。该文件独立于底层介质操作文件的函数,利用这些函数实现文件的读写。
  • cc936.c:本文件在option目录下,是简体中文支持所需要添加的文件,包含了简体中文的GBKUnicode相互转换功能函数。
  • ffconf.h:这个头文件包含了对FatFs功能配置的宏定义,通过修改这些宏定义就可以裁剪FatFs的功能。如需要支持简体中文,需要把ffconf.h中的_CODE_PAGE 的宏改成936并把上面的cc936.c文件加入到工程之中。

建议阅读这些源码的顺序为:integer.h --> diskio.c --> ff.c

阅读文件系统源码ff.c文件需要一定的功底,建议先阅读FAT32的文件格式,再去分析ff.c文件。

若仅为使用文件系统,则只需要理解integer.hdiskio.c文件并会调用ff.c文件中的函数就可以了。

2.1.3 FatFs在程序中的关系网络

  • 用户应用程序需要由用户编写,想实现什么功能就编写什么的程序,一般我们只用到f_mount()f_open()f_write()f_read()就可以实现文件的读写操作。这些应用层函数使用方法与标准C的文件操作函数类似。
  • FatFs组件是FatFs的主体,文件都在源码src文件夹中,其中ff.cff.hinteger.h以及diskio.h四个文件我们不需要改动,只需要修改ffconf.hdiskio.c两个文件。
  • 底层设备输入输出要求实现存储设备的读写操作函数、存储设备信息获取函数等等。
2.1.4  FatFs移植需要用户支持函数

函数

条件(ffconf.h)

备注

disk_status
disk_initialize
disk_read

总是需要

底层设备驱动函数

disk_write
get_fattime
disk_ioctl (CTRL_SYNC)

_FS_READONLY == 0

disk_ioctl (GET_SECTOR_COUNT)
disk_ioctl (GET_BLOCK_SIZE)

_USE_MKFS == 1

disk_ioctl (GET_SECTOR_SIZE)

_MAX_SS != _MIN_SS

disk_ioctl (CTRL_TRIM)

_USE_TRIM == 1

ff_convert
ff_wtoupper

_USE_LFN != 0

Unicode支持,为支持简体中文,添加cc936.c到工程即可

ff_cre_syncobj
ff_del_syncobj
ff_req_grant
ff_rel_grant

_FS_REENTRANT == 1

FatFs可重入配置,需要多任务系统支持(一般不需要)

ff_mem_alloc
ff_mem_free

_USE_LFN == 3

长文件名支持,缓冲区设置在堆空间(一般设置_USE_LFN = 2 )

介绍部分就到此结束啦,下一节将给大家聊聊如何让移植的问题~ 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/286730.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

查看CPU的型号方法很多,而且步骤简单

每台计算机至少包含一个处理器,也称为CPU或中央处理单元。你电脑的CPU可能是由英特尔或AMD制造的。以下是如何查看你的CPU以及它的速度。 在设置应用程序中查找你的CPU 要在Windows 10或Windows 11设置应用程序中查找此信息,请导航到“设置”>“系统…

程序流程图的意义(合集)

程序流程图的意义 1、矩形 作用:一般用作要执行的处理(process),在程序流程图中做执行框。 在axure中如果是画页面框架图,那么也可以指代一个页面。有时候我们会把页面和执行命令放在同一个流程中做说明,这个时候将两类不同的矩形…

spring MVC概述和土门案例(无配置文件开发)

SpringMVC 1,SpringMVC概述2,SpringMVC入门案例2.1 需求分析2.2 案例制作步骤1:创建Maven项目步骤2:补全目录结构步骤3:导入jar包步骤4:创建配置类步骤5:创建Controller类步骤6:使用配置类替换web.xml步骤7:配置Tomcat环境步骤8:启动运行项目步骤9:浏览器…

Java精品项目源码新基于协同过滤算法的旅游推荐系统(编号V69)

Java精品项目源码新基于协同过滤算法的旅游推荐系统(编号V69) 大家好,小辰今天给大家介绍一个基于协同过滤算法的旅游推荐系统

C#拼接JSON

一、业务背景 最近项目需要与U8c对接,实现增删改查,借此机会,梳理一下C#解析Json字符串的问题。 这篇文章,先以新增接口为例。 二、新增接口 查看需要传入的json格式。 拼接json,无非就是{}和[]的来回嵌套。 首先&am…

JavaScript 内存管理的秘密武器:垃圾回收(下)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

Java中Exception的使用方法

Exception介绍异常处理机制的优缺点常见的Exception异常处理的常见错误优雅的处理异常异常处理中存在的性能问题Java自定义异常示例 Exception介绍 在Java中,异常(Exception)是一种特殊类型的对象,表示程序运行过程中发生的意外或…

Kubernetes 的用法和解析 -- 5

一.企业级镜像仓库Harbo 准备:另起一台新服务器,并配置docker yum源,安装docker 和 docker-compose 1.1 上传harbor安装包并安装 [rootharbor ~]# tar xf harbor-offline-installer-v2.5.3.tgz [rootharbor ~]# cp harbor.yml.tmpl harbor…

20.(vue3.x+vite)Vue子组件和父组件执行顺序

前端技术社区总目录(订阅之前请先查看该博客) 示例效果 Vue3子组件和父组件执行顺序 (1)父组件–setup(vue3中替换了beforeCreate,created) (2)父组件–onBeforeMount (3)子组件–setup(vue3中替换了beforeCreate,created) (4)子组件–onBeforeMount (5)子组件–…

Hazelcast系列(十):Map(二)监听器和拦截器

系列文章 Hazelcast系列(一):初识hazelcast Hazelcast系列(二):hazelcast集成(嵌入式) Hazelcast系列(三):hazelcast集成(服务器/客户端) Hazelcast系列(四):hazelcast管理中心 …

P51 各式各样的神奇的自注意力机制

计算量大 当input sequence 很长时,计算量特别大 self-atttention 至少一个大模型的一部分当input sequence 很长时,主要运算来自self - attention, 加快 self attention ,才能有明显的加快速度 变形 local attention 只计算左右两个位置…

八大在线PS工具,你不能错过的编辑利器

即时设计 即时设计是一款优秀的在线ps网页版替代工具,具有各种硬件设备的标准尺寸,可以直接在编辑器中创建不同设备(手机、平板电脑、电脑等)尺寸的画板。)并预览您的设计效果。 即时设计支持互动事件演示,丰富的过渡动画,各种渐…