欢迎来到天天文库
浏览记录
ID:15388533
大小:50.00 KB
页数:5页
时间:2018-08-03
《fatfs源代码中c语言编程技巧的应用》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、FatFs源代码中C语言编程技巧的应用一、FatFs源代码中C语言编程技巧的应用1、FatFs的源代码结构在不支持重入和长文件名的情况下,用到的文件有6个:integer.h、diskio.h、diskio.c、ff.h、ffconf.h、ff.c。Integer.h是数据类型定义的头文件,C语言标准的数据类型有char、short、int、long、float、double等,但是不同的机器平台上,同样的数据类型其支持的数据宽度可能是不同的。比如在8位机上,int是16位宽度。而在32位机上,int是32位
2、。因此移植性高的源代码,都不应该直接使用这些数据类型,而是利用tpyedef将所有的数据类型定义新的名字,而在源代码中使用这些新名字。当代码移植到不同的平台时,根据所要求的数据宽度和实际平台上的规定,再重新配置数据类型就可以了,而源代码中的类型名称都不用改。我们在STM32上用到的库文件、ucos的类型定义、FatFs的类型定义都是这样做的。diskio.h包含了integer.h,定义了一些简单的配置常量。主要是定义了两个数据类型:一个是DSTATUS,用于表示磁盘状态,它实质上就是char类型;一个是枚举
3、类型DRESULT,用来表示磁盘操作的返回结果-正确还是错误。接下来主要是一些函数的原型声明。其它源文件只要包含了这个头文件,就可以调用这些函数。再接下来是磁盘状态常数和磁盘操作控制代码的定义,都是用define来实现的。Ffconf.c都是一些用于配置的常数定义。ff.h中根据ffconf.c中的配置定义了一些宏常数和带参数的宏。主要是定义了FATFS、FIL、DIR和FILINFO四个文件信息结构体,用来存储文件系统、目录、文件的相关信息。定义了FRESULT这个枚举类型结构体,大多数的文件操作函数都返回
4、这个类型的值。定义了文件访问模式、目录项属性、目录项各属性字节偏移、BPB参数表偏移等,特别重要的是定义了字、双字访问宏等。#defineLD_WORD(ptr)(WORD)(*(WORD*)(BYTE*)(ptr))#defineLD_DWORD(ptr)(DWORD)(*(DWORD*)(BYTE*)(ptr))#defineST_WORD(ptr,val)*(WORD*)(BYTE*)(ptr)=(WORD)(val)#defineST_DWORD(ptr,val)*(DWORD*)(BYTE*)(pt
5、r)=(DWORD)(val)这几个宏在获取和写入文件信息时特别有用。ff.c开头也有一些常数宏和带参数宏的定义,大多数的变量都在这个定义和初始化。然后主要是所有文件操作函数的定义。2、FatFs中用到的一些C语言技巧(1)利用宏、条件编译来实现系统的高配置性在FatFs中,我们可以看到大量类似下面的代码:#if_FS_RPATHif(*path=='/'
6、
7、*path=='\'){/*Thereisaheadingseparator*/path++;dj->sclust=0;/*Stripitandsta
8、rtfromtherootdir*/}else{/*Noheadingsaparator*/dj->sclust=dj->fs->cdir;/*Startfromthecurrentdir*/}#elseif(*path=='/'
9、
10、*path=='\')/*Stripheadingseparatorifexist*/path++;dj->sclust=0;/*Startfromtherootdir*/#endif而在ffconf.h中定义宏_FS_RPATH的值,可以实现不同的功能。(2)利用结构体存储一
11、个对象的所有信息typedefstruct_FIL_{FATFS*fs;/*Pointertotheownerfilesystemobject*/WORDid;/*OwnerfilesystemmountID*/BYTEflag;/*Filestatusflags*/BYTEcsect;/*Sectoraddressinthecluster*/DWORDfptr;/*FileR/Wpointer*/DWORDfsize;/*Filesize*/DWORDorg_clust;/*Filestartcluster
12、*/DWORDcurr_clust;/*Currentcluster*/DWORDdsect;/*Currentdatasector*/#if!_FS_READONLYDWORDdir_sect;/*Sectorcontainingthedirectoryentry*/BYTE*dir_ptr;/*Pontertothedirectoryentryinthewindow*/#endif#if!_FS
此文档下载收益归作者所有