STM32使用FAT文件系统-代码简读

news2024/9/29 5:39:01

FAT的一些基础知识、概念先看我这一篇:

FAT32文件和目录的组织方式_fat32文件系统架构设计_暴躁的野生猿的博客-CSDN博客

fat文件系统的所有外部接口都在ff.h中

物理驱动器、逻辑驱动器

一个物理驱动器就是一个真实的存储设备,例如一个硬盘、一个内存卡。

逻辑驱动器就是一个虚拟概念,一个硬盘可以分成CDEF共4个盘,每个盘就是一个逻辑驱动器。

在FAT源码中有个宏 _VOLUMES,这个宏被用于配置FAT源码支持多少个逻辑驱动器。具体要配置成多少,看业务需求。

FAT源码中有个全局指针数组如上*FatFs,这个指针的每一项指向的实体就是f_mount函数的第一个形参。见下图和下文解析。

挂载:f_mount

使用文件系统的第一步,就是挂载。

函数原型:FRESULT f_mount (FATFS* fs, const TCHAR* path, BYTE opt);            /* Mount/Unmount a logical drive */

static FATFS fs;
FRESULT  fres = f_mount (&fs, "0:/", 1);

该函数用于从磁盘或内存卡等存储介质中,读取文件系统的信息到内存中(其实就是存到上述示例代码中的变量fs中),之后通过fs变量可以获取FAT表的物理地址、存储单元大小、该FAT所在的物理驱动器编号等信息。

path参数用于指定逻辑驱动器,所谓逻辑驱动器就类似于电脑中的"c:/"、"d:/"等盘符,在FAT文件系统中这个逻辑盘符就是"0:"、“1:”、"2:"......等。这个字符串在FAT源码中被用于匹配一个逻辑驱动器的编号。"0:"就代表第一个盘符,对应的编号为数字0。看下图,源码中是如何把字符串path转成编号变量vol的。

再看get_ldnumber函数(全名:获取逻辑驱动器编号get logical driver number)的实现:尤其关注下图红色箭头的代码,搞了半天,原来就是把字符串"0:"中冒号前面的字符减掉"0"(这是C语言基本操作,不再赘述)就得到了逻辑驱动器编号,按照这个源码的逻辑就是"0:"就对应0号,"1:"就对应1号。

上图中还有一个全局FatFs指针数组的赋值,对于"0:/"逻辑驱动器,这个驱动器的简要文件系统信息就被存到了形参fs指向的实体中,同时FatFs[0]也指向这个实体。在ff.c源码中,到处都在调用这个全局FatFs指针数组,例如格式化函数中。据此我们得知,凡是需要用到FatFs指针数组的地方,必须得在f_mount执行成功以后才行,不然就会触发野指针程序崩溃。

再回到f_mount源码截图第2个红色箭头,find_volume函数中,这个vol编号被用于索引FAT表。插播一条基础知识:每一个逻辑驱动器的前面部分,都有一个FAT表。find_volume的最终效果就是把指定逻辑驱动器的信息读取到了内存中的fs变量中。

f_mount的第三个参数是个选项,填0=稍后挂载,填1=立即挂载。编程时基本上都是填1。

格式化:f_mkfs

所谓格式化,其实就是创建FAT表,mkfs全名make file system。函数原型:

FRESULT f_mkfs (const TCHAR* path, BYTE sfd, UINT au);   

这个所做的事情,就是向存储设备中写入DBR、FAT1、FAT2,这3部分信息,详情参考文章开头的文章。

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

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

相关文章

抓拍摄像机开关量控制4K高清手机远程看图建筑生长定时缩时相机

作为物联网数据采集解决方案专业提供商,数采物联网小编daq-iot 在这里做以下内容介绍,并诚挚的欢迎大家讨论和交流。 项目案例参考视频: https://www.bilibili.com/video/BV1Kp4y1T7wQ/?spm_id_from333.999.0.0 4K高清太阳能供电定时拍照相机,通过光…

无涯教程-JavaScript - HEX2BIN函数

描述 HEX2BIN函数将十六进制数转换为二进制数。 语法 HEX2BIN (number, [places])争论 Argument描述Required/Optionalnumber 您要转换的十六进制数。 数字不能超过10个字符(40位)。数字的最高有效位是符号位(从右数第40位)。其余的39位是幅度位。 负数使用二进制补码表示。…

人工智能在电子商务中的突破性优势

最近都听说人工智能(AI)吗?电子商务的人工智能方面尤其受欢迎。当您以正确的方式使用正确的 AI技术时,您可以彻底改变您的经营方式。AI可帮助您节省时间、减少手动工作并提高数据的质量和准确性。 从本质上讲,您现在可…

移动硬盘或U盘无法弹出的解决方法

以下内容源于网络资源的学习与整理,如有侵权请告知删除。 最近在红米本win11中总遇到“该设备正在使用中”而无法弹出硬盘的问题。 解法该问题的思路:先定位占用该设备的进程,然后结束该进程。 定位进程 既然设备被占用,那肯定…

分享一下有哪些微信营销活动

