GD32(5)文件系统

article/2025/9/27 4:57:03

目录

  • 文件系统介绍
  • FatFs文件系统组成
  • 文件系统存储
    • 文件分配表
    • 目录
  • 文件系统移植步骤
  • 文件系统操作函数
    • f_mount
    • f_open
    • f_close
    • f_write
    • f_read

文件系统介绍

       文件系统:操作系统用于明确存储设备(常见的是磁盘,也有基于NAND Flash的固态硬盘)或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。

       简单来说,就是组织存储设备中的数据,使其不再成为分立,无意义的数据,而是组合起来形成一个个文件,以最简单的计算机为例,本质上显示在屏幕上的文件夹、文件在磁盘上都是1和0,但通过组织则形成了docx、exe等文件形式,并且不会和其它文件混淆,这就是文件系统的作用。

       Windows下常见的文件系统格式包括FAT32、NTFS、exFAT等,下面主要介绍FatFs文件系统。

       FatFs文件系统是一种面向小型嵌入式系统的通用FAT文件系统。该系统完全由ANSIC语言(即标准C语言)编写并且完全独立于底层的I/O介质,可以很容易地移植到其他的处理器。FatFs文件系统支持多个存储媒介,具有独立的缓冲区,可以读写多个文件,并且该系统特别根据8位和16位微控制器进行了优化。文件系统实际上有点类似NAND Flash管理中的FTL层和内存管理中的内存管理表,当然文件系统的实际内容更加复杂,为了方便使用,一般只需要为其提供相应的接口函数,即可使用文件系统。

FatFs文件系统组成

       下面以SD卡作为存储设备,介绍基于SD卡文件系统的使用。

       从文件系统的使用上来说,文件系统实际上就是用于管理存储块的程序,该程序包括但不限于ff.c、diskio.c等文件,这些文件组成了FatFs组件,并为应用程序提供控制文件的函数。

       文件系统向上提供控制函数的同时,向下通过相应函数完成对存储块的读写,这部分读写函数则需要用户提供,作为接口,如下图的sd_block_read函数即是向SD卡写入数据的函数。

在这里插入图片描述

       关于FatFs组件的各个文件描述如下:

在这里插入图片描述

文件系统存储

       与内存管理中的内存管理表一样,文件系统同样会形成1个表来管理各个文件,当然这里的表不再是简单的数组,而是在存储器中形成文件分配表以及目录,如下图所示,文件分配表用于记录各个文件的存储位置。目录用于记录文件系统中各个文件的开始簇和文件大小等文件信息。A.TXT、B.TXT和C.TXT等为文件。

       其中“簇”是文件系统操作的最小单位,每个文件至少占用一个簇的空间。簇的大小在格式化时被确定,“簇”越小,读写速度越慢;“簇”越大,读写速度越快,但对于小文件来说存在浪费空间的问题(所以特殊情况下需要对“簇”的大小进行权衡)。FatFs文件系统通常使用的“簇”的大小为4KB。

在这里插入图片描述

文件分配表

       文件分配表的内容如下图所示,用于记录各个文件的存储位置,其中第一行为对应的簇号,第二行为该文件存储的下一簇的簇号,当第二行为FF时表示对应文件存储已经结束。对照上图可得,簇号为1的存储空间存放着目录,簇号2 ~ 11存储着1个文件,簇号12 ~ 15、66 ~ 86同,而簇号87 ~ 99则未用于存储(第二行为00)。

在这里插入图片描述

目录

       目录的内容如下图所示,用于记录文件系统中各个文件的开始簇和文件大小等文件信息。以下图为例,每个文件都需要100字节的空间存储相应的信息,即0.1KB。

在这里插入图片描述

文件系统移植步骤

       没错,本文介绍的是文件系统的移植步骤而不是搭建步骤,文件系统实际上是由十分复杂的程序构成,不是一朝一夕能吃透、搭建出来的,庆幸的是已经有大佬创造并分享了十分容易移植的文件系统,文件系统的下载可通过FatFs,该网址中除了FatFs的各个版本外,还有其基础知识、用户论坛以及用于FatFs入门的程序节点等,并且还有各个文件操作函数(f_open、f_read等)的解释,在移植完文件系统后可以通过相应函数进行操作文件。接下来介绍文件系统的移植步骤。

  1. 将文件系统(从FatFs下载的FatFs文件夹添加至工程中)。

