一 文件系统:

文件系统是操作系统用于明确存储设备(常见的是磁盘,也有基于NAND Flash的固态硬盘)或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。
操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。文件系统由三部分组成:文件系统的接口,对对象操纵和管理的软件集合,对象及属性。
从系统角度来看,文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,
控制文件的存取,当用户不再使用时撤销文件等。

二 fatfs逻辑

FatFs是用于小型嵌入式系统的通用FAT / exFAT文件系统模块。 FatFs模块是依据ANSI C(C89)标准编写的,并且与磁盘I / O层完全分开。 因此,它的运行独立于平台。
可以将其合并到资源有限的小型微控制器中,例如8051,PIC,AVR,ARM,Z80,RX等。
fatfs写的特别简洁,非常适合入门者学习和熟悉文件系统。借着stm32的开发机会,笔者对fatfs做了一个大致的梳理。
stm32中的fatfs文件系统分层一般分成两层,一层是底层的逻辑,这部分主要是通过配置内存卡的寄存器来实现数据的读写。另外一层是应用逻辑,这部分负责把函数封装成可以调用的文件。
让用户能清晰的操作文件。

三 文件系统的底层逻辑

DSTATUS SD_disk_initialize(BYTE drv)
这个主要是初始化的内存设备,很多存储卡的设备都是标准的,不过,也不排除有些设备的兼容性问题是否可以。这个初始化的时候,一定要对准手册,看一下内存卡命令接口信息。

从sd卡中读取信息:

DRESULT SD_disk_read(BYTE pdrv, BYTE* buff, DWORD sector, UINT count)

往sd卡中写信息,

DRESULT SD_disk_write(BYTE pdrv, const BYTE* buff, DWORD sector, UINT count)

对齐和复位存储设备

DRESULT SD_disk_ioctl(BYTE drv, BYTE ctrl, void *buff)

四 文件系统的应用逻辑

文件系统的应用逻辑非常简单,就是让用户可以自由简单的操作文件。
这部分应用函数主要有以下部分构成:
文件系统的遍历,通过该遍历,可以知道设备下有多少文件以及文件名
FRESULT mf_scan_files(const TCHAR* path)

挂载文件,就是把一个文件挂带到驱动中

FRESULT f_mount (
FATFS* fs, /* Pointer to the file system object (NULL:unmount)*/
const TCHAR* path, /* Logical drive number to be mounted/unmounted */
BYTE opt /* Mode option 0:Do not mount (delayed mount), 1:Mount immediately */
)

创建或者打开文件

/*-----------------------------------------------------------------------*/
/* Open or Create a File */
/*-----------------------------------------------------------------------*/

FRESULT f_open (
FIL* fp, /* Pointer to the blank file object */
const TCHAR* path, /* Pointer to the file name */
BYTE mode /* Access mode and file open mode flags */
)

读取文件

FRESULT f_read (
FIL* fp, /* Pointer to the file object */
void* buff, /* Pointer to data buffer */
UINT btr, /* Number of bytes to read */
UINT* br /* Pointer to number of bytes read */
)

写文件

FRESULT f_write (
FIL* fp, /* Pointer to the file object */
const void* buff, /* Pointer to the data to be written */
UINT btw, /* Number of bytes to write */
UINT* bw /* Pointer to number of bytes written */
)

同步文件

FRESULT f_sync (
FIL* fp /* Pointer to the file object */
)

关闭文件

FRESULT f_close (
FIL* fp /* Pointer to the file object to be closed */
)

这里还有目录级别的操作,比如,打开文件目录,遍历文件目录,这就不一一赘述了。

五 后记

文件系统在计算机中是一个重要的部分,是一个计算机系统中的地图,它可以让存储的信息分成一个个小单元,达到使用者容易辨识的境地。

