打印

如何提高自制U盘的读写速度?

[复制链接]
2060|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
iqizheng|  楼主 | 2013-4-30 10:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我仿照着圈圈的128M U盘代码尝试了一下2G,USB2.0高速的实现,可是发现读写速度还是不理想,比如写速度900k/s 左右,而读速度4M/s左右,无法和买的U盘比啊,故此有两个疑问,一是为什么买的U盘的写速度可以达到7M/s,读速度可以达到15M/s,它们的速度为什么这么快?硬件应该也一般吧,难道是专用的,还是算法牛的很?有没有人了解?
第二个疑问是我测试发现圈圈写扇区代码的以下部分,严重影响了写速度,因为Remain是根据命令封装包CBW包中的CBW.dDataLength和Write(10)中的传输长度中的长度大小判断的,可是这两个值好像恒定为0x10000,而不能超过该值,详见另外一个帖子https://bbs.21ic.com/icview-537161-1-1.html
所以以下代码的执行过于频繁,严重影响了写速度。@computer00 ,请问我分析的有问题没有? 有没有什么好的写入优化算法可以参考?
大家有何高见,欢迎解答,谢谢!

if(Remain==0) //剩余扇区数为0,不会再写了,需要写回
{
  if(FlashNeedWriteBack) //如果前面写了数据,则需要将当前读出的page写回
  {
   if(FlashWritePage()&0x01) //写入失败
   {
    Addr=FlashDealBadBlock(Addr,3);  //坏块处理
   }
  }

  //将地址所在页之后的页都从交换区复制回去
  //计算剩余页数        地址所在块的剩余页 = 地址所在块的下一块的块首地址 - 地址所在页的页地址
  Remain=(((Addr+FLASH_BLOCK_SIZE)&(~(FLASH_BLOCK_SIZE-1)))-(Addr&(~(FLASH_PAGE_SIZE-1))))/FLASH_PAGE_SIZE-1;
  //计算在交换块中的起始页地址         交换地址=交换块首地址+块内偏移地址
  SwapPageAddr=FlashGetCurrentSwapBlock()+(Addr&(FLASH_BLOCK_SIZE-1));
  for(i=0;i<Remain;i++)  //将该块内保存在交换块中剩余部分页的数据复制回该块
  {
   Addr+=FLASH_PAGE_SIZE;   //从下一页开始写
   SwapPageAddr+=FLASH_PAGE_SIZE;   
   if(0x01==(FlashCopyPage(SwapPageAddr,Addr)&0x01)) //如果复制失败
   {
    Addr=FlashDealBadBlock(Addr,2);  //处理坏块
   }
  }
  FlashNeedWriteBack=0; //清除需要写回标志
  FlashCurrentWriteSectorAddr=-1;
}

相关帖子

沙发
iqizheng|  楼主 | 2013-5-3 16:51 | 只看该作者
顶一下吧,不顶要沉了啊

使用特权

评论回复
板凳
西风冷| | 2013-5-3 21:49 | 只看该作者
顶一下,跪求大神解答!!!

使用特权

评论回复
地板
computer00| | 2013-5-8 00:06 | 只看该作者
你的NAND FLASH接口是专用的吗?还是用GPIO口模拟的?如果是GPIO模拟的会慢很多。

使用特权

评论回复
5
传说中的| | 2013-5-8 18:39 | 只看该作者

使用特权

评论回复
6
iqizheng|  楼主 | 2013-5-9 21:13 | 只看该作者
大神圈圈竟然回复了@computer00 ,NAND FLASH接口原来是GPIO口模拟的,后来为了实现主控芯片的硬件ECC校验功能,就更正过来了,使用了主控芯片的自带的SMC功能。不过现在经过我的优化,问题解决了些,谢谢关注。

使用特权

评论回复
7
l_lin2003| | 2013-5-13 17:35 | 只看该作者
我现在也遇到这个问题,写的速度慢,我测了一下,大约在700KB左右,我也怀疑是在写nandFlash的环节耽误了时间,准备测测
咱们一起研究研究,楼主解决了后,麻烦恢复一下,我解决的话也回复给你,
互相有个参考!

使用特权

评论回复
8
l_lin2003| | 2013-5-14 15:49 | 只看该作者
本帖最后由 l_lin2003 于 2013-5-14 16:02 编辑

楼主,我的问题基本解决了,原因还是在读写nandFlash那个地方耽误时间了
我原来定义U盘的块大小是512字节,然而nandflash一页的大小是2K,你也说了,U盘的写入是按块来写的,当数据跨块写时,就造成了反复的读取、备份、写入
从而造成了数据传输的速率降低
我优化的方法就是把U盘的块大小改成和nandflash一页的大小一致,这样来了数据直接写(当然得先擦出),省去了读取、备份的时间。
不过这样做会浪费掉一小部分nandFlash的空间

不过我有个问题:
你用的主芯片的RAM空间多大?一般都大多?写nandflash用的缓存好大啊。。。。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

25

帖子

0

粉丝