串行FLASH文件系统FatFs-文件系统介绍

news2024/11/24 14:01:45

目录

串行FLASH文件系统FatFs-文件系统介绍

文件系统介绍

使用SPI FLASH直接存储数据缺点

Windows上的文件系统

 磁盘的物理结构

磁盘分区表

 文件系统的结构与特性

文件系统的空间示意图

FATFS文件系统

FATFS文件系统简介

1 . 特征

2. 层级结构

FatFs的目录结构

FatFs帮助文档

FATFS源码

 FatFs在程序中的关系网络


串行FLASH文件系统FatFs-文件系统介绍

文件系统介绍

使用SPI FLASH直接存储数据缺点

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

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

Windows上的文件系统

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

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

 磁盘的物理结构

本质上磁盘和FLASH一样,都是存储0、1的存储介质,左上角和左下角是磁盘的拆解图。

一个磁盘里有很多个盘片,通过磁头来读取上面的一些存储介质是有磁性还是没有磁性,有磁性就是1,没有磁性就是0,这样就能实现存储数字0101了。只要能实现存储0101,就能实现数据的存储。

右边是每个盘片的拆解图,其中每一个圆环代表一个磁道,每一个环又分很多个扇形,每一个小扇形代表一个扇区,为擦除数据的最小单位。(与我们的flash很类似,在flash中,每4096个字节为一个扇区,16个扇区为一个块)

电脑上的磁盘本质上与我们的flash没有任何区别,为什么电脑上磁盘能够以文件格式来存储数据呢?

这是因为在windows系统里面带了一个文件操作系统(简称文件系统)

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

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

  ntfs和fat32的区别包括以下几点:

  1.ntfs比fat32有更高的安全属性,ntfs支持安全设置;

  2.在时间上,ntfs比fat32推出晚,但它的技术更先进;

  3.fat32能够转换为ntfs格式,但fat32格式不可以支持4GB以上的文件。

4.ntfs可以格式化成fat32,fat32分区最大容量为32G,而ntfs则可达到2TB。

我们嵌入式使用的FatFs文件系统就是在FAT32文件系统上改进而来。EEPROM也是可以支持文件系统的,但是容量太小,STM32F103VET6的FLASH为8M

磁盘分区表

 

 文件系统的结构与特性

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

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

文件系统广义来说

  • 包括存储介质上的管理系统
  • 读取管理系统的代码

文件系统本质上就是把逻辑地址转成物理地址

文件系统的空间示意图

目录存放一个文件的整体信息(存放起点,总的大小),文件分配表存放细节(文件在扇区中的前后连接关系)

 

 

 

 

 C语言中的文件操作

 我们可以像之前一样,使用重定向,将printf和scanfC库函数重定向到USART。将C语言的文件操作相关API重定向到FLASH或者SD卡,但是C语言标准的文件操作比较繁琐,移植复杂,因此我们移植了FATFS文件系统。

FATFS文件系统

FATFS文件系统简介

        FatFs是面向小型嵌入式系统的一种通用的FAT文件系统。它完全是由AISI C语言编写,向FATFS提供关于底层接口的函数,从而实现完全独立于底层的I/O介质。因此它可以很容易地不加修改地移植到其他的处理器当中,如8051、PIC、AVR、SH、Z80、H8、ARM等。FatFs支持FAT12、FAT16(单个文件最大2GB)、FAT32(单个文件最大4GB)等格式。

        利用前面写好的SPI Flash芯片驱动,把FatFs文件系统代码移植到工程之中,就可以利用文件系统的各种函数,对SPI Flash芯片以“文件”格式进行读写操作了。

        具体就是利用SPI FLASH芯片底层驱动的操作函数(读写FLASH),把这些基本的函数提供给FATFS文件系统的代码,它就会利用这些函数在上层建立一个文件系统的代码层并且封装起来,从而方便我们实现对存储介质进行操作。(SD卡和EEPROM的移植与FLASH相同)

FatFs文件系统的源码可以从fatfs官网下载:

FatFs - Generic FAT Filesystem Module

1 . 特征

  • DOS / Windows兼容的FAT / exFAT文件系统。
  • 平台无关。易于移植。
  • 程序代码和工作区的占用空间非常小。
  • 支持以下各种配置选项:
    • ANSI / OEM或Unicode中的长文件名。
    • exFAT文件系统,64位LBA和GPT可存储大量数据。
    • RTOS的线程安全。
    • 多个卷(物理驱动器和分区,最多10个卷)。
    • 可变扇区大小。
    • 多个代码页,包括DBCS。
    • 只读,可选API,I / O缓冲区等…

2. 层级结构

FatFs层级结构如下:

(1)应用层调用FatFs模块接口,FatFs再调用底层接口,实现对USB、SD卡等存储设备的操作。  

(2)需提供RTC时钟给FatFs模块。

如图左侧类似C库文件操作函数,属于中间层接口函数,是FATFS提供好的,用于直接调用。

