FatFs使用流程.docx
《FatFs使用流程.docx》由会员分享,可在线阅读,更多相关《FatFs使用流程.docx(11页珍藏版)》请在三一办公上搜索。
1、FatFs使用流程一、读文件流程。 1、程序结构 res = f_mount(0, &fs); res = f_open(&file, data.txt, 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是一个未初始化的一个文件系统对象,其定义在此:FATFS f
2、s。这个函数好像就做了两个个事,使全局文件系统指针FatFS指向fs对象,并使fs.fstype=0。 3、f_open(&file, data.txt, FA_OPEN_EXISTING | FA_READ)的执行 参数&file是提供一个文件对象指针,打开文件过程中获得的一些信息都填入这个结构体。FA_OPEN_EXISTING | FA_READ表示要打开和读取相应的文件。源程序如下: FRESULT f_open ( FIL *fp, /* fp就指向传入的对象file */ const char *path, /*path指向data.txt的地址*/ BYTE mode /* Ac
3、cess mode and file open mode flags */ ) DIR dj; 目录对象 BYTE *dir; 目录项指针 char fn8+3+1; 8.3文件名。 / 程序开头定义了这么三个变量,007c版本中由于支持长文件名,最好一个改为NAMEBUF(sfn, lfn)。 fp-fs = NULL; 每个文件对象都指向具体的文件系统,这里先清0 auto_mount(&path, &dj.fs, (BYTE)(mode) ); /这个函数看来很关键了。旧版的函数没有中间这个参数。 Path本来就是一个指针,&path就是一个指向指针的指针,&dj.fs因为dj对象还未设
4、置,这个指针传入应该是供auto_mount函数设置的。 4、auto_mount(&path, &dj.fs, (BYTE)(mode) )的执行 先分析旧版的: FRESULT auto_mount ( /* FR_OK(0): successful, !=0: any error occured */ const char *path, /* Pointer to pointer to the path name (drive number) */ BYTE chk_wp /* !=0: Check media write protection for write access) DWO
5、RD bootsect, fatsize, totalsect, maxclust; const char *p = *path; /指针p现在就指向文件名字符串了。 FATFS *fs; memset(fs, 0, sizeof(FATFS); /*将全局文件系统结构清0 */ stat = disk_initialize(0); /*磁盘初始化程序,在这里调用的 */ fmt = check_fs(bootsect = 0); /* Check sector 0 as an SFD format */ 这里主要是调用了check_fs(bootsect = 0)函数检测是否存在FAT文件系
6、统。 下面是源代码: BYTE check_fs ( /* 0:The FAT boot record, 1:Valid boot record but not an FAT, 2:Not a boot record or error */ DWORD sect /* Sector# to check if it is an FAT boot record or not */ ) FATFS *fs = FatFs; if (disk_read(0, fs-win, sect, 1) != RES_OK) /* Load boot record */ return 2; if (LD_WORD
7、(&fs-winBS_55AA) != 0xAA55) /*Check record signature */ return 2; if (!memcmp(&fs-winBS_FilSysType, FAT, 3)/* Check FAT signature */ return 0; if (!memcmp(&fs-winBS_FilSysType32, FAT32, 5) & !(fs-winBPB_ExtFlags & 0x80) return 0; return 1; 这个函数的主要操作是:将磁盘的0扇区读入fs-win扇区缓冲。并对其中的特殊位置进行检验。如果读入错误或者末尾不是55A
8、A,返回2。如果确实是FAT文件系统返回0。如果返回1可能是主引导扇区,继续从分区引导扇区读取。 auto_mount继续往下执行: fatsize = LD_DWORD(&fs-winBPB_FATSz32); fs-sects_fat = (CLUST)fatsize; /每个FAT表的扇区数目 fs-n_fats = fs-winBPB_NumFATs; /* FAT表的个数 */ fatsize *= fs-n_fats; /* (Number of sectors in FAT area) */ fs-fatbase = bootsect + LD_WORD(&fs-winBPB_R
9、svdSecCnt); /* FAT start sector (lba) */FAT表开始于开始扇区+保留扇区。 fs-csize = fs-winBPB_SecPerClus; /* 每个簇的扇区数目 */ fs-n_rootdir = LD_WORD(&fs-winBPB_RootEntCnt); /* Nmuber of root directory entries */ totalsect = LD_DWORD(&fs-winBPB_TotSec32); fs-max_clust = maxclust; fmt = FS_FAT32; if (fmt = FS_FAT32) fs-d
10、irbase = LD_DWORD(&fs-winBPB_RootClus); fs-database = fs-fatbase + fatsize + fs-n_rootdir / 16; /* Data start sector (lba) fs-free_clust = (CLUST)0xFFFFFFFF; /以上代码主要是根据引导扇区里的数据,填充文件系统对象结构体的信息:包括FAT表大小、数目、根目录区起始地址、数据区起始扇区、文件系统类型等等。后面还有一些代码,也是做同样工作的,这里就不再叙述了。 函数下面回到f_open继续执行。 Auto_mount函数早期有个转折,如果文件系
11、统类型已经定义,则直接返回,后续代码不会执行。 5、f_open执行完auto_mount后 下一个函数: trace_path(&dj, fn, path, &dir); /* Trace the file path */ 这个函数里面只有path指向文件路径,其它三个都是未经初始化的指针,应该都是在这个函数里面进行设置。Dj是目录结构体,fn是8.3文件名数组,dir是指向fs扇区缓冲里当前文件目录项的指针。 从函数名称和参数可以推断出它的主要功能是将文件名从路径中提取出来,并转变成从标准8.3格式,同时找到文件所在目录,并将目录扇区读入文件系统缓冲区,依据文件目录项的信息填充dj结构体。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- FatFs 使用 流程
链接地址:https://www.31ppt.com/p-3060993.html