赞
踩
最近做Fatfs项目时,发现一个问题,在xilinx上进行文件系统(Fatfs)移植后,使用emmc作为存储介质进行文件操作时,当emmc中文件存储量达到6个后,第7个文件可以被创建,可以写入,未关闭文件流时,也可以读出。但一旦关闭文件流,就无法找到该文件了。纠结了近一周,问题依旧没有解决,因此为了从头梳理,来写这篇博客。
PS:作为刚上手的小白,早些年就听闻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.写底层驱动函数,对磁盘的初始化,读写扇区。。。
与各自的平台相关,需要用户自己根据存储介质来编写函数。
基本不用动,fatfs的核心,经过了很长时间的迭代。功能日趋完美。
数据类型的定义 与编译器有很大关系。
这里的一些选项我们就要根据自己的需求来改变了。
详细说说:
_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时,簇大小取决于卷大小。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。