frank_wang
驱动牛犊
驱动牛犊
  • 注册日期2002-09-28
  • 最后登录2005-10-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:4387回复:16

(给分)优盘速度实在太慢怎么办,传不了大文件

楼主#
更多 发布于:2003-05-04 23:12
AT89C51SND1芯片中自带的USB控制器做U盘。

由于此芯片RAM只有2K,因此,我开了512个字节的缓冲区,每写满512字节,便向Flash中写。众所周知的原因,Flash必须整个Block先擦除,然后才写得上,于是我找了一个Block做缓存,先把这个缓冲Block擦干净,然后向这个Block中写,写完(写多少PC决定)后,再将本来应该写到的那个Block擦干净,再将缓冲Block中的内容写到本来应该写的Block中。

读写功能确实实现了,数据也是正确的。这个我已经确认。

但结果发现,读写速度尚可忍受(9K/s左右),写的速度简直无法忍受,写大文件(五十K以上)必死机,因为速度慢到PC端老超时,最后BusHound中显示Pending。

我想问两个问题:
1、这个RAM比较小的系统如何解决速度问题
2、影响速度的瓶有哪些,市面上的优盘中的处理器应该也不太先进,为什么速度可以做到那么快(有到800K/S的)

另外,我的U盘无法完成格式化。

最新喜欢:

sandmansandma...
NewTech
驱动大牛
驱动大牛
  • 注册日期2002-10-02
  • 最后登录2010-03-27
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望263点
  • 贡献值0点
  • 好评度86点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-05-05 00:50
你也遇到这个问题了啊!其实肯定可以做到300k/s的,只是算法很复杂的,我现在也没完全弄明白!
如果你不需要完成逻辑-》物理扇区的转换,可以用比较简单的算法的!
joyup
驱动牛犊
驱动牛犊
  • 注册日期2002-03-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望4点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-05-06 10:58
芯片不见得一定要先进才快,主要是针对u盘有优化,比如说在和主机通讯的同时,也进行flash的读写就快了
frank_wang
驱动牛犊
驱动牛犊
  • 注册日期2002-09-28
  • 最后登录2005-10-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-05-06 11:24
我不太明白,单任务,怎么才能与USB通讯的时候,还可以读写FLASHKAH.我想我的瓶颈在Flash的写,因为Flash必须先把一簇擦干净,才可以写的.所以,当即使只写几个扇区时,我也得先把我找的一个缓冲FLASH Block先擦干净,然后把内容写进去,再将目的Block中未写的其他内容写入到缓冲区中,然后把目的Block擦掉,再将缓冲Block中的所有内容写回去,这样非常的慢的.
另外,我的Flash是用端口方式来控制的,用总线方式的话,好象时序上有些不太好弄.不知道大家怎么处理的.
joyup
驱动牛犊
驱动牛犊
  • 注册日期2002-03-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望4点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-05-06 12:33
可以考虑用中断方式来做,另外,不见得每次写flash的时候都要往缓冲里写,你可以加个判断,如果pc写的数据超过一个block的话,就不必再写道缓冲里了,直接擦除再写就可以了,应该可以提高些大文件的速度.

不知道你说的flash端口方式和总线方式是什么意思
frank_wang
驱动牛犊
驱动牛犊
  • 注册日期2002-09-28
  • 最后登录2005-10-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-05-07 19:43
谢楼上,我确实加了判断,如果簇号大于3(数据所在位置),就直接写,而不缓存。

我说的端口方式或总线方式,有点没说清,我指用端口来产生ALE,CLE等信号。我现在可以达到9~15K左右,可以读写了,就是慢,读写的时候不敢轻举妄动。

有没有高人还有什么高招啊!
frank_wang
驱动牛犊
驱动牛犊
  • 注册日期2002-09-28
  • 最后登录2005-10-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-05-07 19:46
说到中断方式,我用的是轮询,主程序里一直查看中断标志,一有中断马上进行相应处理,我主程序里也没干别的,请问这种方式与中断服务程序的方式差别大么?
NewTech
驱动大牛
驱动大牛
  • 注册日期2002-10-02
  • 最后登录2010-03-27
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望263点
  • 贡献值0点
  • 好评度86点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-05-07 19:57
