下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、资料FatFs源代码中C语言编程技巧的应用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位 机上,
2、int是32位。因此移植性高的源代码,都不应该直接使用这些数据类型, 而是利用tpyedef将所有的数据类型定义新的名字,而在源代码中使用这些新名 字。当代码移植到不同的平台时,根据所要求的数据宽度和实际平台上的规定,再 重新配置数据类型就可以了,而源代码中的类型名称都不用改。我们在STM32 ±用 到的库文件、ucos的类型定义、FatFs的类型定义都是这样做的。diskio. h包含了 integer, h,定义了一些简单的配置常量。主要是定义了两个 数据类型:一个是DSTATUS,用于表示磁盘状态,它实质上就是char类型;一个是 枚举类型DRESULT,用来表示磁盘操作的返回
3、结果-正确还是错误。接下来主要是一些函数的原型声明。其它源文件只要包含了这个头文件,就可 以调用这些函数。再接下来是磁盘状态常数和磁盘操作控制代码的定义,都是用define来实现 的。Ffconf. c都是一些用于配置的常数定义。ff.h中根据ffconf. c中的配置定义了一些宏常数和 带参数的宏。主要是 定义了 FATFS、FIL、DIR和FILINF0四个文件信息结构体,用来存储文件系 统、LI录、文件的相关信息。定义了 FRESULT这个枚举类型结构体,大多数的文件操作函数都返回这个 类型的值。定义了文件访问模式、U录项属性、H录项各属性字节偏移、BPB参数表偏移 等,特别重要的是定义
4、了字、双字访问宏等。ttdefine LD.WORD (ptr) (WORD) (* (WORD*) (BYTE*) (ptr)ttdefine LD_DWORD (ptr) (DWORD) (* (DWORD*) (BYTE*) (ptr)ttdefine ST.WORD (ptr, val) *(WORD*) (BYTE*) (ptr) = (WORD) (val)ttdefine ST_DWORD (ptr, val) * (DWORD*) (BYTE*) (ptr) = (DWORD) (val)这儿个宏在获取和写入文件信息时特别有用。ff. c开头也有一些常数宏和带参数宏的定义,大多
5、数的变量都在这个定义和初始化。然后主要是所有文件操作函数的定义。2、FatFs中用到的一些C语言技巧(1) 利用宏、条件编译来实现系统的高配置性在FatFs中,我们可以看到大量类似下面的代码:#if _FS_RPATHif (*path = ' /' I I *path = '') /* There is a heading separator */path+; dj>sclust = 0; /* Strip it and start from the root dir */ else /* No heading saparator */dj->sc
6、lust = dj>fs>cdir; /* Start from the current dir */#elseif (*path =、I I *path 二二')/* Strip heading separator if exist */path+;dj->sclust = 0; /* Start from the root dir */itendif而在ffconf. h中定义宏_FS_RPATH的值,可以实现不同的功能。(2) 利用结构体存储一个对象的所有信息typedef struct _FIL_ FATFS* fs; /* Pointer to the ow
7、ner file system object *WORD id; /* Owner file system mount ID */BYTE flag; /* File status flags */BYTE csect; /* Sector address in the cluster */DWORD fptr; /* File R/W pointer */DWORD fsize; /* File size */DWORD org_clust; /* File start cluster */DWORD curr.clust; /* Current cluster */DWORD dsect;
8、 /* Current data sector */ftif !_FS_READONLYDWORD dir_sect; /* Sector containing the directory entry */BYTE* dir_ptr; /* Ponter to the directory entry in the wind ow */ #endif#if !_FS_TINYBYTE buf_MAX_SS;/* File R/W buffer */ttendif FIL;文件的操作就通过这样的结构体来进行。(3) 统一所用文件操作函数的模式儿乎所有的函数都返回FRESULT类型,而FRESULT
9、是通过typedef定义的一种枚举变量,这样使得函数的风格很清新,易读性强。(4) 带参数宏的巧妙利用比如:#define IsUpper (c) (c) >二'A')&&( (c)二'Z')ftdefine IsLower (c) (c) >二'a')&&( (c)二'z')还比如前面的字、双字操作函数,结合对属性字节偏移的常数定义,使得 操作时意义非常清晰:fno->fsize = LD.DWORD (dir+DIR_FileSize) ; /* 文件大小 */fno->fdate = LD_WORD(dir+DIR_WrtDate):这样使得代码的可读性大大增强。(5) 良好的代码书写风格和版本控制int f_puts (const char* str, /* Pointer to t
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 严格执行质量奖惩制度
- 公司完成目标奖惩制度
- 拒收红包回扣奖惩制度
- 国定幼儿园师德奖惩制度
- 项目结算收款奖惩制度
- 深化设计工作奖惩制度
- 怎样制定考核奖惩制度
- 中学学校管理奖惩制度
- 领导干部综治奖惩制度
- 项目现场奖惩制度
- 【乡村振兴背景下乡村有效治理的路径思考-以S村为例5300字(论文)】
- 2021年全国普通高等学校体育单招真题英语(含答案解析)
- 口腔医学专业认证标准指标体系-重庆医科大学附属口腔医院
- JJF 1189-2008测长仪校准规范
- 中兴微电子技术
- 东西方文化导论之日本
- 充填采矿法解析课件
- 第四章,第五章项目计划时间管理课件
- 最新上海初三英语首字母填空专项练习
- 东北地区的人口与城分布
- DB34∕T 2290-2022 水利工程质量检测规程
评论
0/150
提交评论