上图左侧为底层接口函数,应用层通过使用中间层接口函数,从而间接调用底层接口函数来实现对最底层存储介质的读写操作(如具体读写FLASH的某个扇区)。如使用f_write函数最终会调用disk_write函数。但底层的所有接口函数都需要用户自己实现。

FatFs的目录结构

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

FatFs帮助文档

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

FATFS源码

  • integer.h:文件中包含了一些数值类型定义。
  • diskio.c、diskio.h:包含底层存储介质的操作函数,这些函数需要用户自己实现,主要添加底层驱动函数。

        diskio是FatFs的IO层实现,官方提供了框架,移植时只需要完善其中的一些函数即可,十分友好。

函数

作用

disk_initialize

初始化驱动

disk_status

获取驱动状态

disk_initialize

初始化驱动

disk_read

读扇区

disk_write

写扇区

disk_ioctl

用于实现各种各样的功能

  • ff.c、ff.h: FatFs核心文件,文件管理的实现方法。该文件独立于底层介质操作文件的函数,利用这些函数实现文件的读写。

ff.c/ff.h是应用接口的实现,属于FatFs源码,移植无需修改。应用时只需要调用其中函数即可。

  常用的文件的开/关(f_open/f_close)、读/写(f_read/f_write) 以及目录的相关操作接口都在这里。

  • cc936.c:本文件在option目录下,是简体中文支持所需要添加的文件,包含了简体中文的GBK和Unicode相互转换功能函数。
  • ffconf.h:这个头文件包含了对FatFs功能配置的宏定义,通过修改这些宏定义就可以裁剪FatFs的功能。如需要支持简体中文,需要把ffconf.h中的_CODE_PAGE 的宏改成936并把cc936.c文件加入到工程之中。

  • 其中cc936是简体中文的编码页,932为日文,里面通过unicode(字符编码)进行编码的转换。编码页的规定是由IBM公司提出的。

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

阅读文件系统源码ff.c文件需要一定的功底,建议先阅读FAT32的文件格式,再去分析ff.c文件。若仅为了使用文件系统,则只需要理解integer.h及diskio.c文件并会调用ff.c文件中的函数就可以了。

 FatFs在程序中的关系网络

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

FATFS就是我们所说的代码,这些代码注意就是为了实现读取文件系统上的存储介质信息。主要作用就是通过ff.c里面的各种API把用户输入的文件逻辑(读写文件)转成存储介质的信息逻辑(比如物理地址、扇区地址)

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

文件操作--文件的随机读写、标准输入输出重定向

目录 一、文件的随机读写 二、便准输入输出重定向 一、文件的随机读写 前面的例程执行的都是顺序文件处理(Sequential File Processing)。在顺序文件处理过程中,数据项是一个接着一个进行读取或者写入的。例如,如果想读取文件中…

HarmonyOS学习路之开发篇—流转(多端协同 一)

多端协同开发 场景介绍 开发者在应用FA中通过调用流转任务管理服务、分布式任务调度的接口,实现多端协同。 主要流程如下: 设备A上的应用FA向流转任务管理服务注册一个流转回调。 Alt1-系统推荐流转:系统感知周边有可用设备后,主…

Leangoo领歌敏捷管理工具标签升级,企业级标签组上线

在Leangoo领歌敏捷工具中,标签通常用作对任务的分类,或任务的优先级区分等。这次我们发布了大家期待已久的“企业级标签组”功能,标签可以统一管理啦~ 之前,Leangoo领歌的标签功能只限于单个看板使用,需要…

视频孪生赋能智慧交通综合管理系统的数智化升级

交通是重大民生工程,涉及公共安全和人民群众切身利益,必须树牢安全发展理念,强化企业主体责任落实。根据国家标准《城市轨道交通公共安全防范系统工程技术规范》中要求: 未来的智慧交通系统要建立在安防集成平台的应用上,对各类重要部位进行视频图像与三…

CUDA编程实战(使用Sobel算子对rgb图片进行边缘检测)

写在前面,本篇文章为一个CUDA实例,使用GPU并行计算对程序进行加速。如果不需要看环境如何配置,可以直接到看代码部分:点击直达 关于如何更改代码和理解代码写在这个地方:点击直达 运行环境: 系统:windows10专业版 显卡:NVIDIA …

sharding-jdbc分库连接数优化 | 京东物流技术团队

一.背景: 配运平台组的快递订单履约中心(cp-eofc)及物流平台履约中心(jdl-uep-ofc)系统都使用了ShardingSphere生态的sharding-jdbc作为分库分表中间件, 整个集群采用只分库不分表的设计,共16个MYSQL实例,每个实例有32个库,集群共512个库. 当每增加一台客户端主机,一个MYSQl实…

AE/PR/OFX插件-Mocha Pro 2023 v10.0.2 Win 专业平面/三维跟踪摄像机反求插件

