lioniamhero
驱动小牛
驱动小牛
  • 注册日期2003-05-31
  • 最后登录2005-10-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1417回复:7

swf2003大侠:请教

楼主#
更多 发布于:2003-11-06 18:08
swf2003大侠:请教
  您好:
  请教你几个问题。
 一 我用CY7C68013的片子做实时数据采集系统,用的试BULK,SLAVE模式。曾在本站内看到过你的帖子,是关于如何保证数据接收完整,不掉数据,您提的是用两个URB来构建,具体如何运行机制,小弟特向您请教。我现在速率高的话,数据就会掉(我要一边采,一边存盘,而且要保证数据实时)。请教:用什么好的机制来实现好呢。我还看过本贴中有用异步发32个Deviceiocontrol来请求数据,但我觉得我的要求是数据立即就返回了。用异步能行吗,另外驱动中要如何实现呢。
 二 USB协议中用块传输和实时传输都分别在什么情况下使用呢 ,我用实时可行吗。
  
swf2003
驱动中牛
驱动中牛
  • 注册日期2003-02-13
  • 最后登录2011-10-28
  • 粉丝1
  • 关注0
  • 积分4分
  • 威望22点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-11-07 11:38
1、如果你的数据能立即返回的话可以用同步处理,但应该也能用异步处理的。
异步处理可以考虑这样实现。创建一个系统线程,在线程中发IRP,循环的读取数据保存到缓冲中,在 SRB_READ_DATA 到时就可以直接从缓冲区中取数据,不需要等待。 或者用延迟调用 DPC ,在IRP的完成里程中给DPC队列中增加一个 DPC 对象,可以用两个IRP交换使用,这样就可以保证连续的读取数据。 用这种异步方式主要是保证从硬件中能实时的读取数据,具体的丢数据,我估计还与SRB_READ_DATA  发的机制有关,因为用于异步处理的缓冲大小是有限的,如果不即使读取的话就会覆盖的。
2、BULK 保证数据的准确性, ISOC 保证实时性。
你的认可是对我最大的鼓励!
lioniamhero
驱动小牛
驱动小牛
  • 注册日期2003-05-31
  • 最后登录2005-10-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-11-08 22:47
1、如果你的数据能立即返回的话可以用同步处理,但应该也能用异步处理的。
异步处理可以考虑这样实现。创建一个系统线程,在线程中发IRP,循环的读取数据保存到缓冲中,在 SRB_READ_DATA 到时就可以直接从缓冲区中取数据,不需要等待。 或者用延迟调用 DPC ,在IRP的完成里程中给DPC队列中增加一个 DPC 对象,可以用两个IRP交换使用,这样就可以保证连续的读取数据。 用这种异步方式主要是保证从硬件中能实时的读取数据,具体的丢数据,我估计还与SRB_READ_DATA  发的机制有关,因为用于异步处理的缓冲大小是有限的,如果不即使读取的话就会覆盖的。
2、BULK 保证数据的准确性, ISOC 保证实时性。
 

  终于盼到您了。
 1 数据是可以立即返回的,因为数据是实时采集的,您说的SRB_READ_DATA ,我不明白是什么意思。我是第一次搞WDM开发。
 2 我把我的现象给您讲,请您分析一下。
   我是再驱动里用系统线程来和USB设备交互数据,我开两个大缓存,一个缓存接收满了后,驱动就用事件来通知应用来把这缓存的数据读走,同时,继续写第二个缓存。当第二个缓存满了以后,同样用事件通知应用读走并存盘。我认为在写第二缓存的快满的同时,第一个缓存的数据应该是已经存盘好了的,这样循环接收数据,来保证数据的完整,准确和实时。现在的现象是我的数据速率一高,几十M比特后就会断数据,掉数据,不连续。我理解我的操作系统一边要读取数据,一边要保存数据并存盘。CPU只有那么时间片来工作。无法保证,如果我存盘的时候,数据没有从USB设备上读到的话,那么就有可能掉数据。您有什么好的机制和算法吗。
  3 还有如果用同步的话,那就一直在读取数据,那么我的应用就没有返回了。应用程序就会像死在那里。就无法控制采集了。
  
ysy
ysy
驱动中牛
驱动中牛
  • 注册日期2002-02-18
  • 最后登录2008-08-25
  • 粉丝0
  • 关注0
  • 积分201分
  • 威望29点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-11-09 07:55
1.启动2个线程,一个负责存盘,一个通过urb收发数据
2.维护一个fifo队列,收到数据添加到队列尾,从队列头取数据存盘
lioniamhero
驱动小牛
驱动小牛
  • 注册日期2003-05-31
  • 最后登录2005-10-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-11-09 09:17
1.启动2个线程,一个负责存盘,一个通过urb收发数据
2.维护一个fifo队列,收到数据添加到队列尾,从队列头取数据存盘

  第一步我是这样做的。第二步请教如何具体实现呢。
ysy
ysy
驱动中牛
驱动中牛
  • 注册日期2002-02-18
  • 最后登录2008-08-25
  • 粉丝0
  • 关注0
  • 积分201分
  • 威望29点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-11-09 13:05
就是一个先进先出队列,这有什么好说的呢?
lioniamhero
驱动小牛
驱动小牛
  • 注册日期2003-05-31
  • 最后登录2005-10-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-11-10 15:21
先给分。
  谢谢大家,其实我想问题得关键是用BULK模式要实现实时采集得话就只有不停得轮循得方法来读取数据了。有没有别的方法呢。特别是能否用中断什么得。
ysy
ysy
驱动中牛
驱动中牛
  • 注册日期2002-02-18
  • 最后登录2008-08-25
  • 粉丝0
  • 关注0
  • 积分201分
  • 威望29点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-11-11 09:59
肯定不能用中断,微软已经在ohci给做掉了。

虽然是不停的轮循,但不会耗费太多cpu资源,因为底层总线驱动应该返回status_pending,这时应该等待底层完成irp,这会引起线程阻塞。其实你不必用系统线程,使用用户线程就可以了。
游客

返回顶部