资源预览内容
第1页 / 共17页
第2页 / 共17页
第3页 / 共17页
第4页 / 共17页
第5页 / 共17页
第6页 / 共17页
第7页 / 共17页
第8页 / 共17页
第9页 / 共17页
第10页 / 共17页
亲,该文档总共17页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
znFAT移植与使用手册(1)znFAT简介znFAT是一种高效、完备、精简且具有高可移植性的嵌入式FAT32文件系统解决方案。其主要特性如下:1)可通用于多种嵌入式CPU,如51、AVR、PIC、ARM、Cortex、DSP、MSP430、 freescale S12等等。2)所占用的RAM与ROM资源极少,并可由使用者视目标平台资源情况进行灵活 配置,最简配置情况下,RAM的使用量约在800900字节左右。3)内建独特的数据写入加速算法以及扇区级的基于“预建文件”的数据写入机制。 4)底层提供简单的单扇区读写驱动接口以及可选的硬件级多扇区连续读写驱动接 口。(在提供多扇区连续读写驱动的情况下,数据读写速度将有近24倍的提升, 甚至更高。)5)提供清晰而强大的对函数模块裁剪的功能,极大限度的减小最终生成的可执行文 件的体积。6)提供数据读取的重定向功能,使读到的数据无需缓冲暂存,直接流向应用目的。7)支持长文件名,长文件名最大长度可配置。默认配备并使用GB2312中文字符, 并可选择是否使用OEM字符集,以减少程序体积。8)支持与Windows、Linux等操作系统兼容的路径表示,路径分隔可使用/或。支持 无限深目录,支持长名目录。9)提供数据写入的实时模式,写入的任何数据,只怕只有一个字节,立即落实到物 理存储器,防止因恶劣工作环境、干扰或其它原因引起的目标平台不可预见的死 机或故障,造成数据丢失(实时模式数据写入速度不高,内存中不缓冲任何数据)。10)支持对存储设备的格式化,文件系统为FAT32。11)支持*与?通配,长名亦支持通配。12)支持文件与目录的删除,目录支持内含子目录与无限深级子目录结构的删除。13)支持无限级目录创建。14)支持多文件同时操作。15)支持多设备,即同时挂载多种存储设备,可在多种存储设备间任意切换。(2)znFAT的移植1)znFAT的代码结构 主体:znFAT的具体实现。znFAT.h是对相关数据结构、宏的定义,以及对使用者可调用的功能函数的声明。znFAT.c是对功能函数的具体实现。移植相关:znFAT的移植相关文件。mytype.h中对类型进行重定义。deviceio.c对存储设备物理扇区读写驱动进行具体实现。config.h 对znFAT进行一些配置。其它头文件:cc_macro.h 是znFAT中的功能函数依赖关系的定义。gb2uni.h 是znFAT中GB2312向UNICODE转换的映射表。deviceio.h 此文件向znFAT提供扇区读写驱动接口函数的声明。template.h znFAT中用于实现格式化功能的模板数据。2)znFAT的移植方法znFAT的移植其实非常简单,前提是已经有了现成的,较为成熟稳定的存储设备扇区读写等驱动函数。a. 重新定义数据类型,如下图。根据硬件平台实际的数据类型对mytype.h中的类型进行重新定义,包括 无符号整型、有符号整形与固化数据的ROM类型。b. 通过deviceio.c将存储设备驱动函数与znFAT标准物理接口进行接驳,包括 存储设备初始化、单扇区读取、单扇区写入、多扇区连续读取与写入,多扇区连续清0 I. 加入存储设备驱动头文件,如下图。(device0.h只是举个例子)。 II. 将存储设备初始化函数与znFAT_Device_Init函数接驳,如下图。除了将实际存储设备的初始化函数加入接口函数znFAT_Device_Init中,此函数中其它代码请不要改动(以下同理)。并且最好按函数中的格式来写,在有多个存储设备的情况下,可以方便地知道每一个存储设备的初始化成功与否。III. 将扇区读取驱动函数与znFAT_Device_Read_Sector函数进行接驳,如下图。IV. 将扇区写入驱动函数与znFAT_Device_Write_Sector函数进行接驳,如下图。V. 将多扇区连续读取驱动函数与znFAT_Device_Read_nSector函数进行接驳,如下 图。znFAT中的多扇区连续读取驱动接口函数采用了两种实现方式,使用者可以通过修改config.h中的相应宏选择使用哪种实现方式。config.h中的宏如下图:如果这个宏被注释,则采用单扇区读取驱动+循环的实现方式;否则,将采用硬件级的多扇区连续读取驱动,此地,使用者必须提供存储设备的多扇区连续读取驱动函数。VI. 将多扇区连续写入驱动函数与znFAT_Device_Write_nSector函数进行接驳(与V同理,config.h中对应的宏为 #define USE_MULTISEC_W)VII.将多扇区连续清零驱动函数与znFAT_Device_Clear_nSector函数进行接驳(与V与VI同理,config.h中对应的宏为 #define USE_MULTISEC_CLEAR) 以上就是znFAT的移植方法。(3)znFAT的使用方法znFAT为使用者提供了强大而完备的应用层函数。下面对znFAT的使用方法进行详细介绍。1) 存储设备初始化函数 UINT8 znFAT_Device_Init(void)对znFAT中挂接的所有存储设备进行初始化,如果有任何一个存储设备初始化失败,则返回值不为0。返回值为8位整型,某一位为1,表示对应的存储设备初始化失败。比如0X02,表示设备1初始化失败。(前提是移植的时候,遵循函数的格式。)2) 选择某一存储设备 UINT8 znFAT_Select_Device(UINT8 devno, struct znFAT_Init_Args *pinitargs)znFAT是支持多设备的,即允许多种存储设备同时挂接在znFAT上,但某一时刻只能有一个存储设备被操作。因此,要对存储设备进行选择。与存储设备相关的有两个重要的全局变量Dev_No与pInit_Args,即设备号与指向记录存储设备文件系统相关参数信息的结构体的指针。设备号用于控制扇区读写接口函数中的分支,从而决定了使用哪个驱动函数;后者所指向的结构体中的参数将参与此存储设备上的文件操作过程中的相关计算。因此,在对某一存储设备进行操作之前,务必正确设置这两个变量。3)格式化 UINT8 znFAT_Make_FS(UINT32 tt_sec,UINT16 clu_sz)此函数将存储设备格式化为FAT32文件系统。此函数可能会运行较长时间,而且视存储设备容量不同时间长短亦会不同。参数tt_sec为存储设备的总扇区数,clu_sz为簇大小。其中,如果clu_sz为0,则说明由znFAT自动按照存储设备的容量选择比较合适的簇大小。要实现格式化功能,使用者必须给出ROM固化数据的读取函数的实现。包括三个函数:从ROM中读取一个字节:UINT8 PGM_BYTE_FUN(ROM_TYPE_UINT8 *ptr)从ROM中读取一个字: UINT16 PGM_WORD_FUN(ROM_TYPE_UINT16 *ptr)从ROM中读取一个双字:UINT32 PGM_DWORD_FUN(ROM_TYPE_UINT32 *ptr)不同的CPU上,这些函数的实现可能不一样,比如在51和ARM上实现如下:UINT8 PGM_BYTE_FUN(ROM_TYPE_UINT8 *ptr) return *(ptr); UINT16 PGM_WORD_FUN(ROM_TYPE_UINT16 *ptr) return *(ptr);UINT32 PGM_DWORD_FUN(ROM_TYPE_UINT32 *ptr) return *(ptr);在AVR上为(WINAVR GCC平台):UINT8 PGM_BYTE_FUN(ROM_TYPE_UINT8 *ptr) return pgm_read_byte(ptr); UINT16 PGM_WORD_FUN(ROM_TYPE_UINT16 *ptr) return pgm_read_word(ptr);UINT32 PGM_DWORD_FUN(ROM_TYPE_UINT32 *ptr) return pgm_read_dword(ptr);至于其它CPU平台的具体实现,要依实际平台而定。注:在格式化前,必须设定要格式化的存储设备的设备号,实际应用代码如下:extern UINT32 Dev_No;int main(void) Dev_No=0; /设定当前存储设备为设备0 znFAT_Select_Device(0,&Init_Args); /选择设备 znFAT_Init(); /文件系统初始化 znFAT_Make_FS(10000000,0); /格式化,总扇区数为10000000,由znFAT /自动选择簇大小 return 0;4)对存储设备的文件系统的初始化UINT8 znFAT_Init(void) 此函数将对选定的存储设备上的文件系统进行初始化。其实质是将文件系统的一些重要参数装入到当前所选定的文件系统参数集合结构体中去,以备后面使用。此函数如果返回0,说明 成功;否则失败,返回错误码:1:失败 2:非FAT32文件系统。如下程序说明znFAT中文件系统初始化的一般过程:struct znFAT_Init_Args Init_Args; /初始化参数集合int main(void) znFAT_Select_Device(0,&Init_Args); /选择设备 znFAT_Init(); /文件系统初始化 printf(znFAT init OKn); /输出文件系统相关参数 printf(BPB_Sector_No:%dn,Init_Args.BPB_Sector_No); printf(Total_SizeKB:%dn,Init_Args.Total_SizeKB); printf(BytesPerSector:%dn,Init_Args.BytesPerSector); printf(FATsectors:%dn,Init_Args.FATsectors); printf(SectorsPerClust:%dn,Init_Args.SectorsPerClust); printf(FirstFATSector:%dn,Init_Args.FirstFATSector); printf(FirstDirSector:%dn,Init_Args.FirstDirSector); printf(FSsec:%dn,Init_Args.FSINFO_Sec); printf(Next_Free_Cluster:%dn,Init_Args.Next_Free_Cluster); printf(FreenCluster:%dn,Init_Args.Free_nCluster); znFAT_Flush(); return 0; 4)
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号