⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 log.txt

📁 包装了一个开源的FAT16文件系统
💻 TXT
字号:
我最近做一个需要往优盘里备份数据的东东,偷懒不想自己写FAT16文件系统,就来到火爆的这里想搜点猛料
看到了liguangqang大哥的帖“刚Google 一个SD卡和FAT16读写源代码 支持长文件名和子目录,一起测试下”,怦然心动,就去了这个文件系统的官网。
原来这是一个遵守GPL的开源轻量级FAT16文件系统,最近更新的还挺快的,文档丰富且包装得很漂亮,想必是作者没少花心血,就下了一个最新的。
他说这是用纯Ansi C写的,我就习惯性地先拿到VC上编译去,结果无数个莫名其妙的错误劈头盖脸滚滚来。还
好没吓倒我,硬着头皮看看,原因竟然是:他在函数中到处都充斥着局部变量定义语句,而C语言其实只允许局部
变量在函数最开始的"{"后面紧跟着定义,然后才能写普通语句,想必是GCC睁一只眼闭一只眼吧(不过VC对于.cpp的文件就允许
了)。为了以后减少麻烦我就不厌其烦地一个个整理起来,天呢竟然近100个要整理,眼都要冒金星了!
这个文件系统还附带了SD卡的“驱动程序”并给出了驱动程序的编写规范。因为是在Windows下,我想起不妨使用一个文件来做个虚拟的
16MB优盘,。开始我想得很简单,就开出一个16MB的文件全填0不就得了, 结果不行。最后还是不得不啃了点FAT16的资料才知道我这叫没格式化过,
就把格式化好的16MB优盘应具备的最起码内容也加到文件中,才算是伪造出了一个它能认的16MB优盘。它自带的SD卡驱动名为sd_raw,我就
把这个用文件模拟优盘的方案起名为FileSim,实现在文件FileSim.c中。这个文件系统还有个靓点:它实现了一个简易的字符命令界面,像unix下常用
的文件操作命令: mkdir, cd, ls, touch, write, rm它都有,用作测试最方便不过了。它写这个文件系统用的是ATmega168,控制台就用的是uart,
我把它移植到PC上就全还原成putc, puts, getch和printf(printf这种大块头人家没用,我是为图省事)了。
看来我还挺有打下手的天赋,程序没费什么事就编译连接成功,运行后俨然一个小小linux控制台,我试了这些命令,还都好使!
后来我意犹未尽,想了解一下它的效率如何。于是就在FileSim中添加了一个统计功能,就是统计读次数,写次数,读取字节数,写入字节数
什么的。然后再试,建了4个子目录,其中一个里面创建一个文本文件。设断点一看,妈呀,就这点小事读了500多次,写了160多次!深入点
研究后,发现它经常每次只写16个字节,于是导致读写次数很多,想到我还利用VC下的便利没有遵守“块设备一次只能按扇区一次读写一块”的规矩,如果
再按这个规矩还真不知道会乱成啥样呢。后来我粗看了看它的sd_raw实现源码,好像有什么"write buffer"之类的,想必能缓解一下。我就
想到CPU读写内存中cache的作用,突然发现不如也模拟一个带有cache的SD卡。进一步想,不如更抽象点模拟成一个带cache的通用块设备,
它跟下层物理块设备基本上只有“读扇区,写扇区”这两个接口函数,于是就添加了一个名为blkmdd.c的文件,之所以取这个名是因为我曾听到
过“块设备模型驱动程序”的字眼,好像是哪位讲WinCE的老师说的,感觉有启发。而物理块设备还是使用FileSim,只不过严格地一次读写512字节,
并且操作地址以512字节对齐。这个文件的实现比我想象中复杂了些。我基本的想法就是把最近
操作的扇区内容先暂时放在内存中,等到操作新扇区时再按“最久没有使用替换算法”找出一个“牺牲品”取而代之。实现后我也为了测试
性能加了统计功能,发现cache还真有用:哪怕只能缓存1个扇区,命中率都有90%以上,这就在占用1个扇区(约定俗成是512字节)的内存开销上,
减少了90%的物理设备读写操作数!后来我把cache单元数增加(反正PC内存多),却发现用处不太大:增加到4个cache单元时,命中率也只有94%
左右,想到单片机上寸土寸金的内存空间,其不实用性就更突出了。
我把这个工程包装成vc.net 2003的工程文件(如果只有VC6也没关系,只要用里面的源文件重新建立一个控制台项目就可以了),按GPL的规定
放出来,不过我没有用到Makefile就没有加了。
这个程序运行很简单:就是一个我刚说到的小小unix命令提示符,它能操作的空间就是一个16MB的文件,存储在可执行程序相同的目录下。
这里还有点小遗憾,cache操作本身也要用到处理器资源,就好像心脏工作本身要通过冠状动脉用掉“组织活动经费”的血液,消耗量却绝对比不上
人脑这种“烧钱大户”。我就是没能找到一个有效的方案准确地测试cache工作到底要占用多少CPU时间资源。不过我想,只要内存比块设备像优盘
SD卡什么的快得多,速度开销就很小吧,更主要是让flash可以活得更久些啊。而内存资源的占用,主要就是与扇区相同大小的缓冲区,还有十
几个字节的控制变量。控制变量和统计用掉的内存只是零头,还是那些跟扇区一样大小的缓冲区让人心疼了点,好在它好歹也是“取之于民,用之于民”的。
想要测试性能时,就在"BlkMdd_read"函数入口处加断点,程序喊停后,监视"sg_mddcb.stat"变量以及"sg_rwStat"变量。前者统计cache的读写,
后者统计伪优盘的读写。
这个工程虽然被包装在VC上,但是源文件基本还能保持"着清涟而不妖",去掉 include "stdafx.h" 应该就能移植到其它编译器上了

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -