"); //-->
转一篇比较详细介绍FatFs文件系统移植的文章 转一篇比较详细介绍FatFs文件系统移植的文章
FatFs文件系统的移植
因为需要,又不想自己写,所以就移植了一个文件系统。
说下我的硬件和开发工具:接成 TRUE IDE 模式下的CF卡(也就是相当于一块硬盘了),三星S3C2440的ARM9,开发工具是很老很老的D版的ADS1.2。
我在网上看到的嵌入式系统上面常用的文件系统有UCOSII公司的UC/FS,支持CF卡,硬盘,SD/MMC卡,还有NAND FLASH等等,比较多,不过是商用的,需要银子的,有周立功的用于教学用(为什么说是用于教学用的,呵呵,等下就说)的ZLG/FS,还找到了开源、免费的两个,其中一个叫做 efsl ,另一个叫做 FatFs 。
现在先不考虑版权的问题,选择一个比较合适的文件系统。第一个UC/FS文件系统没得什么说的,UCOSII那个公司开发的,稳定性,兼容性应该都不会差。第二个是ZLG/FS。周立功的很多的开发板上面都送了这个文件系统的源代码的,在网上找到一个现成的读写硬盘的,只是是基于LPC2200系列的处理器的。第三个是efsl,是一个开源的项目,免费,只需要提供读扇区和写扇区2个函数。第四个是FatFs,跟efsl一样,也是一个开源的项目,移植的时候比efsl多几个简单的函数。
这里补充一下CF卡和硬盘的简单的资料,CF卡有三种模式,其中有一个叫TRUE IDE,接成这个模式以后,就跟他的模式名字一样,他就是一个硬盘,对他进行读写,也就相当于对一个硬盘进行读写。当引脚OE(好像是叫OE,具体参考 CF卡文档)在上电的时候检测到拉低,那么CF卡就进入TRUE IDE模式。读写硬盘的时候,在只写一次LBA,只发送一个命令(读或者写)的情况下,最多可以读或者写256个扇区(当然也可以读一个扇区,读或者写多少个扇区在扇区计数器count里面),其中,发一个读或者写命令,读或者写256个扇区所需要的时间,比分256次去读写这些扇区所需要的时间要短得多,效率要高得多,我现在需要的是一个读写的速度比较快,效率比较高的文件系统,因此,底层的读写扇区必须要每写一个命令就可以读写多个扇区,读写扇区的函数必须要有扇区计数器(前面的count)这个参数,才可能满足要求。
UC/FS也是在网上搜了个代码,看了下,很标准的几个层,什么硬件层,文件系统层,API层,等等(具体参见UC/FS的文档),跟UCOSII一个公司的,稳定性应该不错,需要提供的函数也是读扇区,写扇区等等几个。但是底层的读写扇区的函数不需要提供扇区计数器count这个参数,也就是说,这个文件系统不能在只写一个读或者写命令的情况下,读或者写多个扇区,本来效感觉不错的一个文件系统,效率就大大的降低了。
然后看了下efls这个文件系统,开源的项目,免费的项目,好东西,移植也很简单,同样移植的时候也是提供读写扇区等几个函数,但是面临的跟UC/FS同样的问题,每次读写的时候也只能读写一个扇区。
绝望之余看到了周立功的文件系统,大概看了下(没有仔细阅读源代码),硬件驱动上面能够在发一次读命令的情况下,读写多个扇区,而且感觉上比较简单,同样,层次也很清楚,移植需要做的事情也是修改后面的读写扇区等等几个函数。于是就开干了。功夫不负苦心人,过了几天,CF卡能够读写了,拿到电脑上面看写的数据,没问题。从CF卡里面读文件出来,打印到超级终端,也没有问题,以为就万事OK了,想了下,我们需要的,最关心的,第一是速度,然后就开始测试速度,不测不知道,一测吓一跳!太“快”了,TMD,才5,6个K Bytes 每秒!!!!!(我的驱动已经测试了,上M字节每秒的) 于是跟踪到写里面去,发现一个很,十分,非常严重的问题:ZLG/FS提供了读一个字节的函数,忘了叫做啥,这里暂时叫 ReadOneByte(***),然后读多个字节,或者说读大块字节的函数用的是啥,呵呵,
for(i=0;i < N ; i++) ReadOneByte(***),这种机制,不慢才怪事!!!于是伤心的抛弃了ZLG/FS,这东东,学习还是可以的,商用的话,差太远了!!!
我那点东西,文件系统可以不上,但是必须有个文件存储协议,或者说叫做自己的文件系统,自己写个简单的存储协议,试过,很麻烦。但是如果上文件系统,自己写的话,写要累死人的,写出来的不一定效率就高,速度就快,所以,还是在网上漫无目的的找,觉得应该有效率很高的文件系统的。
还是那句话,功夫不负苦心人,终于让我找到了,也就是现在所用的,FatFs,开源,免费,高效!(说一下这里几个文件系统都有的一个缺点,由于微软的FAT版权的问题,FatFs,ZLG/FS,efsl都只支持 DOS 8.3 文件名,即8个字节的文件名,一个”.“,然后3个字节的扩展名,我找到的那个UC/FS也不支持,不知道在更新的版本里面支持不,看哪天有空了,把那个FatFs改下,让他支持,呵呵)。FatFs 的底层可以写一次命令,读写多个扇区。FatFs的设计的读写的思想就很好,小块的数据,我就经过Buffer来存储,大块的数据,我就直接进行存取,那样速度,效率高了很多,看图:

