这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » ZLG,FS 关于ZLG/FS的速度问题

共2条 1/1 1 跳转至

ZLG,FS 关于ZLG/FS的速度问题

院士
2006-09-17 18:14:16     打赏
ZLG,FS 关于ZLG/FS的速度问题



关键词: 关于     速度     问题    

院士
2006-12-22 22:43:00     打赏
2楼
1: 关于ZLG/FS的速度问题    用了一段时间的SmartARM2200开发板,感觉它的整体功能是很不错的,它上面带有ISP1161 PACK板,提供有USB1.1的主机和设备接口,用HostMassLib和ZLG/FS可以读写U盘文件,给应用带来很大的方便。
    不过我在使用HostMassLib和ZLG/FS读写U盘文件时,感觉速度很慢,程序是参照范例自己写的,UCOSII中也没有其它多余的任务,大概的从U盘读文件速度只有300~400Bytes/s,读取少量数据还可以,读取数据量大的话就要很长时间了。比如我从U盘中读了一个240×320的图片文件然后在TFT6758上显示,要7分多钟才完成。该图片文件是按照TFT6758要求取模后生成的二进制文件,大小是150K。如果把图片数据编译到程序里,直接在TFT6758上显示半秒钟都不要。
    请问周工,在SmartARM2200开发板上,CPU频率44M,BCFG0 = 0x10001460 外部RAM,BCFG1 = 0x10000460 外部Flash,读取U盘文件的速率应该可以做到多少?谢谢! 2: 如果速度太慢,用起来就没有什么实际意义了如果速度太慢,用起来就没有什么实际意义了。 3: 你看看FileGetCh函数就知道为什么慢了 4: 我的测试结果    的确,函数FileRead就是通过不断调用FileGetCh从文件中读取数据,FileGetCh这个函数执行起来很花时间。参数处理、获取文件所在逻辑盘信息、计算数据在哪个扇区、读取数据都要花时间,但是我想最花时间的还不在这里,真正花时间比较多的是ZLG/FS里面对Cache的操作。
    体现在FileGetCh中就是OpenSec和ReadSec这两个函数,OpenSec是打开Cache,ReadSec是读逻辑盘数据到Cache。它们当中都有这样的循环:
for (i = 0; i < MAX_DISK_CACHES; i++)  作用是为了给非空闲Cache的RW_ID值加1、判断逻辑扇区是否已经被缓存、找出对应逻辑扇区在Cache中的位置。在OpenSec中有3个这样的循环,在ReadSec中有1个。
    在fat.h中默认的MAX_DISK_CACHES值为200,可以想象MAX_DISK_CACHES值设置得越大,在读取大量数据时反而效率越低(这是相对于速度比较快的存储介质而言的)。因为不得不花很多时间去给非空闲Cache的RW_ID值加1,去判断逻辑扇区是否已经被缓存,去找出对应逻辑扇区在Cache中的位置。虽然说这样的循环并不是每次都要进行到底(给非空闲Cache的RW_ID值加1每次都要进行到底),只要找到了合适的Cache,就会用Break语句退出。但是在读取大量数据时很多Cache都被使用了,要找到一个合适的Cache就要进行很多次比较。
    为了进行验证,进行了以下的测试。用HostMassLib和ZLG/FS从U盘读取一个150K的图片文件(240×320),并在TFT6758上显示出来,采用不同的MAX_DISK_CACHES值。
    MAX_DISK_CACHES=200,读取用时7分钟,速度大约300~400Bytes/s
    MAX_DISK_CACHES=20, 读取用时65秒, 速度大约2363Bytes/s
    MAX_DISK_CACHES=10, 读取用时44秒, 速度大约3491Bytes/s
    MAX_DISK_CACHES=1,  读取用时25秒, 速度大约6144Bytes/s
    从这些测试数值可以看出MAX_DISK_CACHES值取得越小,读取文件的速度反而越快,并且速度变化幅度是很大的。MAX_DISK_CACHES不能设为0,否则编译不能通过。
    总之,我的结论是,对于速度比较快的存储介质,文件系统Cache数目越多,读取大量数据时效率越低,速度越慢。Cache对于速度很慢的存储介质才是有用处的。而在《ARM嵌入式系统软件开发实例一》第58页有这样一句话:

    “注意:此数(指MAX_DISK_CACHES)对Cache的效率影响极大,太小会极大的降低Cache的性能,进而影响整个ZLG/FS的性能。”
    我想,书上这句话与我的测试结果刚好相反,但也不能说这句话是错的,因为它没有加条件。
    以上观点仅仅代表个人的看法,由于对ZLG/FS文件系统的理解有限,难免会引出错误的结论,希望大家提出各自的看法。 5: 你看看FileGetCh函数就知道为什么慢了 <无内容>应该是看看FileRead函数就知道了
也就是说每读一个字节都调用一次FileGetCh,一个Sector不知道要重复读多少次,不是有毛病么,改写之后能提高几个数量级的速度 6: 好像是这样 7: 这个要顶一下,请周公解释解释、有没有改进方法,如果有,马上提示!
我也是要完成这个工作,不然的话,我死的很惨。 8: 关注 9: 我马上要用LPC2214+读USB盘,能交个朋友吗!cyuan5@163.com打算搞个SmartARM2200板,它本身就有带有ISP1161 PACK板? 10: 怎么没人回答周公呢?
有解答的方法吗 11: 如楼上所说,改一下那个函数还有可以改一下查询算法,这样速度是很快的,真的很快,我512个cache速度也很快的,缺陷就是最大只能512了 12: 好像有几处BUG。不过不影响使用 13: 是的    是的,应该把FileRead函数改掉,由原来调用FileGetCh函数的一个字节一个字节的读取改为一个扇区一个扇区的读取,这里主要要处理好文件读取偏移量与读取数据个数之间的关系,极端情况下即使只读取两个字节也要分别读取两个扇区。
    在进行连续的大量数据读取的时候,可以跳过Cache,直接对扇区操作,使用Cache会降低效率,Cache对于读取大量数据来说意义不大。但是读写数据量不是很大(比如小于512字节)且读写很频繁的时候,使用Cache绝对会提高性能。
    改过之后性能提高很大,读U盘的速率有50Kbyte/s,这里要说一下,因为即使不使用文件系统直接调用HostMassLib驱动对U盘扇区进行操作速度也仅仅是60Kbyte/s左右,文件系统的开销已经不大了。

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]