1 / 20
文档名称:

FatFS执行流程分析.doc

格式:doc   大小:54KB   页数:20页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

FatFS执行流程分析.doc

上传人:zbfc1172 2019/7/16 文件大小:54 KB

下载得到文件列表

FatFS执行流程分析.doc

文档介绍

文档介绍:在网上找了一个FatFS移植的例子,并含有源代码。http://blog./jjldc/190753/,有FatFS操作的流程,我的流程分析就以这个为基础。 一、读文件流程。1、程序结构res=f_mount(0,&fs);res=f_open(&file,"",FA_OPEN_EXISTING|FA_READ);while(1){if(fgets(data,sizeof(data),&file)==NULL){break;}prints(data);}f_close(&file);总共四个与文件系统相关的函数,下面就沿着函数执行路径去探索一下。 2、f_mount(0,&fs)的执行参数0是卷号,就像电脑上的CDE盘等。fs是一个未初始化的一个文件系统对象,其定义在此:FATFSfs。这个函数好像就做了两个个事,使全局文件系统指针FatFS指向fs对象,=0。 3、f_open(&file,"",FA_OPEN_EXISTING|FA_READ)的执行参数&file是提供一个文件对象指针,打开文件过程中获得的一些信息都填入这个结构体。FA_OPEN_EXISTING|FA_READ表示要打开和读取相应的文件。源程序如下:FRESULTf_open(FIL*fp,/*fp就指向传入的对象file*/constchar*path,/**/BYTEmode/*Accessmodeandfileopenmodeflags*/){DIRdj;目录对象BYTE*dir;目录项指针charfn[8+3+1];。//程序开头定义了这么三个变量,007c版本中由于支持长文件名,最好一个改为NAMEBUF(sfn,lfn)。fp->fs=NULL;每个文件对象都指向具体的文件系统,这里先清0auto_mount(&path,&,(BYTE)(mode));//这个函数看来很关键了。旧版的函数没有中间这个参数。Path本来就是一个指针,&path就是一个指向指针的指针,&,这个指针传入应该是供auto_mount函数设置的。 4、auto_mount(&path,&,(BYTE)(mode))的执行先分析旧版的:FRESULTauto_mount(/*FR_OK(0):essful,!=0:ured*/constchar**path,/*Pointertopointertothepathname(drivenumber)*/BYTEchk_wp/*!=0:ess){DWORDbootsect,fatsize,totalsect,maxclust;constchar*p=*path;//指针p现在就指向文件名字符串了。FATFS*fs; memset(fs,0,sizeof(FATFS));/*将全局文件系统结构清0*/stat=disk_initialize(0);/*磁盘初始化程序,在这里调用的*/ fmt=check_fs(bootsect=0);/*Checksector0asanSFDformat*/这里主要是调用了check_fs(bootsect=0)函数检测是否存在FAT文件系统。 下面是源代码:BYTEcheck_fs(/*0:TheFATbootrecord,1:ValidbootrecordbutnotanFAT,2:Notabootrecordorerror*/DWORDsect/*Sector#tocheckifitisanFATbootrecordornot*/){FATFS*fs=FatFs;if(disk_read(0,fs->win,sect,1)!=RES_OK)/*Loadbootrecord*/return2;if(LD_WORD(&fs->win[BS_55AA])!=0xAA55)/*Checkrecordsignature*/return2;if(!memcmp(&fs->win[BS_FilSysType],"FAT",3))/*CheckFATsignature*/return0;if(!memcmp(&fs->win[BS_FilSysType32],"FAT32",5)&&!(fs->win[BPB_ExtFlags]&0x80))return0;return1;}这个函数的主要操作是:将磁盘的0扇区读入fs->win【】扇区缓冲。并对其中的特殊位置进行检验。如果读入错误或者末尾不是55AA,返回2。如果确实是FAT文件系统返回0。如果返回1可能是主引导扇区,继续从分区引导扇区读取。 auto_mount继续往下执