补充一点,FatFs的作者写了两个,一个是正宗的FatFs,比较适合大的RAM的设备,另一个是FatFs/Tiny,比较适合小RAM的系统,比如单片机,FatFs/Tiny占用较小的RAM,代价是更慢的读写速度和更少的API函数。不过两个都支持FAT12,FAT16,FAT32文件系统。
下载下来的FatFs的FatFs有两个文件夹,一个是 doc ,FatFs的说明,包括特性,系统函数,以及可能的一些问题,另一个就是源代码文件夹src了,总共8个文件,diskio.c和diskio.h是硬件层,ff.c和ff.h是FatFs的文件系统层和文件系统的API层,integer.h是文件系统所用到的数据类型的定义,tff.c和tff.h是Tiny的文件系统层和文件系统的API层,还有一个00readme.txt简要的介绍了FatFSHE FatFs/Tiny,包括他们所支持的API,怎么配置等等。
移植的问题,第一个是数据类型,在integer.h里面去定义好数据的类型。第二个,就是配置,打开ff.h(我用的FatFs,不是Tiny),_MCU_ENDIAN,选择你的CPU是大端存储(big endding)还是小端存储(little endding),一般的都用的小端存储,1是小端,2是大端。这个相当重要,一会儿还要谈到这里。其他的,按照自己的需要来配置了,说明文档够清楚了,我就不多说啥了。

专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们
相关推荐
MSP430 学习套件(一)
AI 驱动图形化 MCU 配置器选择器
三星代工的2nm骁龙8 Elite Gen5被砍,厂商无人问津
MSP430 汇编程序设计 (二)
GAA晶体管市场规模、份额和趋势预测(2034)
高通的18核 Snapdragon X2 Elite Extreme在基准测试中占据主导地位
MiniARM 工控板在电网参数监测仪中的应用
MiniARM 汽车考试系统中的应用
MIC2951构成的具有输入欠压关断功能的稳压器电路
欧盟推动《芯片法案 2.0》投资
MIC2951构成的具有电性能状态指示器的稳压器电路
求购ARM9的开发板
欧洲推动光子学占据主导地位
MSP430 汇编程序设计 (三)
Vishay推出业内首款采用SMD封装的车规级Y1陶瓷电容器
MiniARM 汽车参数测试仪中的应用
MIC2951构成的一旦有出错信号就能及时关断输出的稳压电源电路
现在评选10月精华文章及突出贡献奖
MIC2951构成的4~20mA的电流环开路探测器电路
MiniARM 工控板在环境数据监控系统中的应用
MiniARM 工控板在煤矿瓦斯监控系统中的应用
泰山的新裤子
英特尔瞄准了AMD Threadripper及其新Granite Rapids-WS CPU
非大陆供应链领军12寸SiC突围先进封装 中国也乐见其成
Platform CD 1.1
MSP430 汇编程序设计 (一)
一个游戏专业学生的日记....
英特尔的第六次代工推动:在人工智能工厂竞赛中考验其未来
MSP430 学习套件(二)
MIC2951和PNP型晶体管组成的扩流电路