我仿照着圈圈的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;
}
|