你的这种做法应该没有什么问题啊,是不是你用的编译器的效率太低啊!
NewTech
驱动大牛
驱动大牛
  • 注册日期2002-10-02
  • 最后登录2010-03-27
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望263点
  • 贡献值0点
  • 好评度86点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-05-07 20:01
你可以在USB中断里接受数据,放到缓冲区里,在主程序里检测缓冲区数据的多少,大于一定的数值,就写入,再写之前判断是否为空的块,不是就要先擦除(这个时间大约2ms),按照500k/s的速度,缓冲区的大小差不多要8K byte。
NewTech
驱动大牛
驱动大牛
  • 注册日期2002-10-02
  • 最后登录2010-03-27
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望263点
  • 贡献值0点
  • 好评度86点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-05-07 20:03
忘记说一点了,现在市面上的优盘大多数采用专用的硬件控制器,所以读出的速度1M/s,写入800k/s
frank_wang
驱动牛犊
驱动牛犊
  • 注册日期2002-09-28
  • 最后登录2005-10-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-05-07 21:08


   编译器我用的是KEIL,应该还可以吧。

 另外,你的8KRAM是单独加片子么,还是你的处理器里本来就带的有呀?我目前的设计不太允许再加RAM了。而我的芯片中仅有2KRAM

由于我已经将Block4以后的写请求直接写入而不予缓存,其实我想关键其实对于大文件的写的过程来讲,已经是做到了最可能的快了。

另外,有没有这种可能,比如说我用的是轮询,对数据的处理都是在中断中处理的。会不会这种处理方式导致平时主程序太闲,而一旦有中断产生时中断中要处理的东西太多,影响速度。
NewTech
驱动大牛
驱动大牛
  • 注册日期2002-10-02
  • 最后登录2010-03-27
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望263点
  • 贡献值0点
  • 好评度86点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2003-05-08 02:32
这是不会的,你算一下就明白了,usb的速度最快是1MB/s,所以在中断中使用的时间只占1/3的cpu时间,而且有2mscpu是在空等的,此外中断接受子程序要用汇编来写才够快!
zhwlu
驱动牛犊
驱动牛犊
  • 注册日期2001-06-11
  • 最后登录2005-09-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2004-12-24 10:34
解决方案在这里:
QQ:69695814
TEL:029-86510973
lujunql
驱动小牛
驱动小牛
  • 注册日期2004-06-09
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2004-12-24 12:40
不是片子的问题!程序中有些是需要用汇编写的!
wsqss2004
驱动小牛
驱动小牛
  • 注册日期2004-06-11
  • 最后登录2012-02-17
  • 粉丝0
  • 关注0
  • 积分994分
  • 威望202点
  • 贡献值2点
  • 好评度91点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2004-12-24 13:04
Frank_wang:
你也在做89c51snd吗?有qq号没,我想和你交流一下!!!!!
我现在是在写的时候出现了这种情况。在写入时会莫名奇妙的增加64或128字节的0xff,代码如下(端点2out):
for(R_count=0;R_count<511;)  
             {    
               while(!(UEPSTAX&0x02));  
               total=UBYCTX;
               for(d_count=0;d_count<total;d_count++)          
              { Read_data[R_count]=UEPDATX; R_count++; }                          
               CLEAR_BIT_1(UEPSTAX);                
               while(!(UEPSTAX&0x40));
               total=UBYCTX;
               for(d_count=0;d_count<total;d_count++)          
              { Read_data[R_count]=UEPDATX; R_count++; }
               CLEAR_BIT_6(UEPSTAX);
             }
guo136
驱动牛犊
驱动牛犊
  • 注册日期2009-09-09
  • 最后登录2009-09-11
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望141点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2009-09-11 09:26
我也在做,问题一样啊,那为大侠帮一下
电子爱好者
cfqxd
驱动牛犊
驱动牛犊
  • 注册日期2009-09-02
  • 最后登录2009-12-25
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望61点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2009-09-13 12:56
人家用的是专用控制器,内部带DMA的,你的51片内存储、读取太慢,要是用CPLD来做,速度肯定没问题
游客

返回顶部