wwm_820924
驱动牛犊
驱动牛犊
  • 注册日期2004-07-04
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望169点
  • 贡献值1点
  • 好评度22点
  • 原创分0分
  • 专家分0分
阅读:4256回复:14

怎样让68013读速度突破22.5MB/s

楼主#
更多 发布于:2009-11-21 18:38
68013外接FIFO,使用GPIF方式,EP6IN传输,缓冲区配置为4*512,传输方式为BULK。
驱动是自己写的,为了提高速度,想了不少方法,可就是突破不了22.5MB/S,实测过读USB硬盘,能到33MB/s,说明我的主板是支持的。

先说说我的当前做法:
1、驱动初始化时,创建一个读URB,传输字节为256K。
2、在需要读取数据时,启动一个内核模式线程(驱动中创建的)。
3、线程中循环往USB总线驱动发送读URB(一次读返回,马上发送下一个,阻塞方式)。

请速度做到30MB/s以上的朋友帮忙指点下迷津。谢谢!
usbwolf
驱动牛犊
驱动牛犊
  • 注册日期2009-10-27
  • 最后登录2010-01-18
  • 粉丝0
  • 关注0
  • 积分25分
  • 威望231点
  • 贡献值1点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2009-11-23 15:39
请问楼主你的块传输是异步还是同步?
wwm_820924
驱动牛犊
驱动牛犊
  • 注册日期2004-07-04
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望169点
  • 贡献值1点
  • 好评度22点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2009-11-23 21:13
回 1楼(usbwolf) 的帖子
USB协议,块传输还有异步同步的说法吗?不知道你说的是不是指驱动程序。

外部FIFO是同步的,驱动也是同步的。
usbwolf
驱动牛犊
驱动牛犊
  • 注册日期2009-10-27
  • 最后登录2010-01-18
  • 粉丝0
  • 关注0
  • 积分25分
  • 威望231点
  • 贡献值1点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2009-11-24 11:17
嗯,我问的是驱动是否是异步的
usbwolf
驱动牛犊
驱动牛犊
  • 注册日期2009-10-27
  • 最后登录2010-01-18
  • 粉丝0
  • 关注0
  • 积分25分
  • 威望231点
  • 贡献值1点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2009-11-24 16:05
请问楼主,在驱动层你用的是同步,在应用层如果一直的测试读取数据,那你的应用层会不会一直占用cpu资源?
usbwolf
驱动牛犊
驱动牛犊
  • 注册日期2009-10-27
  • 最后登录2010-01-18
  • 粉丝0
  • 关注0
  • 积分25分
  • 威望231点
  • 贡献值1点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2009-11-25 10:17
还有一个问题是你的功能驱动程序一直在从总线驱动读取数据数据,那你的应用层怎么得到数据呢?我最近也在写68013的驱动,可以一起讨论一下。我qq 289238641
wolfgang
驱动牛犊
驱动牛犊
  • 注册日期2009-08-22
  • 最后登录2010-10-20
  • 粉丝0
  • 关注0
  • 积分32分
  • 威望291点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2009-11-26 15:23
楼主,你在系统内核不停的从总线读取数据,那如果读到数据怎么通知应用程序呢?而且如果你的内核线程用阻塞方式的话,系统进程会不会一直占用cpu时间片呢?
usbwolf
驱动牛犊
驱动牛犊
  • 注册日期2009-10-27
  • 最后登录2010-01-18
  • 粉丝0
  • 关注0
  • 积分25分
  • 威望231点
  • 贡献值1点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2009-11-27 11:24
楼主,你的块传输是缓冲区方式?缓冲区方式比直接内存方式要慢吧
wwm_820924
驱动牛犊
驱动牛犊
  • 注册日期2004-07-04
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望169点
  • 贡献值1点
  • 好评度22点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2009-11-27 13:52
祝贺速度超过30MB/s(有时超40MB/s),关键是GPIF时序的设计,驱动还是以前写的,这几天比较忙,赶时间,改天详细总结下过程。

现简单描述下PC机程序实现机制。

内核用的同步方式,有阻塞,但不占用CPU的阻塞。

读数据过程如下:

内核线程-->循环发送URB到下一层USB驱动-->URB读取返回-->拷贝数据到内核缓冲区。

应用层线程-->ReadFile进入内核驱动-->判断缓冲区是否有数据-->有则读取数据并返回,无则延时等待5ms(阻塞,但不占用CPU),再次判断,有无都返回。
usbwolf
驱动牛犊
驱动牛犊
  • 注册日期2009-10-27
  • 最后登录2010-01-18
  • 粉丝0
  • 关注0
  • 积分25分
  • 威望231点
  • 贡献值1点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2009-11-27 14:41
在pc端不停的读取数据的话,cpu占用率一般会是多少呢?
wwm_820924
驱动牛犊
驱动牛犊
  • 注册日期2004-07-04
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望169点
  • 贡献值1点
  • 好评度22点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2009-12-01 21:46
cpu占用率很低,关键是所有延时、等待都是不占CPU的。
wolfgang
驱动牛犊
驱动牛犊
  • 注册日期2009-08-22
  • 最后登录2010-10-20
  • 粉丝0
  • 关注0
  • 积分32分
  • 威望291点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2009-12-22 15:51
驱动层和应用层怎么通信呢?应用层从哪块缓冲区读取数据呢?虽然对楼主的思路了解,但是对于怎么实现还是不清楚,望楼主赐教!
sealove518
驱动小牛
驱动小牛
  • 注册日期2007-09-08
  • 最后登录2012-07-01
  • 粉丝1
  • 关注0
  • 积分24分
  • 威望799点
  • 贡献值1点
  • 好评度41点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2010-01-19 09:33
顶一下
http://soez.taobao.com 淘宝网电子元件平价超市
wolfgang
驱动牛犊
驱动牛犊
  • 注册日期2009-08-22
  • 最后登录2010-10-20
  • 粉丝0
  • 关注0
  • 积分32分
  • 威望291点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2010-01-26 10:10
楼主怎么还没总结呢
drv_murphy
驱动牛犊
驱动牛犊
  • 注册日期2010-01-28
  • 最后登录2010-02-01
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望61点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2010-01-28 22:48
68013的GPIF 最高平均速度能在 40MB/s    2M fifo 只能上24MB/s  听说要上最高的 40MB/s 需要32M的fifo。。

这儿是说的裸数据,加协议信息可能就该是 400Mbps了。

USB的 bulk 就是没有时间观念,要很大的fifo才能保证数据正确无误。
游客

返回顶部