当前位置:   article > 正文

FatFs随笔_xsdps

xsdps

概述

最近做Fatfs项目时,发现一个问题,在xilinx上进行文件系统(Fatfs)移植后,使用emmc作为存储介质进行文件操作时,当emmc中文件存储量达到6个后,第7个文件可以被创建,可以写入,未关闭文件流时,也可以读出。但一旦关闭文件流,就无法找到该文件了。纠结了近一周,问题依旧没有解决,因此为了从头梳理,来写这篇博客。

PS:作为刚上手的小白,早些年就听闻Fatfs的大名,因为其代码量少,简单易懂,就决定先上手看看。其中写的不对的地方,欢迎大家评论指正。

Fatfs简介

fatfs作为一个通用的文件系统模块,用于在小型嵌入式系统中实现FAT文件系统。其完全分离于磁盘 I/O 层,因此不依赖于硬件平台。
图示:
来自官网

源码理解

diskio.c 和diskio.h为硬件层。
ff.c 和ff.h是fatfs的文件系统层与文件系统API层。
移植方法其实就是
1.将数据类型的定义写入integer.h
2.配置ff.h 的_MCU_ENDIAN,选择适合当前板卡的大端or小端模式
3.写底层驱动函数,对磁盘的初始化,读写扇区。。。

diskio

与各自的平台相关,需要用户自己根据存储介质来编写函数。

ff

基本不用动,fatfs的核心,经过了很长时间的迭代。功能日趋完美。

interger.h

数据类型的定义 与编译器有很大关系。

ffconfig.h

这里的一些选项我们就要根据自己的需求来改变了。
详细说说:
_FS_TINY 看你是使用哪个版本了
_FS_READONLY 只读
_FS_MINIMIZE 函数使用范围
_USE_STRFUNC 设置是否支持字符串类操作
_USE_MKFS 定时是否使能格式化
_USE_FASTSEEK 快速定位
_USE_LABEL 支持磁盘盘符(磁盘名字)读取与设置
_CODE_PAGE 设置语言类型
_USE_LFN 是否支持长文件名
_VOLUMES 设置FATFS支持的逻辑设备数目
_MAX_SS 扇区缓冲的最大值

应用层接口函数

根据你的编辑器定义好数据类型,将diskio.c的基本函数接口重写。

我这里只列出常用的几个:
f_mkfs - 在驱动器上创建一个文件系统
f_mount - 注册/注销一个工作区域(Work Area)
f_open - 打开/创建一个文件
f_close - 关闭一个文件
f_read - 读文件
f_write - 写文件
f_lseek - 移动文件读/写指针
f_sync - 冲洗缓冲数据 Flush Cached Data


疑难杂症

虽然看着挺简单的,但实际操作时会遇到个各种各样的坑。

记得以前有一个问题就是文件系统只能写入超过4G时文件系统就会崩溃,后来查明原因,因为定义的地址与扇区的地址位数不相同,从而导致数据写入到其他扇区,从而破坏文件系统。

最近依旧在纠结emmc为何写的文件超过6个后,新建的文件就无法找到了。
与文件大小没有关系,同时自己只使用 XSdPs_WritePolled 给扇区直接写数据,一切正常,下电上电操作后,依旧能读出来数据且数据与写入的一致。那么这个文件系统中为何创建超过6个后就找不到第7个新建的文件了呢?
等到问题解决再更新吧!

补充

2019/2/26,问题找到了f_mkfs中对于文件簇大小使用默认的512创建时,导致了该问题,当使用4096或8192时,便可解决该问题。
文件簇大小为什么会导致这种问题?
文件簇为每簇中以字节为单位的分配大小。数值必须为0或从512到32K之间2的幂当指定为0时,簇大小取决于卷大小。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Guff_9hys/article/detail/982579
推荐阅读
相关标签
  

闽ICP备14008679号