阅读:1442回复:6
急问:如何使IRP等待?
小弟在开发USB2.0驱动和应用程序,遇到一个问题:
采用Bulk传输模式由PC向设备传输数据,由于所传文件较大(几G),传输速率较高(30Mbyte/s),所以在内存中开辟两个buffer,由应用程序触发驱动,然后驱动在内核模式下传输数据。而应用程序每隔1ms检查buffer一次,如果在传第一个buffer的数据,那么应用程序就更新第二个buffer的数据。这样循环直到文件传完。驱动在内核模式下传输数据是利用两个IRP交替传输数据。问题是:由于数据传输速度太快,第一个buffer的数据传完了,要传第二个buffer的时候,第二个buffer的数据还未更新完,造成传输数据重复。我是想如果要传buffer的数据还未更新好时,让IRP等在那,但不知如何等。用过Kewaitsingleobject函数,但是softice老是报告使用不对,然后就死机了。还请那位高手执教一下。谢谢!!! |
|
沙发#
发布于:2003-07-17 21:40
不知道 驱动在内核模式下传输数据是利用两个IRP交替传输数据
是什么意思,但你的方法肯定有问题,对于共享数据的访问,没有保护方式,可以加一个简单的自选锁保护。 |
|
|
板凳#
发布于:2003-07-17 22:19
我在驱动程序中建立了两个IRP,使用IoSetCompletionRoutine,如果数据没有传输完,在complete routine里继续更新IRP和URB的内容,传输数据。但是此时如果另一个buffer的数据没有更新好的话,我想让irp 在那里等待数据更新好。
|
|
地板#
发布于:2003-07-18 08:54
在二个buffer中加上标记字符。以表示数据是否准备好。
不过这是个笨办法。 |
|
地下室#
发布于:2003-07-21 01:02
通过 Event Objects ,来同步。看看DDK,再看看操作系统的教材
|
|
5楼#
发布于:2003-07-21 22:25
你的问题应该是程序流程的问题。不知道你在哪儿 调用Kewaitsingleobject函数的,不要在完成例程中调用。
|
|
|
6楼#
发布于:2003-07-21 22:57
你的问题应该是程序流程的问题。不知道你在哪儿 调用Kewaitsingleobject函数的,不要在完成例程中调用。 我是在IoSetCompletionRoutine里用的Kewaitsingleobject。为什么不能在完成例程里调用呢? |
|