微信营销活动是商家利用微信平台进行宣传和推广的一种重要方式。通过精心策划的微信营销活动,商家可以吸引更多的潜在客户,提高品牌知名度和销售额。本文将介绍几种常见的微信营销活动。 一、抽奖活动 抽奖活动是微信营销中一种非常常见的活动形式。商家…

MySQL:区分大小写

查看MySQL版本 show variables; 1、查看 MySQL 当前的区分大小写设置: SHOW VARIABLES LIKE lower_case_table_names; 或者 show Variables like %table_names 2、更改大小写敏感设置: 在 MySQL 5.7 中,更改大小写敏感设置要求修改配置文件 …

2023/9/7 -- C++/QT

作业 1> 思维导图 2> 封装一个结构体,结构体中包含一个私有数组,用来存放学生的成绩,包含一个私有变量,用来记录学生个数, 提供一个公有成员函数,void setNum(int num)用于设置学生个数 提供一个…

赠书福利开始啦—〖Effective软件测试〗

文章目录 ❤️赠书——《Effective软件测试》🌛书籍简介🌛图书链接❤️活动介绍 ❤️赠书——《Effective软件测试》 🌛书籍简介 🌟专家赞誉 本书是一本内容深刻的软件测试书籍,讲述如何平衡研发效率和整体质量来更高…

使用 UPFC 计算电力系统网络潮流(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

Ubuntu yolov5 环境配置

查看Ubuntu版本 $ cat /proc/version Linux version 5.4.0-150-generic (builddbos03-amd64-012) (gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)) #167~18.04.1-Ubuntu SMP Wed May 24 00:51:42 UTC 2023虚拟机磁盘扩容 因为在环境搭建过程中遇到了磁盘空间不足的问题&a…

索尼 toio™ 应用创意开发征文|探索创新的玩乐世界——索尼 toio™

导语: 在技术的不断进步和发展中,玩具也逐渐融入了智能化的潮流。索尼 toio™作为一款前沿的智能玩具,给孩子和成人带来了全新的游戏体验。本文将介绍索尼 toio™的特点、功能和应用场景,让读者了解这个令人兴奋的创新产品。 1. 了…

抢先一步,新华三携手HPE正在重塑AI存储新格局

当前智能IT的创新 正呈现出蓬勃发展之势 【全球存储观察 | 热点关注】 当前,数字经济在中国获得了长足进步,并驱动着算力快速进化。为此,智能IT的创新也呈现出了前所未有的蓬勃之势。 从智能存储中枢发布到现在,新华…

LAMP搭建wordpress并使用reids加速网页

L linux A apache hhtpd M mysql/maridb P PHP1、 安装php rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm yum install -y --enablereporemi --enablereporemi-php72 php php-opcache php-devel php-mysqlnd php-gd php-redis2、 安装mysql5.7 2.1、…

考完试家长怎么查看孩子成绩和等级?

考试结束了,孩子们的成绩和等级也出来了,对于家长来说,如何快速方便地查看孩子的成绩和等级呢?今天,我要向大家介绍一个非常实用的工具——易查分,让家长们便捷高效了解孩子的学习成果。 好消息&#xff01…

如何封装自动化测试框架?(超详细~)

封装自动化测试框架,测试人员不用关注框架的底层实现,根据指定的规则进行测试用例的创建、执行即可,这样就降低了自动化测试门槛,能解放出更多的人力去做更深入的测试工作。 本篇文章就来介绍下,如何封装自动化测试框…

【已解决】ognl.PropertyAccessor

在Spring boot2.x用TemplateEngine处理数据得时候&#xff0c;出现以下错误&#xff1a; 定位到代码行&#xff1a; 解决办法&#xff1a;修改thymeleaf的依赖&#xff1a; <!-- thymeleaf --><dependency><groupId>org.thymeleaf</groupId><…

低功耗窗帘电机解决方案成功应用并通过 Matter 1.1 认证

Nordic Semiconductor官方宣布与HooRii Tech&#xff08;和众科技&#xff09;携手合作&#xff0c;基于 Nordic nRF52840 芯片平台打造的 HRN71模组&#xff0c;成功赋能低功耗窗帘电机品牌发布Matter产品。低功耗窗帘电机获得 Matter 1.1 认证意味着它具有与其他 Matter 认证…

C. Ntarsis‘ Set

Problem - C - Codeforces 思路&#xff1a;这个题求一个满足条件的最小的&#xff0c;我们可以想到二分可以求满足条件的最小值&#xff0c;我们考虑二分答案&#xff0c;当当前的枚举的为mid时&#xff0c;我们考虑它会怎样变化&#xff0c;首先一开始mid的排名就是mid&#…

Python,Bytetrack 源码解读,参数,源码解释,逐句分析代码,目标追踪

文章目录 1、得到索引2、高得分框参与匹配&#xff0c;可能会留下有匹配不了的框3、低得分框参与匹配4、处理 unconfirmed 匹配5、创建新的【STrack对象】6、扔掉太久没匹配到框的【STrack对象】7、输出追踪框 1、得到索引 self.args.track_thresh是轨迹阈值。轨迹的得分是iou…

RabbitMQ: topic 结构

生产者 package com.qf.mq2302.topic;import com.qf.mq2302.utils.MQUtils; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection;public class Pubisher {public static final String EXCHANGE_NAME"mypubilisher";public static void ma…