关于FatFs文件系统的指引

关于FATFS的使用记录一、提前说明二、各文件说明三、使用说明       3.1 diskio.c函数的编写       3.2 f_open读写性质说明       3.3 ff的API函数四、关于SD卡协议与FatFs系统的单位解释

一、提前说明

  • FatFs 应用范围:

    支持FAT12、FAT16 和FAT32; 可打开的文件:无限制,依赖于有效的存储器; 支持最多 10 个卷; 文件大小:与FAT 类型有关(upto 4G-1 bytes); 卷大小:与FAT 类型有关(upto 2T bytes on 512 bytes/sector); 簇大小:与FAT 类型有关(upto 64K bytes on 512 bytes/sector); 扇区大小:与FAT 类型有关(upto 4K bytes)。

  • FAT文件系统依次为:引导扇区、两个文件分配表、根目录区和数据区。

  • 重要的结构体:

    • 文件对象结构体(FIL类型):存放文件的相关信息,打开关闭读写文件等操作时需要使用其指针 ;

    • 目录对象结构体(DIR类型):存放目录的相关信息,对目录操作时需要其指针 ;

    • 文件状态结构体(FILINFO类型):存放文件的大小属性文件名等信息;

    • 文件系统对象结构体(FATFS类型):文件系统对象的参数。

  • 移植步骤:

    • 数据类型:在integer.h 里面去定义好数据的类型。这里需要了解你用的编译器的数 据类型,并根据编译器定义好数据类型;

    • 配置:打开 ffconf.h (我用的FatFs,不是Tiny,可以在此头文件中进行定义),文 件系统的配置裁剪等均在此头文件中进行定义配置;

    • 函数编写:打开diskio.c,进行底层驱动编写,实际上需要编写6 个接口函数(见下方函数具体说明)。

二、各文件说明

文件名 功能 操作说明
ffconf.h FATFS模块配置文件 需要根据需求来配置参数。
ff.h FATFS和应用模块公用的包含文件 不需要修改
ff.c FATFS模块源码 不需要修改
diskio.h FATFS和disk I/O模块公用的包含文件 不需要修改
diskio.c FATFS和disk I/O模块接口层文件 与平台相关的代码,需要用户根据平台和存储介质来编写函数
interger.h 数据类型定义 与编译器有关。

三、使用说明

3.1 diskio.c函数的编写

1、disk_initialize初始化磁盘驱动器

2、disk_status返回当前磁盘驱动器的状态

3、disk_read 从磁盘驱动器上读取扇区

4、disk_write 向磁盘写入一个或多个扇区

5、disk_ioctl 控制设备指定特性和除了读/写外的杂项功能

6、get_fattime 获取当前时间

3.2 f_open读写性质说明

f_open:创建/打开一个用于访问文件的文件对象

3.3 ff的API函数

FATFS给用户提供了大量的API函数:

函数名称 函数作用
f_mount 注册/注销一个工作区域(Work Area)
f_open 打开/创建一个文件
f_close 关闭一个文件
f_read 读文件
f_write 写文件
f_lseek 移动文件读/写指针
f_truncate 截断文件
f_sync 冲洗缓冲数据Flush Cached Data
f_forward 直接转移文件数据到一个数据流
f_stat 获取文件状态
f_opendir 打开一个目录
f_closdir 关闭一个已经打开的目录
f_readdir 读取目录条目
f_mkdir 创建一个目录
f_unlink 删除一个文件或目录
f_chmod 改变属性(Attribute)
f_utime 改变时间戳(Timestamp)
f_rename 重命名/移动一个文件或文件夹
f_chdir 改变当前目录
f_chdrive 改变当前驱动器
f_getcwd 获取当前工作目录
f_getfree 获取空闲簇Get Free Clusters
f_getlabel 获取卷标签
f_setlabel 设置卷标签
f_mks 在驱动器上创建一个文件系统
f_fdisk 分割物理卷
f_gets 读一个字符串
f_putc 写一个字符
f_puts 写一个字符串
f_printf 写一个格式化的字符串
f_tell 获取当前读/写指针
f_eof 测试文件结束
f_size 获取文件大小
f_error 测试文件上的错误

四、关于SD卡协议与FatFs系统的单位解释

如果使用SD卡,那么在SD2.0协议中明明说block为512字节(bytes)。

那为什么在FatFs中,sector size才是512字节呢?这不是错了吗?

其实文件系统的sector和block 与 SD协议的sector和block含义正好相反

  • 在SD协议中,大小包含关系是:block ⊆ sector

  • 而在FatFs中相反:sector ⊆ blockr

由此可知,在disk_ioctl中GET_SECTOR_SIZE和GET_BLOCK_SIZE,可以有以下关系:

  • 最大:8192 (4096kb / 512bytes)data blocks(SD) == 8192 sector(FatFs) == 1 block(FatFs)

  • 最小:1 data blocks(SD) == 1 sector(FatFs) == 1 block(FatFs)

block section
SD a number of bytes, basic data transfer unit a number of blocks, basic erase unit
FATFS A “block”, a contiguous number of bytes, is the minimum unit of memory that is read from and written to a disk by a disk driver The sector is the minimum storage unit of a hard drive

