阅读:1425回复:5
关于USB驱动里进行异步数据读写的问题
我在驱动程序里建立了一个异步的URB,如下:
urb = D12_BuildAsyncRequest(DeviceObject,Irp,pipeHandle, TRUE); 然后设置完成例程: IoSetCompletionRoutine(Irp, D12_AsyncReadWrite_Complete, context, TRUE, TRUE, TRUE); 之后把这个IRP发送到下层驱动: ntStatus = IoCallDriver(deviceExtension->TopOfStackDeviceObject, Irp); 问题: 1,如果这个IRP完成的话它会自动调用我的完成例程D12_AsyncReadWrite_Complete,然后我在完成里成立处理返回的数据是吗? 2,前面那个过程我可以循环进行吗?也就是说我发送多个IRP下去排队,那么每次队列里最多有多少个这样的IRP呢?应该有什么限制吧。 3,如果我上层应用程序是用ReadFile()来读取数据,那么这个请求发送下去之后该函数是不是会立即返回呢?也就是说不等待驱动里面的irp完成并且把数据放到我传下去的缓冲区里? 因为使用同步操作出现丢失数据现象,所以才是用异步操作,希望做过的同仁给点指导,多谢多谢! |
|
沙发#
发布于:2003-08-06 09:08
swf2003 大侠,
是否需要在驱动程序里使用一个线程来发URB,保证时刻都有一个以上的URB在PENDING? 能否做成232串口的MSCOMM控件一样,驱动程序自己不停的发BULK_READ的URB,一旦收到数就给应用程序发一个ON_DATA_RECEIVED消息? 望swf2003 大侠不吝赐教。mojun163@163.com |
|
板凳#
发布于:2003-08-01 17:19
到kernel里接着给我解答吧
|
|
地板#
发布于:2003-08-01 17:18
多发了一贴
我怕你看不到吗 :D 这100分先给你了! |
|
地下室#
发布于:2003-08-01 16:44
申请两个 URB 一个 URB 申请一个 IRP,循环使用,这是我们以前用过的,不会有数据丢失。其实你想想对于一个实时设备,如果驱动不连续的取数据,肯定会丢的,所以不管有无 IRP_MJ_READ 来,我们都要从设备取数据的,当有 IRP_MJ_READ 请求,这时缓冲区就有数据,所以我们就可以直接处理然后返回,我觉得这样处理简单。
我在 Kernel Mode discussion and Soft Driver 回答过了! |
|
|
5楼#
发布于:2003-08-01 16:42
re
1、是在完成例程中处理返回的数据。 2、可以循环,但要修改一下,比如增加一个 DPC ,在完成例程中给 DPC 队列中增加一个对象,在 DPC 处理中发 IRP。 3、上层应用程序用ReadFile()来读取数据,可以同步处理,即处理完立即返回。 我觉得在 2 中你可以一直循环读取数据,放到块缓冲区中,当调用ReadFile()时,就直接从缓冲区中取数据,这样就可以同步处理了,一些实时处理都是类似这样的。 希望对你有帮助! |
|
|