stm32 fatfs 文件系统分析和代码解析的更多相关文章

  1. php文件上传代码解析

    php文件上传代码解析 is_uploaded_file()  //函数判断指定的文件是否是通过 HTTP POST 上传的,返回一个布尔值. $_FILES['upfile']['tmp_name' ...

  2. 【转】使用JavaParser获得Java代码中的类名、方法形参列表中的参数名以及统计总的文件个数与不能解析的文件个数

    遍历目录查找Java文件: public static void ergodicDir(File dir, HashSet<String> argNameSet, HashSet<S ...

  3. proc文件系统分析

    来源: ChinaUnix博客 日期: 2008.01.03 11:46 (共有条评论) 我要评论   二 proc文件系统分析  根据前面的分析,我们可以基本确定对proc文件系统的分析步骤.我将按 ...

  4. linux内存管理--slab及其代码解析

    Linux内核使用了源自于 Solaris 的一种方法,但是这种方法在嵌入式系统中已经使用了很长时间了,它是将内存作为对象按照大小进行分配,被称为slab高速缓存. 内存管理的目标是提供一种方法,为实 ...

  5. MYSQL常见出错mysql_errno()代码解析

    如题,今天遇到怎么一个问题, 在理论上代码是不会有问题的,但是还是报了如上的错误,把sql打印出來放到DB中却可以正常执行.真是郁闷,在百度里面 渡 了很久没有相关的解释,到时找到几个没有人回复的 & ...

  6. C#和Java中执行SQL文件脚本的代码(非常有用)

    原文:C#和Java中执行SQL文件脚本的代码(非常有用) 我们在做程序的时候有事后会涉及到利用sql文件 直接执行,可是在sql文件中有很多注释,我们要一句一句的执行首先必须的得把sql文件解析 去 ...

  7. java利用WatchService实时监控某个目录下的文件变化并按行解析(注:附源代码)

    首先说下需求:通过ftp上传约定格式的文件到服务器指定目录下,应用程序能实时监控该目录下文件变化,如果上传的文件格式符合要求,将将按照每一行读取解析再写入到数据库,解析完之后再将文件改名. 一. 一开 ...

  8. Postgres中postmaster代码解析(中)

    今天我们对postmaster的以下细节进行讨论: backend的启动和client的连接请求的认证 客户端取消查询时的处理 接受pg_ctl的shutdown请求进行shutdown处理 2.与前 ...

  9. [代码]解析nodejs的require,吃豆人的故事

    最近在项目中需要对nodejs的require关键字做解析,并且替换require里的路径.一开始我希望nodejs既然作为脚本语言,内核提供一个官方的parser库应该是一个稳定可靠又灵活的渠道,然 ...

  10. 【原创】大数据基础之Spark(5)Shuffle实现原理及代码解析

    一 简介 Shuffle,简而言之,就是对数据进行重新分区,其中会涉及大量的网络io和磁盘io,为什么需要shuffle,以词频统计reduceByKey过程为例, serverA:partition ...

随机推荐

  1. [XXL-JOB] 分布式调度XXL-JOB快速上手

    1.概述 1.1什么是任务调度 我们可以思考一下下面业务场景的解决方案: 某电商平台需要每天上午10点,下午3点,晚上8点发放一批优惠券 某银行系统需要在信用卡到期还款日的前三天进行短信提醒 某财务系 ...

  2. AnyCAD程序无法启动的问题解决方法

    在某些电脑上会出现基于AnyCAD开发的程序无法启动的问题,如: System-ArgumentEcception: Please check the dependendes 解决方法 安装最新的VS ...

  3. 在Spring Cloud 2020中使用Consul配置中心遇到的问题

    升级Spring Cloud 2020后发现Consul配置中心失效了,配置中心的配置和bootstrap.yml中的配置都没有生效. 话不多说,先看官方文档:https://docs.spring. ...

  4. 【二叉树】二叉树的深度优先遍历DFS(前中后序遍历)和广度优先遍历BFS(层序遍历)详解【力扣144,94,145,102】【超详细的保姆级别教学】

    [二叉树]二叉树的深度优先遍历(前中后序遍历)和广度优先遍历(层序遍历)详解[超详细的保姆级别教学] 先赞后看好习惯 打字不容易,这都是很用心做的,希望得到支持你 大家的点赞和支持对于我来说是一种非常 ...

  5. Leetcode刷题第四天-双指针-二分法

    15:三个数之和 链接:15. 三数之和 - 力扣(LeetCode) em...双冲for循环,从头去遍历,0-(a+b)是否在列表中,最终timeout 数组从小到大排序,设置三个指针,i从头遍历 ...

  6. 使用C语言构建一个独立栈协程和共享栈协程的任务调度系统

    使用了标准库头文件 <setjmp.h>中的 setjmp 和 longjmp两个函数,构建了一个简单的查询式协作多任务系统,支持独立栈和共享栈两种任务. 其中涉及到获取和设置栈的地址操作 ...

  7. 山东职业竞赛wp2023(arm、cpython)

    pwn2 return2libc,白给 from evilblade import * context(os='linux', arch='amd64') context(os='linux', ar ...

  8. JS leetcode 加一 题解分析

    壹 ❀ 引 今天是刷leetcode的第三天,根据推荐优先刷数据结构相关的卡片,先把数据结构知识体系建立起来,不然就是题目无从下手答案也看不懂的尴尬局面.那么今天的题目是加一,老规矩,先记录自己的解题 ...

  9. NC16611 [NOIP2009]最优贸易

    题目链接 题目 题目描述 C国有n个大城市和m条道路,每条道路连接这n个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这m条道路中有一部分为单向通行的道路,一部分为双向通行的道路,双向 ...

  10. 适配http分发Directory.Build.props文件,需要替换默认的微软sdk:8.0映像

    背景 我们是把Directory.Build.props及其Import的文件,都放在http://dev.amihome.cn 那么docker build的时候,也是需要下载Directory.B ...