ImageVerifierCode 换一换
格式:DOCX , 页数:16 ,大小:24.10KB ,
资源ID:27705631      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/27705631.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(stm32sdiofatfs文件系统源码分析.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

stm32sdiofatfs文件系统源码分析.docx

1、stm32sdiofatfs文件系统源码分析、概述1、目的在移植之前,先将源代码大概的阅读一遍,主要是了解文件系统的结构、各个函数的功能和接口、与移植相关的代码等等。2、准备工作在官方网站下载了 0.07c 版本的源代码,利用记事本进行阅读。二、源代码的结构1、源代码组成源代码压缩包解压后,共两个文件夹,doc是说明,src里就是代码。src文 件夹里共五个文件和一个文件夹。文件夹是 option,还有OOreadme.txt、diskio.c、diskio.h、ff.c、ff.h、integer.h。对比网上的文章,版本已经不同了,已 经没有所谓的 tff.c 和 tff.h 了,估计现在都

2、采用条件编译解决这个问题了,当然 文件更少,可能编译选项可能越复杂。2、 00readme.txt 的说明Low level disk I/O module is not included in this archive because the FatFsmodule is only a generic file system layer and not depend on any specificstorage device. You have to provide a low level disk I/O module that writtento control your storage

3、 device .主要是说不包含底层10代码,这是个通用文件系统可以在各种介质上使用。我们移植时针对具体存储设备提供底层代码。接下来做了版权声明 -可以自由使用和传播。然后对版本的变迁做了说明。3、源代码阅读次序先读integer.h,了解所用的数据类型,然后是ff.h, 了解文件系统所用的数据 结构和各种函数声明,然后是diskio.h,了解与介质相关的数据结构和操作函 数。再把ff.c和diskio.c两个文件所实现的函数大致扫描一遍。最后根据用户应 用层程序调用函数的次序仔细阅读相关代码。三、源代码阅读1、 integer.h 头文件这个文件主要是类型声明。以下是部分代码。typedef

4、 intINT;typedef unsigned int UINT;typedef signed charCHAR;/* These types must be 8-bit integer */都是用 typedef 做类型定义。移植时可以修改这部分代码,特别是某些定义 与你所在工程的类型定义有冲突的时候。2、 ff.h 头文件以下是部分代码的分析#include “ intege使用 integer.h 的类型定义#ifndef _FATFS#define _FATFS 0x007版本号 007c, 0.07c#define _WORD_ACCESS 0如/果定义为 1,则可以使用 word

5、 访问。中间有一些看着说明很容易弄清楚意思。这里就不例举了。#define _CODE_PAGE 936/* The _CODE_PAGE specifies the OEM code page to be used on the target system./936 -Simplified Chinese GBK (DBCS, OEM, WindoW跟据这个中国应该是 936.打开option文件夹看一下。打开CC936.C文件,里面有一个很大的数组 static const WCHAR uni2oem。根据英文说明,这个数组用于 uni code码和OEM码之间的相互转换。接下来又有两个函

6、数ff_convert()和ff_wtoupper()具体执行码型转换和将字 符转换为大写。XX一下:看OEM码什么意思。unicode 是一种双字节字符编码,无论中文还是英文,或者其他语言统一到2 个字节。与现有的任何编码(ASCII,GB等)都不兼容。Win dowsNT(2000的内核即使用该编码,所有数据 进入内核前转换成UNICODE退出内核后在转换成版本相关的编码(通常称为 OEM,在简体中文版下即为 GB).(XX所得)继续往下阅读。#define _USE_LFN 1/这/ 个估计是长文件名支持了,以前的 0.06 版本好像是 不支持。#define _MAX_LFN 255/

7、最长支持 255个双字节字符。#define _FS_RPATH 0/是/ 否文件相对路径选项。/* When _FS_RPATH is set to 1, relative path feature is enabled and f_chdir,/f_chdrive function are available./ 有些函数会受影响。/Note that output of the f_readdir fnction is affected by this option. */#define _FS_REENTRANT 0如/果要支持文件系统可重入,必须加入几个函 数。#define _TI

8、MEOUT1000/* Timeout period in unit of time ticks of the OS */#define _SYNC_tHANDLE/* Type of sync object used on the OS. e.g. HANDLE,OS_EVENT*, ID and etc. */ /* To make the FatFs module re-entrant, set _FS_REENTRANT to 1 and add user /provided synchronization handlers, ff_req_grant, ff_rel_grant, f

9、f_del_syncobj /and ff_cre_syncobj function to the project. */ #elif _CODE_PAGE = 936 /* Simplified Chinese GBK */ #define _DF1S 0 x 81 #define _DF1E 0xFE #define DS1S0 x 40 #define _DS1E 0x7E #define DS2S 0 x 80 #define _DS2E 0xFE小写、数字。暂时不理会它。接下来很大一部分都是与语言相关的因素,略过。#define IsUpper(c) (c)=A)&(c)= a)&(

10、c)=0,)&(c)v二 9 ,/* Character code support macros */ 三个宏判断是否大写、)#if _DF1S/* DBCS configuration */双字节编码相关的设定,#if _MULTI_PARTITION/* Multiple partition configuration */ / 该变量定义为 1 时,支持一个磁盘的多个分区。typedef struct _PARTITION BYTE pd;/* Physical drive# */BYTE pt;/* Partition # (0-3) */ PARTITION;Externc on s