路径添加不用多说,几乎FatFs文件夹及子文件夹都需要加进去,源文件(.c文件)只需要添加diskio.c和ff.c文件即可。

  1. 修改ffconf.h文件的相关宏定义,如下所示,ffconf.h包含了对FatFs功能配置的宏定义。
#ifndef _FFCONF#define	_USE_MKFS		1	/*设置 _USE_MKFS1以使能f_mkfs()函数*/#define _CODE_PAGE	936     /*设置_CODE_PAGE936以使用中文编码而不是932日文编码*/#define _VOLUMES	3		/*支持3个盘符*/#define	_FS_LOCK	3	    /*设置_FS_LOCK3,支持同时打开3个文件*/#define _WORD_ACCESS	1	/*设置_WORD_ACCESS1,支持WORD*/#include "diskio.h"#endif
  1. 完善diskio.c文件中的底层设备驱动函数

       需要完善的底层设备驱动函数包括设备状态获取函数(disk_status)、设备初始化函数(disk_initialize)、扇区读取函数(disk_read)、扇区写入函数(disk_write)和其他控制函数(disk_ioctl),这些函数用于文件系统向下完成对存储块的读写,需要读者实现。

       通过上述步骤即可完成对文件系统的移植,在程序运行时通过f_mount函数即可为相应存储介质挂载文件系统,并通过f_open、f_close和f_read等函数操作文件。

文件系统操作函数

       与文件系统操作有关的函数约有40个,具体可参考FatFs中的内容,下面简单介绍其中的几个函数。

f_mount

       f_mount函数用于为存储介质挂载一个文件系统,文件系统的挂载是指将这个文件系统放在全局文件系统树的某个目录下,完成挂载后才能访问文件系统中的文件,该函数的参数及解释如下。

FRESULT f_mount (FATFS*        fs ,     /* [IN] 文件系统对象 */ const TCHAR* path ,   /* [IN] 逻辑驱动器号 */ BYTE          opt     /* [IN] 初始化选项 */
);

       SD卡挂载文件系统示例:其中FS_VOLUME_SD在diskio.h中定义,1表示强制挂载以检查其是否准备好工作。

FATFS fs;f_mount(&fs, FS_VOLUME_SD, 1);

f_open

       f_open函数用于打开或创建一个文件,该函数的参数及解释如下。

FRESULT f_open (FIL* fp,           /* [OUT] 指向文件对象结构的指针 */const TCHAR* path, /* [IN] 文件名 */BYTE mode          /* [IN] 模式标志 */
);

       其中fp为FTL类型的指针变量,后续对该文件的操作都通过该指针。path为包含文件名的完整路径。mode为对该文件的操作模式,在ff.h文件中定义,各个操作模式的作用如下:
在这里插入图片描述

       SD卡打开文件示例:创建a.txt文件并开启其读权限,若该文件已创建则返回FR_EXIST。

FIL fil;        /* 文件对象 */ f_open(&fil, "0:/a.txt", FA_CREATE_NEW | FA_READ);

f_close

       f_close函数用于关闭已打开的文件,该函数的参数及解释如下。

FRESULT f_close (FIL* fp     /* [IN] 指向文件对象的指针 */
);

       其中fp为FTL类型的指针变量,即f_open函数打开文件时使用的指针。

f_write

       f_write函数用于向文件写入相应长度的数据,该函数的参数及解释如下。

FRESULT f_write (FIL* fp,          /* [IN] 指向文件对象结构的指针 */const void* buff, /* [IN] 指向要写入的数据的指针 */UINT btw,         /* [IN] 要写入的字节数 */UINT* bw          /* [OUT] 指向变量的指针,返回写入的字节数 */
);

       其中fp为FTL类型的指针变量,即f_open函数打开文件时使用的指针。

