TrueFFS原理及其在CF卡上的实现
noOfDrives++;
}
其中,映射窗口的基地址以4KB为单位。TrueFFS系统每100ms调用CF卡检测函数,判断CF卡是否存在。CF卡上电函数和断电函数主要用于节省系统功耗,当CF卡出于闲置状态时,TrueFFS就关闭CF卡的电源。CF卡初始化函数负责访问CF卡之前的所有前期工作。如果插入CF卡型号改变了,cfGetAndClearCard ChangeIndicator函数就会及时向TrueFFS系统报告。sysTffs.c中需要实现上述的所有函数。大部分情况下,开发人员不必关心FLSocket数据结构,只关心它的成员函数。一旦这些成员函数实现了,开发人员不能直接调用它们,它们被TrueFFS系统自动调用。
4 实现与性能分析
完成TrueFFS的编写之后,经过编译链接,如果一切正确,VxWorks运行时会调用tffsDrv()函数自动初始化TrueFFS系统,包括建立互斥信号量、全局变量和用来管理TrueFFS的数据结构,注册Socket驱动程序。当TrueFFS需要和底层具体硬件打交道时,它使用设备号(0~4)作为索引来查找它的FLSocket结构,然后用相应结构中的函数来控制它的硬件接口。成功完成Socket注册之后,用户就可以调用tffsDevCreate()创建一个TrueFFS块设备,调用tffsDevFormat格式化设备,再调用dosFsDevInit()函数加载DOS文件系统。之后,用户就可以像使用磁碟设备一样使用了CF卡了,如调用open、read、write、close、creat等文件操作函数。
TrueFFS的简单测试方法可以从主机复制一个文件到CF卡,再将这个文件从CF卡复制到主机,然后比较原文件和最后文件的区别。用户也可以调用tffsShow()或tffsShowAll()来查看TrueFFS的创建情况。
TrueFFS可以极大地延长Flash设备的寿命。一般CF卡可以擦写10万次,如果不使用TrueFFS系统,寿命就非常短。例如,在CF卡上实现一个FAT16格式的DOS文件系统,簇的大小是2KB,如果要向CF卡中写入一个8MB的文件,共占用4K个簇,出于可靠性考虑,每写一个簇,FAT表就更新一次,写一个8MB的文件,FAT表需要更新4096次;而FAT表一直位于某个固定扇区中,所以8MB的文件最多只能更新25次,一个每天需要备份的文件,那么CF卡的寿命只有25天。这种应用方式使CF卡寿命与其容量无关,其它绝大部分可用扇区白白浪费。
采用了TrueFFS系统之后 ,因为损耗均衡算法不允许FAT表固定在某个扇区中,损耗平均分配给所有物理扇区。期望的CF卡寿命可以用下列公式计算:
期望寿命=(容量×总擦写次数×0.75)/每天写入字节数
其中,0.7
5表示文件系统和TrueFFS管理结构的额外消耗系数。如果同样每天备份一个8MB文件,那么期望寿命=(64MB×100 000×0.75)/8MB=600000(天)(约1643年)。
可见,TrueFFS惊人地延长了Flash器件的寿命。VxWorks自带的TrueFFS驱动器覆盖了业界大部分主流Flash芯片,考虑了各种芯片的不同擦写算法,效率较低。对于产时性要求苛刻的系统,开发人员应该按照所用的Flash器件有针对性地制作了TrueFFS驱动器。目前某些CF卡本身实现了一定程度的损耗均衡算法,但是没有TrueFFS那么高效。
《TrueFFS原理及其在CF卡上的实现(第4页)》