c++ 读文件 文件指针 继续读_FatFs文件系统使用笔记相关推荐

  1. mfc如何判断读到文件尾_C++ 判断读取文件尾

    主要在于eof()不只是读取文件的最后一个字符,它会接着往后读取,如果此函数返回ture时,则此时返回的文件结束符0xFF才是真正的结尾. 具体内容如下: 在使用C/C++读文件的时候,一定都使用过e ...

  2. Python文件操作IO open 读-取-写

    PythonIO文件操作,读.取.写 本篇内容 文件的操作. ▷文件的练习 ▷文件的操作 读取信息 .写入信息.文件有那么多的字,在什么地方写入.怎么 控制它. 文件对象 ===  读取 === 写入 ...

  3. C语言文件操作 fopen, fclose, mkdir(打开关闭文件,建文件夹,判断文件是否存在可读或可写)

    1.建文件夹 int _mkdir(const char *path,mode_t mode); 函数名: _mkdir 功 能: 建立一个目录 用 法: int _mkdir( const char ...

  4. python3生成文件对象(五分钟读懂)

    生成文件对象 fileobject = open(filename,mode) # python2 python3 都可以用 fileobject = open(filename,mode) 常用的特 ...

  5. 三元运算符,文件处理的可读可写

    1.三元运算符 1.1介绍 三元运算符又称三目运算,是对简单的条件语句的简写 语法:val =1 if 条件成立 else 2 简单条件语句: a = 0 if a == 0:val = 0 else ...

  6. python如何读pst文件_Python 学习 第11篇:文件读写

    Python的文件是一个重要的对象,使用open()函数来打开文件,创建文件对象,进行文件的读写操作.当数据用于交换信息时,通常需要把数据保存为有格式的文本数据,可以保存为有特定的行分隔符和列分隔符的 ...

  7. 滴水三期逆向基础系列(一)-读取文件到内存再读取回文件

    跟着滴水三期学了很长时间了,本着,每一点都要吃透的精神,跟"读文件到内存(拉伸),再读回文件(压缩回来)"杠了一天.先看看按着老师的架构写的代码吧(老师的代码有很多问题(可能是我太 ...

  8. python读写文件详解,将数据写入一个文件或读一个文件写入另一个文件中。

    目录 实践一:读取文件并打印,read() 实践二:读取文件的一行并打印,readline() 实践三:读取文件的所有行存入到一个列表中并打印,readlines() 实践四:向文件中写入字符串,wr ...

  9. C++ 学习(15)文件操作、文件文件读与写操作、二进制文件读与写操作

    程序运行时产生的数据者属于临时数据,程序一旦运行结束临时数据都会被释放.通过文件可以将数据持久化. C++ 文件操作 C++中对文件操作需要包含头文件<fstream> 文件类型分为两种: ...

最新文章

  1. 机器学习算法学习---模型融合和提升的算法(五)
  2. 报道称:Check Point正在洽谈收购CyberArk
  3. JavaScript——定时器(setTimeout/setInterval)
  4. ABP v1.0正式发布
  5. linux字符设备驱动之字符之异步通知
  6. tensorflow 学习资料汇总
  7. markdown编辑器 使用语法
  8. Mysql replace 与 insert on duplicate效率分析
  9. the road to TCPIP(1)--TCPIP详解--数据链路层
  10. 中国互联网变天,小米上市后将彻底冲破 BAT 格局
  11. ORACLE有EXCEL中trend函数,【Excel函数】TREND函数 - 曹海峰个人博客
  12. 驱动精灵w8ndows xp sp2,爱普生Epson TM-L60II打印机驱动官方正式版下载,适用于winxp,winvista,win7,win8,win10-驱动精灵...
  13. F28335的SCI模块
  14. VDA6.3认证辅导,VDA6.3认证以保证汽车零部件生产过程中的质量保证
  15. 用Navicat连接阿里云数据库RDS
  16. 支付宝|微信|h5|个人收款免签约支付系统源码
  17. Cocos Creator转盘抽奖
  18. 玫瑰线 matlab,如何用MATLAB画玫瑰线
  19. SVG黑科技微信排版『层层左右交错滑开』模板代码
  20. 整理了一波年终总结模版,速领!

热门文章

  1. python 内置函数的一部分
  2. I.MX6 Goodix GT9xx touchscreen driver porting
  3. Programming in Scala (Second Edition) 读书笔记12 Trais
  4. C#中的MessageBox消息对话框
  5. JDBC连接数据库总结
  6. Google的系统工程师(SA)如何工作
  7. 用标号跳出当前多重嵌套循环是否继续执行循环_4、在JAVA中如何跳出当前的多重嵌套循环?-Java面试题答案...
  8. 计算机的主要硬件部件,主要内容: 计算机的基本概念 系统硬件组成(主要部件、系...的.ppt 文档全文预览...
  9. spark编程mysql数据源_Spark - 直接操作数据源 MySQL
  10. mysql sqlserver对比_很用心的写了 9 道 MySQL 面试题