f_read

       f_readf函数用于向文件写入相应长度的数据,该函数的参数及解释如下。

FRESULT f_read (FIL* fp,          /* [IN] 指向文件对象结构的指针 */void* buff,       /* [IN]  存储读取数据的缓冲区 */UINT btr,         /* [IN] 要读取的字节数 */UINT* br          /* [OUT] 指向变量的指针,返回读取的字节数 */
);

       其中fp为FTL类型的指针变量,即f_open函数打开文件时使用的指针。


http://chatgpt.dhexx.cn/article/jZbx9RXo.shtml

相关文章

PHP的gd2库的安装 和使用注意的一个问题

1.首先确认是否php是否自带了gd2库,确认方法如下: 找到xampp的安装目录 > php文件夹 > ext文件夹 > 看是否有php_gd2.dll文件,如果有就说明已经安装了GD2库。 2.启动phpinfo()来确认GD2库,启动方法: 在xam…

使用gd2绘制基本图形

应用GD2函数可以绘制的图形有多种,最基本的图形包括条、圆、方形等。无论开发人员绘制多么复杂的图形,都是在这些最基本的图形的基础上进行深化的,只有掌握了最基本的图形的绘制方法,才能绘制出各种具有独特风格的图形。 在GD2中可…

xampp开启GD2绘图

默认xampp自带GD2绘图扩展 但是没有开启&#xff0c;需要自己添加 打开php/php.ini 在文件的最后添加 ;GD2库 extensionphp_gd.dll 开启完成后&#xff0c;重启Apache即可生效&#xff01; 随意创建一个文件&#xff0c;内容为 <?phpphpinfo(); ?> 打开后&#x…

初识GD32

什么是GD32&#xff1f; GD32是由北京兆易创新开发的国产32位MCU&#xff0c;基于Arm Cortex-M3/M23/M4内核的32位通用微控制器。目前已经推出GD32F1xx&#xff0c;GD32F2xx&#xff0c;GD32F3xx&#xff0c;GD32F4xx系列&#xff0c;与STM32相比&#xff0c;CPU主频更高&…

php之gd2

一、使用gd2之前首先要开启gd2扩展 Windows下面找到php的配置文件php.ini&#xff0c;搜索extensionphp_gd2.dll&#xff0c;去掉前面的分号即可&#xff1b; 函数介绍 由于gd2的函数比较的长&#xff0c;所有对部分函数进行介绍 1.imagecreatetruecolor — 新建一个真彩色图…

【GD32】GD32工程打开后报错

GD32工程打开后报错&#xff0c;Third Party Device Support for xxxxx 解决办法&#xff1a;修改工程后缀

GD32硬件IIC

GD32E230硬件IIC 我们熟悉IIC都是使用软件代码的形式模拟时序图来编程 现在使用GD32E230中的HAL库中硬件IIC模式IIC。的总线机制都是一种两线接口、简单、双向二线制同步的串行总线&#xff0c;二线制就是时钟线(SCL)和数据线(SDA)两个信号线。IIC寻址时分为主从设备之分&#…

GD32学习

1.简介 关于兆易创新GD32的产品&#xff0c;目前在单片机MCU的业务上&#xff0c;GD全部是32bit的单片机&#xff0c;目前GD32的单片机从内核上区分有Cortex-M3、Cortex-M4、Cortex-M23三个系列&#xff0c;其中红色框框为主推系列&#xff1a; 开发调试环境&#xff1a; 支持主…

了解GD2函数库

PHP目前在Web开发领域已经被广泛应用&#xff0c;PHP不仅可以生成HTML页面&#xff0c;而且可以创建和操作二进制形式的数据&#xff0c;如图像&#xff0c;文件等。其中使用PHP操作图形可以通过GD2函数库来实现。利用GD2函数库可以在页面中绘制各种图像&#xff0c;统计图&…

GDKOI2023 D2T1

前言 相比于D1T1&#xff0c;这题才是真正的签到题&#xff0c;然而&#xff0c;我却爆0了。为了纪念这悲壮的0分&#xff0c;写下了这篇题解。 题目大意 给出 n ( 1 ≤ n ≤ 1 0 5 ) n(1\le n\le 10^5) n(1≤n≤105) 个字符串及其出现时间&#xff08;以几点几分给出&…