11、t PARTITION Drives;如果支持分区,则声明变量 Drivers #defi ne LD2 PD(drv) (Drivesdrv. pd)/*获得磁盘对应的物理磁盘 #defi ne LD2 PT(drv) (Drivesdrv. pt)/*获得磁盘对应的分区 #else/* Single partition configuration */ #define LD2PD(drv) (drv)/* Physical drive# is equal to the logical drive# */ #define LD2PT(drv) 0/* Always mounts the 1s

12、t partition */ #if _MAX_SS = 512/一/ 般扇区长度取 512字节。#defineSS(fs)512U #if _LFN_UNICODE & _USE_LFN typ edef WCHAR XCHAR;/* Un icode */ XCHA是文件名的码型所用。#else typedef char XCHAR;/* SBCS, DBCS */ #endif typedef struct _FATFS_ BYTEfs_type;/* FAT sub type */BYTEdrive;/*对应实际驱动号01 */BYTEcsize;/*每个簇的扇区数目*/先查一下簇的含

13、义:应该是文件数据分配的基本单位。BYTEn_fats;/*文件分配表的数目*/FAT文件系统依次应该是:引导扇区、文件分配表两个、根目录区和数据 区。BYTEwflag;/* win dirty flag (1:must be written back) */文件是否改动的标志,为1时要回写。WORDid;/* File system mount ID文 件系统加载 ID*/WORDn_rootdir;/*根目录区目录项的数目*/#if _FS_REENTRANT_SYNC_tsobj;/*允许重入,则定义同步对象*/#endif#if _MAX_SS != 512WORDs_size;/*

14、 Sector size */#endif#if! FS READONLY文件为可写BY TEfsi_flag;/* fsinfo dirty flag (1:must be writte n back) */ 文件需要回写的标志DWORDlast_clust;/* Last allocated cluster */DWORDfree_clust;/* Number of free clusters */DWORDfsi_sector;/* fsinfo sector */#endif#if _FS_RPATHDWORDcdir;/*使用相对路径,则要存储文件系统当前目录#endifDWORD

15、sects_fat;/*文件分配表占用的扇区DWORDmax_clust;/*最大簇数DWORDfatbase;/*文件分配表开始扇区DWORDdirbase;/*如果是FAT32根目录开始扇区需要首先得到。DWORDdatabase;/*数据区开始扇区DWORDwinsect;/* Current sector appearing in the win */目前的扇区在win里面,这个win数组暂时还不知道含义。BYTEwin_MAX_SS;/* Disk access window for Directory/FAT */这是一个win512数组,存储着一个扇区,好像作为扇区缓冲使用。 F

