修改znFAT 提高znFAT效率&nbs…

最近拿到一个项目,关于FAT32的。以前搞过fatfs的移植,那会也没怎么关注效率。这次拿到的是一个已经移植好的usb 1.1的协议,而且已经有了文件存储协议FAT32,基础移植库是znfat。

 

刚开始看的时候,项目做出来的效率很低,也就是20KByte/s的速度。很低。

不是很懂得USB bulk-only的协议,大致扫了一遍,略微修改了一些明显占用处理时间的地方,同时删除了一些没有效用的逻辑部分,达到了3.3S,100kByte数据,速度是30KByte/s。当然这都不是主要的,主要的是后面关于FAT32协议部分的优化

 

接触过两个FAT32协议库了,以前也看过FAT32标准协议,这次趁着接触znfat,也记录下自己的学习历程。
自己做的上个平台,由于底层USB驱动不错,所以FAT32协议我移植上去之后,速度就已经达到200KByte/s了,所以那会也没关注与FAT32的优化,新接触这个,确实USB底层通信协议略差一些,用的也是USB1.1,本身也略慢一些。

 

看这两个FAT32协议,发现跟底层USB驱动对接的,主要就是一个读函数,一个写函数。disk_read,disk_write。均是按block来读和写。


我测试了下新平台的disk_write的效率,不考虑FAT32协议,100KBytes数据,一次性通过disk_write连续写入,耗费时间约为0.4s.也就是说,裸USB速度是250KByte/s。这个速度是在我前面已经初步优化过USB协议及逻辑结构之后的速度。同时做了另外一个测试,就是将这100KByte数据,按最小单位block(512字节),分多次写入磁盘,得出的结论是1.4s,同样都是通过disk_write写入数据,发现一次性写入跟多次性写入数据差别就是倍数关系了。所以disk_write里面也有很大的优化空间。

 

跟进disk_write,有一个更加底层的写函数write_func1,这个函数是实际底层的写函数,位于USB协议层跟disk_write之间。这个的测试结论时间是一次性写入时间为1秒,多次分批写入时间为0.3秒。跟上面的比对,时间减少。在没仔细研究bulk协议的情况下,发现修改一个MAX_BLK的值,也可以提高速度,但是由于没有详细阅读协议,所以改回原来的值了,暂时不动它,未来再优化。


通过优化一些逻辑之后,经过多个测试发现:
初始化U盘,创建文件等的耗时约为0.6秒。
查询可用簇的时间约为0.9秒。
100K数据一次性通过disk_write写盘时间约为1秒。
综合得出写入一个100KByte文件时间为:2.5s = 0.6 + 0.9 + 1;

这样写入400k数据的理论时间就应该为 0.6 + 4 * (0.9 + 1);

 

所以,后期的优化集中在:
1. 创建文件耗时
2. 查询block并写入block
3. USB通讯协议(Bulk-Only)

 

由于我本身是做软件出身,对于逻辑性东西比较擅长,也比较爱搞。但是对于硬件一类的就偏弱一些。所以打算先从前两个优化点开始优化。
PS:后来在看USB通讯协议的时候,发现他做的有一个逻辑性错误,所以disk_write的速度也降低了很多。不过做驱动做的好的,一般不会犯这种错误。

先做了第二项工作:


将查询block跟写入block优化,从各自作战,变为统一规划。收集信息,计算整个文件大小,然后一次性写入。
通过优化znfat协议以及老代码的逻辑,达到了120KByte/s的FAT32存储速度。
同时自己做了一个大胆的尝试,通过尝试结论发现,应该可以做到峰值,或者稳定值为200KByte/s的存储速度。但是这个也要在120的基础上加一些复杂逻辑。自己得出的200KByte/s的速度是通过简单的逻辑模拟实现,目前可以应对的情况很少,而且逻辑复杂了,会存在三个问题:1.维护难度高 2.异常情况多,可能会遗漏 3.思路不好的话,会导致效率降低

 

现在打算在现有基础之上,继续第一项优化,但是初步估计,创建文件耗时降低程度应该不大。

在对znfat多个模块优化完成之后,应该可以从以前刚接手到的20KByte/s,优化到2000-286KByte/s。实际优化结论,有待后期优化结论。哈哈。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值