lyangn
驱动牛犊
驱动牛犊
  • 注册日期2003-03-25
  • 最后登录2003-07-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1225回复:5

急问:IRP等待问题?

楼主#
更多 发布于:2003-07-17 21:36
小弟在开发USB2.0驱动和应用程序,遇到一个问题:

采用Bulk传输模式由PC向设备传输数据,由于所传文件较大(几G),传输速率较高(30Mbyte/s),所以在内存中开辟两个buffer,由应用程序触发驱动,然后驱动在内核模式下传输数据。而应用程序每隔1ms检查buffer一次,如果在传第一个buffer的数据,那么应用程序就更新第二个buffer的数据。这样循环直到文件传完。驱动在内核模式下传输数据是利用两个IRP交替传输数据(使用IoAllocateIrp和IoSetCompletionRoutine)。问题是:由于数据传输速度太快,第一个buffer的数据传完了,要传第二个buffer的时候,第二个buffer的数据还未更新完,造成传输数据重复。我是想如果要传buffer的数据还未更新好时,让IRP等在那,但不知如何等。用过Kewaitsingleobject函数,但是softice老是报告使用不对,然后就死机了。还请那位高手执教一下。谢谢!!!
gjltce
驱动小牛
驱动小牛
  • 注册日期2003-07-05
  • 最后登录2011-12-10
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望59点
  • 贡献值0点
  • 好评度25点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-07-18 08:56
在二个buffer中加上标记字符。以表示数据是否准备好。
不过这是个笨办法。


 
kilroy_guo
驱动大牛
驱动大牛
  • 注册日期2002-10-29
  • 最后登录2005-11-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-07-18 09:24
小弟在开发USB2.0驱动和应用程序,遇到一个问题:

采用Bulk传输模式由PC向设备传输数据,由于所传文件较大(几G),传输速率较高(30Mbyte/s),所以在内存中开辟两个buffer,由应用程序触发驱动,然后驱动在内核模式下传输数据。而应用程序每隔1ms检查buffer一次,如果在传第一个buffer的数据,那么应用程序就更新第二个buffer的数据。这样循环直到文件传完。驱动在内核模式下传输数据是利用两个IRP交替传输数据(使用IoAllocateIrp和IoSetCompletionRoutine)。问题是:由于数据传输速度太快,第一个buffer的数据传完了,要传第二个buffer的时候,第二个buffer的数据还未更新完,造成传输数据重复。我是想如果要传buffer的数据还未更新好时,让IRP等在那,但不知如何等。用过Kewaitsingleobject函数,但是softice老是报告使用不对,然后就死机了。还请那位高手执教一下。谢谢!!!


你是在完成例程里面kewait么?报的错是switch_DPC吧。
二姑家的猫想......
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-07-18 09:59
你干吗非要开两个buffer呢,你开10个不行吗?
你把那两个buffer的总数数量不变,但是分成10块,然有循环进行,这样就应该不会出现你那个问题了,如果10个不够就开成20个呗。
lyangn
驱动牛犊
驱动牛犊
  • 注册日期2003-03-25
  • 最后登录2003-07-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-07-20 00:46
[quote]小弟在开发USB2.0驱动和应用程序,遇到一个问题:

采用Bulk传输模式由PC向设备传输数据,由于所传文件较大(几G),传输速率较高(30Mbyte/s),所以在内存中开辟两个buffer,由应用程序触发驱动,然后驱动在内核模式下传输数据。而应用程序每隔1ms检查buffer一次,如果在传第一个buffer的数据,那么应用程序就更新第二个buffer的数据。这样循环直到文件传完。驱动在内核模式下传输数据是利用两个IRP交替传输数据(使用IoAllocateIrp和IoSetCompletionRoutine)。问题是:由于数据传输速度太快,第一个buffer的数据传完了,要传第二个buffer的时候,第二个buffer的数据还未更新完,造成传输数据重复。我是想如果要传buffer的数据还未更新好时,让IRP等在那,但不知如何等。用过Kewaitsingleobject函数,但是softice老是报告使用不对,然后就死机了。还请那位高手执教一下。谢谢!!!


你是在完成例程里面kewait么?报的错是switch_DPC吧。 [/quote]

好像是的!如何让IRP等下来那?
liufoxs
驱动牛犊
驱动牛犊
  • 注册日期2002-01-18
  • 最后登录2005-12-31
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-09-09 10:18
兄弟,我请教你一问题,你是如何实现BULK传输的,IOALLOCIRP,建立线程一直在监测irp的状态吗,能否列出一段代码让兄弟看看
liufoxs
游客

返回顶部