16、ATFS;typedef struct _DIR_ FATFS* fs;/* Pointer to the owner file system object */指向相应文件系统对象。WORDid;/*文件系统加载ID*/WORDindex;/* Current read/write index number */ 目前读写索引代码DWORDsclust;/* Table start cluster (0:Static table) */文件数据区开始簇DWORDclust;/* Current cluster */目前处理的簇DWORDsect;/* Current sector */目前簇

17、里对应的扇区BYTE*dir;/* Pointer to the current SFN entry in the win */BYTE*fn;/* Pointer to the SFN (in/out) file8,ext3,status1 */#if _USE_LFNWCHAR*lfn;/* Pointer to the LFN working buffer */ 指向长文件名缓冲。WORDlfn_idx;/* Last matched LFN index number (0xFFFF:No LFN) */#endif DIR;typedef struct _FIL_ FATFS* fs;

18、/* Pointer to the owner file system object */WORDid;/* Owner file system mount ID */BYTEflag;/* File status flags */文件状态标志BYTEcsect;/* Sector address in the cluster *扇/ 区偏移DWORDfptr;/* File R/W pointer */ 读写指针DWORDfsize;/* File size */DWORDorg_clust;/* File start cluster */ 文件开始簇DWORDcurr_clust;/* C

19、urrent cluster */ 当前簇DWORDdsect;/* Current data sector */ 文件当前扇区#if !_FS_READONLYDWORDdir_sect; /* Sector containing the directory entry */ 该文件目录项对应 所在的扇区 BYTE*dir_ptr;/* Ponter to the directory entry in the window */#endif#if !_FS_TINYBYTEbuf_MAX_SS;/* File R/W buffer */文件读写缓冲#endif FIL;/* File sta

20、tus structure */typedef struct _FILINFO_ DWORDfsize;/* File size */WORDfdate;/* Last modified date */WORDftime;/* Last modified time */BYTEfattrib;/* Attribute */char fname13;/* Short file name (8.3 format) */#if _USE_LFNXCHAR*lfname;/* Pointer to the LFN buffer */intlfsize;/* Size of LFN buffer chr

21、s */#endif FILINFO这个结构主要描述文件的状态信息,包括文件名 13个字符8+.+3+0)、属性、修改时间等。接下来是函数的定义,先大概浏览一遍。FRESULT f_mount (BYTE, FATFS*加儼文件系统,BYTE参数是 ID,后一个 是文件系统定义。FRESULT f_open (FIL*, const XCHAR*, B YTE打开文件,第一个参数是文件信息结构,第二个参数是文件名,第三是文件打开模式FRESULT f_read (FIL*, void*, UINT, UINT*)文件读取函数,参数 1 为文件对 象(文件打开函数中得到),参数 2 为文件读取缓

