下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 制作冰淇淋课件
- 第七讲 调用五官感受写一写(看图写话教学)-一年级语文上册(统编版·2024秋)
- 2024年黑龙江省龙东地区中考数学真题卷及答案解析
- 幼儿园小班音乐《狐狸和石头》教案
- 西京学院《影像信息学与使用》2021-2022学年第一学期期末试卷
- 西京学院《继电保护装置》2022-2023学年期末试卷
- 西京学院《儿科护理学》2023-2024学年第一学期期末试卷
- 西华师范大学《中国画基础》2022-2023学年第一学期期末试卷
- 西华师范大学《新闻修辞学》2021-2022学年第一学期期末试卷
- 西华师范大学《体育课程与教学论》2022-2023学年第一学期期末试卷
- 厂房物业管理服务合同
- 教学课件 国际货运代理-肖旭
- 新生适应性成长小组计划书
- 08SS523建筑小区塑料排水检查井
- 中国图书馆分类法讲座
- 父亲去世讣告范文(通用12篇)
- 人教版八年级上Unit 2How often do you exercise Section A(Grammar Focus-3c)
- 导读工作总结优秀范文5篇
- 超声波UTⅠ级考试题库2023
- SB/T 10851-2012会议中心运营服务规范
- JJF 1916-2021扫描电子显微镜校准规范
评论
0/150
提交评论