Seekfor_FAT_System_v1_2

所属分类:处理器开发
开发工具:DOS
文件大小:54KB
下载次数:8
上传日期:2007-09-29 19:23:31
上 传 者xialibaren
说明:  针对以arm处理器为核心的嵌入式平台的fat文件系统
(To arm processors for the embedded platform at the core of the fat file system)

文件列表:
include\fat.h (8567, 2006-08-26)
include (0, 2006-08-15)
source\fat.c (99865, 2006-08-26)
source\portable.c (114060, 2006-08-26)
source (0, 2006-08-15)

Seekfor FAT System v1.1使用指南 ================================================================================================================ 1.简介 Seekfor FAT System v1.1是Seekfor 开发的一款嵌入式FAT16/FAT32文件系统支持软件,该软件包 完全支持FAT16/FAT32,支持多个分区和多个物理驱动器,同时提供基本兼容stdio.h的API.这样使用FAT系统就 非常简单了.例如,只要你正确调用了FAT_install(),那么以后就可以直接使用fopen("C:\\mp3\\demo.mp3","rb") +fread()+fclose()来操作C:\mp3\demo.mp3文件了.如果你有多个物理驱动器或多个分区,那么和DOS一样,系统也 依此映射为C:,D:,E:等等,最多能有26个逻辑驱动器 =============================================================================================================== 2.系统要求 要移植Seekfor FAT System v1.1,首先,您的系统必须提供类似malloc(),free()动态内存分配的机制.同时因为 stdio.h使用的是缓冲式(预读式)文件读写,也就是说,读文件的时候会先读出一部分数据到缓冲区,写的时候是先写到 内存缓冲区中,所以需要您的系统有足够的内存.在当前版本,每一个打开的文件都有一簇内容的缓冲.所以每个文件所需 的缓冲区大小是FAT系统中的每簇扇区数X每扇区字节数得到的.因此在多任务环境,如果您需要打开多个文件,则必须保证 您的内存足够(当然如果内存不够的情况下,fopen()是返回NULL的).其次,建立文件或者建立文件夹需要指定建立的时间, 日期等信息,因此您的系统也应该提供能获取系统日期和系统时间的函数,最后,您的系统能正确完成扇区擦除,扇区读和扇区 写功能 =============================================================================================================== 3.软件结构 (1)FAT层API 提供FAT_install(),FAT_terminate(),FAT_format()三个函数 (2)文件层API 提供基本兼容stdio.h的文件操作函数,添加一部分stdio.h不存在但需要使用的函数,如int attrib(char*filename,char attr)实现对文件或者文件夹更改属性,int label(char*new_label)实现更改卷标名等功能 (3)移植层API 定义在source\\portable.c中,这是需要用户自己重写的一些函数,源文件中的函数是实现在Win32下的代码 ======================================================================================================================== 4.和stdio.h的差异部分 (1)findfirst()和findnext()中使用的结构ffblk和stdio.h有差异,您可以对比fat.h中ffblk的定义和Turbo C中ffblk 中的定义 (2)stdio.h的fopen(char*filename,char*mode)中的文件打开模式mode支持"t"和"b",也就是文件有二进制文件和文本文件的区分 实际上个人感觉仅仅是\r\n上的处理(读文件读到\n会自动转化为\r\n,写文件写到\r\n只会写入\n),在现在存储容量较大的情况下,已经没有 什么必要支持此功能了.所以本软件包就不再支持"t"和"b"了. ======================================================================================================================== 5.个人说明 您可以***使用,传播该软件,但不得更改软件中的所有关于本人的信息.传播该软件必须附带这个未修改的readme.txt文件. 本软件已在Visual C++下编译通过,对本软件格式化,或者建立的文件,文件夹,把*.img写入到优盘后,Win CE能够正确识别和读出.但当前版本没有支持长文件名,或许 下一个版本会支持这功能的. 如果您有任何意见和建议,或者发现软件的BUG,请联系: Email:Seek_for@163.com,sfrad32@hotmail.com QQ:82054357 =========================================================================================================================== 6.移植示范 (1)第一步:改写source\portable.c中的所有代码(如果需要改写) (2)第二步:编写好自己的扇区擦除,扇区读,扇区 写三个函数,函数原型必须符合fat.h中定义的形式 (3)调用FAT_install(),安装该驱动器 (4)如果FAT_install()调用成功则可以使用文件层API操作文件了 (5)退出时必须调用FAT_terminate(),否则会造成内存泄露 在Win32下,偶把一个U盘的内容通过WinHex读成一个文件FAT32.img,实现读写的代码如下: (1)source\portable.c中的代码不动,Win32直接支持malloc()和free()函数,文件日期固定是2006-1-1,时间固定是00:00:00,这样 每次建立文件和文件夹的日期和时间都是固定的 (2)三个关于扇区的函数是: (注意,这三个函数必须是执行成功返回1,否则返回0) BOOL erase(DWORD dwSectors,DWORD dwBytesPerSector,void*user_data) { return 1;/*不需要擦除,直接返回1即可*/ } BOOL read(DWORD dwSectors,void*buff,DWORD dwBytesPerSector,void*user_data) { HANDLE hFile=(HANDLE)user_data;/*user_data是文件指针*/ SetFilePointer(hFile,dwSectors*dwBytesPerSector,NULL,FILE_BEGIN); return ReadFile(hFile,buff,dwBytesPerSector,&dwBytesPerSector,NULL); } BOOL write(DWORD dwSectors,void*buff,DWORD dwBytesPerSector,void*user_data) { HANDLE hFile=(HANDLE)user_data; SetFilePointer(hFile,dwSectors*dwBytesPerSector,NULL,FILE_BEGIN); return WriteFile(hFile,buff,dwBytesPerSector,&dwBytesPerSector,NULL); } (3)初始化和使用FAT代码如下: void main() { HANDLE hFile; FILE*p; /*先打开fat16.img*/ hFile=CreateFile("C:\\fat16.img",GENERIC_WRITE|GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); if(FAT_install(erase,read,write,(void*)hFile))/*如果安装成功*/ { /*安装成功的情况下,系统会存在"C:"这个逻辑盘*/ p=fopen("C:\\demo.txt","w");/*打开demo.txt写*/ if(p)/*使用前先判断是良好的编程习惯*/ { fputs("This is a demo program!!",p);/*写入字符串*/ fclose(p);/*必须调用fclose(p),否则可能出现有文件名无内容或者内容不对,同是如果不调用fclose(),也会产生内存泄露*/ } FAT_terminate();/*最后必须调用此函数释放FAT占用的内存*/ CloseHandle(hFile);/*关闭fat16.img*/ } }

近期下载者

相关文件


收藏者