22、冲区,参数 3 为读取的字节 数,参数 4 意义不清晰,等读到源代码就清楚了。FRESULT f_write (FIL*, con st void*, UINT, UINT*);写文件,参数跟读差不多FRESULT f_lseek (FIL*, DWORD)移动文件的读写指针,参数 2应该是移动 的数目。FRESULT f_close (FIL*);/* Close an open file object */FRESULT f_open dir (DIR*, con st XCHAF打开目录,返回目录对象FRESULT f_readdir (DIR*, FILINFO读取目录,获得文件信息F

23、RESULT f_stat (const XCHAR*, FILINFO*);/* Get file status */FRESULT f_getfree (const XCHAR*, DWORD*, FATFS*);/* Get number of free clusters on thedrive */FRESULT f_truncate (FIL*);/* Truncate file */FRESULT f_sync (FIL*);/* Flush cached data of a writing file 将*/ 缓冲区数据写回文件FRESULT f_unlink (co nst XC

24、HAR删除目录中的一个文件FRESULTf_mkdir (const XCHAR*);/* Create a new directory */FRESULT f_chmod (const XCHAR*, BYTE, BYTE); /* Change attriburte of the file/dir */FRESULT f_utime (const XCHAR*, const FILINFO*);/* Change timestamp of the file/dir */FRESULT f_rename (const XCHAR*, const XCHAR*);/* Rename/Move

25、a file or directory */FRESULT f_forward (FIL*, UINT(*)(const BYTE*,UINT), UINT, UINT*); /* Forward data to the stream*/ 这个函数还要提供一个回调函数。FRESULT f_mkfs (BYTE, BYTE, WORD);/* Create a file system on the drive */FRESULT f_chdir (const XCHAR*);/* Change current directory 改*/ 变当前目录FRESULT f_chdrive (BYTE)

26、;/* Change current drive */应该说基本能明白这些函数用于干什么。#if _USE_STRFUNCint f_putc (int, FIL*);/* Put a character to the file */int f_puts (const char*, FIL*);/* Put a string to the file */int fprintf (FIL*, const char*, );/* Put a formatted stri ng to the file */char*f_gets (char*, int, FIL*);/* Get a string

27、from the file */#define f_eof(fp) (fp)-fptr = (fp)-fsize) ? 1 : 0)#define f_error(fp) (fp)-flag & FA_ERROR) ? 1 : 0)#if _FS_REENTRAN如果定义了重入,则需要实现以下四个函数BOOL ff_cre_syn cobj(B YTE, _S YNCJ创建同步对象BOOL ff_del_sy ncobj(_S YNCJ);除同步对象BOOL ff_req_gra nt(_S YNC_t);f 请同步对象void ff_rel_gra nt(_S YNC_t)释放同步对象。#e

28、ndif3、diskio.h 文件typedef BYTEDSTATUS;typ edefDRESULT;/首先定义了两个变量,各个函数都有用至叽BOOL assign_drives (int argc, char *argv); /这/ 个函数不知道干吗DSTATUS disk_i ni tialize (BY TE);磁盘初始化DSTATUS disk_status (BY TE)获取磁盘状态DRESULT disk_read (BYTE, BYTE*, DWORD, BYTE);#if_READONLY = 0DRESULT disk_write (BYTE, const BYTE*,

29、DWORD, BYTE);#endifDRESULT disk_ioctl (B YTE, B YTE, void*磁盘控制接下来还有一些常数的定义,具体用到时在看。4、diskio.c 的结构DSTATUS disk_initialize (BYTE drv/* Physical drive nmuber (0.) */)DSTATUS stat;int result;switch (drv) case ATA :result = ATA_disk_initialize();/ translate the reslut code herereturn stat;case MMC :resul

30、t = MMC_disk_initialize();/ translate the reslut code herereturn stat;case USB :result = USB_disk_initialize();/ translate the reslut code herereturn stat;return STA_NOINIT;函数基本都像这样, drv 表示磁盘的类型。没有实现,用户必须实现这部分代码。5、ff.e文件简单浏览#inelude “ff.h ”/* FatFs eonfigurations and tdioenesla*r/a#inelude “diskio.h

31、 ”/* Deelarations of low level disk I/O funetions */#defineENTER_FF(fs) if (!loek_fs(fs) return FR_TIMEOUT; 获/取文件系统同 步对象,不成功返回超时,成功,继续执行。#defineLEAVE_FF(fs, res) unloek_fs(fs, res); return res; 释/放文件系统同步 对象。StaticFATFS *FatFs_DRIVES定义一个文件系统对象指针数组,当然一般 我们也就用到一个元素。Statie WORD LfnBuf_MAX_LFN + 1;/这/ 个是与长文件名支持相关的。#defineNAMEBUF(sp,lp)BYTE sp12; WCHAR

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1