插件简介 Mocha Pro是用于VFX视觉特效和后期制作强大的平面跟踪工具,这里提供的是AE和PR的插件版。具有GPU加速的跟踪和对象去除功能,具有边缘捕捉功能的高级遮罩,稳定功能,镜头校准,3D摄像头求解器,立体3…

Win32 汇编在对话框上画线

参阅前文&#xff0c;首先要有一个基本的对话框&#xff1b; 把对话框资源文件里的控件定义都删除&#xff0c;得到的一个rc文件&#xff0c;test.rc&#xff1b; #include <resource.h>#define DLG_MAIN 1DLG_MAIN DIALOG 193, 180, 130, 150 STYLE DS_MODALFRAME | …

在win32 asm中了解intel浮点运算

看老罗的书中有如下一段&#xff0c; ...... fild dwRadius fild _dwDegree fldpi fmul ;角度*Pi fild dwPara180 fdivp st(1),st ;角度*Pi/180 fsin ;Sin(角度*Pi/180) fild …

038、TiDB特性_聚簇索引和非聚簇索引

聚簇表 表中的行数据才能出顺序与主键存储的顺序一致表的主键即为KV映射中Key的一部分通过主键访问行记录时&#xff0c;可以直接获取行记录 create table t( a biging primary key clustered ,b varchar(255)); # a列为主键列&#xff0c;聚簇列聚簇表&#xff08;且ID为主键…

TortoiseGit 入门指南05:推送和拉取

本节所讲内容均涉及到 远端版本库。 版本库 的概念在《TortoiseGit 入门指南02&#xff1a;创建和克隆仓库》中提到过&#xff0c;它是工作目录下面的一个名为 .git 的隐藏目录&#xff0c;我们每一次提交、每一个分支都会保存在版本库中。这个版本库就在我们电脑上的某个文件…

windows开机启动nginx(服务方式启动)

提示&#xff1a;本文章介绍如何借助Windows Service Wrapper小工具&#xff0c;将Nginx转换为Windows服务&#xff0c;在服务中心配置自启动&#xff0c;从而在开机时windows自行启动Nginx服务 Nginx是什么 官方链接&#xff1a;nginx下载 Nginx 是一个高性能的HTTP和反向代理…

Kotlin基础(五):类和接口

前言 本文主要讲解类和接口&#xff0c;主要包括类的声明、构造器、类成员、修饰符、类的继承、接口、抽象类。 Kotlin文章列表 Kotlin文章列表: 点击此处跳转查看 目录 1.1 类的声明 在 Kotlin 中&#xff0c;类的声明使用关键字 class。下面是一个简单的类声明的示例&…

感受C++模版的所带来的魅力

一、泛型编程思想 首先我们来看一下下面这三个函数&#xff0c;如果学习过了 C函数重载 和 C引用 的话&#xff0c;就可以知道下面这三个函数是可以共存的&#xff0c;而且传值会很方便 void Swap(int& left, int& right) {int temp left;left right;right temp; }…

三、Exsi安装虚拟机win10系统

Exsi安装虚拟机win10系统 1、新建虚拟机2、选择存储(直接下一步)3、自定义设置3.1 设置cpu3.2 设置内存3.3 设置硬盘3.4 设置网卡3.5 设置驱动3.6 设置BIOS 4、完成安装 1、新建虚拟机 2、选择存储(直接下一步) 3、自定义设置 3.1 设置cpu 3.2 设置内存 3.3 设置硬盘 3.4 设置…

python搭建文件服务

python -m http.server 访问8000端口&#xff0c;可分享或下载命令启动文件夹下文件。

美国访问学者的申请条件

作为一个富有学术活力和创新精神的国家&#xff0c;美国吸引着世界各地的学者前往交流和研究。对于希望成为美国访问学者的人来说&#xff0c;了解申请条件是至关重要的。下面知识人网小编将介绍一些常见的美国访问学者申请条件。 1. 学术背景与研究计划&#xff1a;作为申请者…

安全测试方法介绍(上)静态源代码审查

软件开发完成之后&#xff0c;我们需要进行安全验证&#xff0c;验证我们的软件是不是符合安全要求。软件安全测试主要有以下几个方面&#xff1a;确定软件的安全特性实现是否与预期设计一致的过程&#xff1b;有关验证软件安全等级和识别潜在安全缺陷的过程&#xff1b;查找软…

采集发布到WordPress网址(OneNav主题-WordPress主题)

WordPress系统的一导航主题&#xff08;OneNav主题&#xff09;是集网址、资源、资讯于一体的导航主题。 要将采集的数据批量自动发布到一导航主题&#xff08;OneNav主题&#xff09;的网址要怎么设置&#xff1f; 普通的文章采集器一般只能发布为wordpress文章类型&#xff…

echarts折线图横向渐变填充

这种情况&#xff0c;需要后端去计算&#xff0c;如何把不同分段的值赋予不同的颜色&#xff0c;然后组合成下面我们需要的格式就可以实现 drawLine1() {if (document.getElementById(s1) ! null) {var that thislet heightNum (this.porosityList.maxDepth-this.porosityLis…