一文看懂 GD2库

文章目录 一、 GD2简介1、 验证码&#xff08;实际上是一个img&#xff09; 二、 GD2库使用步骤2.1添加扩展2.2修改php配置文件2.3重启服务 三、 GD2里面的常用方法3.1 imagecreate3.2 imagecolorallocate3.3 imagefill3.4 输出图像资源3.5创建真彩画布3.6在图像中写文字3.6.1i…

MySQL的主从复制

MySQL的主从复制 目录 为什么需要主从复制&#xff1f;MySQL 主从复制概念MySQL 主从复制主要用途MySQL主从形式 一主一从一主多从&#xff0c;提高系统的读性能多主一从 &#xff08;从5.7开始支持&#xff09;双主复制级联复制 MySQL 主从复制原理MySQL主从复制的过程MySQL…

redis主从结构 (一主一从,一主多从,主从从)

关闭防火墙和selinux systemctl disable firewalld.service systemctl stop firewalld vim /etc/selinux/config sed -n 7p /etc/selinux/config SELINUXdisabled setenforce 0 从服务器首次做的是全量同步&#xff0c;且同步的数据会覆盖本机的数据 master 192.168.…

Mysql主从模式

文章目录 &#x1f449;&#x1f3fb;前言❤️主从模式说明&#x1f90d;logbin日志&#x1f90d;Mysql主从复制的流程&#x1f90d;主从复制中遇到的问题 ❤️主从模式配置&#x1f90d;Master配置&#x1f90d;Slave配置 ❤️其他设置&#x1f90d;半同步复制&#x1f90d;并…

mysql主从同步

目录 1.创建主从同步用户 2.授予主从同步权限 3.刷新权限 4.修改master配置文件 5.重启MySQL 6.查看master的状态 7.修改slave配置文件 8.重启mysql 9.构建主从连接信息 10.开始同步 11.查看同步信息 12.同步失败 13.同步报错 13.1 server_id冲突 13.2 initiali…

mysql主从原理

目录 一、主从复制原理 1.原理 2.也就是说 3.注意 随着访问量的不断增多&#xff0c;mysql数据库的压力不断增加&#xff0c;需要对mysql进行优化和架构改造&#xff0c;可以使用高可用、主从复制、读写分离、拆分库、拆分表进行优化。下面我们来学习mysql主从复制高可用如…

MySQL主从复制

一、MySQL主从复制原理 在实际的生产中&#xff0c;为了解决Mysql的单点故障已经提高MySQL的整体服务性能&#xff0c;一般都会采用「主从复制」。 比如&#xff1a;在复杂的业务系统中&#xff0c;有一句sql执行后导致锁表&#xff0c;并且这条sql的的执行时间有比较长&…

Mysql主从同步配置

1. mysql主从同步定义 主从同步使得数据可以从一个数据库服务器复制到其他服务器上&#xff0c;在复制数据时&#xff0c;一个服务器充当主服务器&#xff08;master&#xff09;&#xff0c;其余的服务器充当从服务器&#xff08;slave&#xff09;。因为复制是异步进行的&am…

MySQL 的主从架构

数据库主从概念、优点及用途 主从数据库中主是主库的意思&#xff0c;从是从库的意思。数据库主库对外提供读写操作&#xff0c;从库对外提供读操作。 数据库为什么需要主从架构呢&#xff1f; 高可用&#xff0c;实时灾备&#xff0c;用于故障切换。比如主库挂了&#xff0c…

MySQL主从同步(一主一从、一主多从、主从从)等结构的概述与配置

前言&#xff1a;前面我们了解了MySQL数据库的基础知识&#xff0c;今天及接下来的五天时间里我会给大家带来MySQL进阶方面的一些学习总结&#xff0c;如有不足&#xff0c;还请大家留言指出&#xff1b;下面我们就开始今天的内容。 ** 部署mysql主从同步结构 **  主从同步…