阅读:2980回复:17
USB驱动程序怎么管理多个端点的传输?
某USB有多个In端点,应用程序对每个端点创建一个读数据的线程,用于等待端点的数据,这就要求USB对每个端点发In请求,告之如果此端点有数据就向主机发数据。但按驱动程序的设计模型,只能等当前的IRQ执行完后才处理下一个IRQ,这样即使用队列来处理,后面的请求只能在前面完成后才处理,这不就没同步的概念了吗?还可能因前面的IRQ没完成,后面的总不能处理,大家有好的建议和想法吗?关注中
|
|
沙发#
发布于:2004-06-15 10:04
小弟也为类似的问题头痛,特地来顶啊!
|
|
板凳#
发布于:2003-12-16 09:52
我要将理论附注实践了,如果成功了,我就在这帖上做个总结,非常感谢你:pengenwen。
|
|
地板#
发布于:2003-12-16 09:38
用户被禁言,该主题自动屏蔽! |
|
地下室#
发布于:2003-12-16 09:33
我没看过DDK中的例子USBBULK,但它没用STARTIO是对的,它只用于系统管理的IRP队列,而我说的KDriverManagedQueueEx类中的StartIO函数是处理驱动程序管理的IRP队列。
|
|
5楼#
发布于:2003-12-16 09:28
用户被禁言,该主题自动屏蔽! |
|
6楼#
发布于:2003-12-16 09:23
我想KDriverManagedQueueEx类中的StartIO函数就是为此目的才定义的,不同的端点可以不需要用队列来串行处理,但同一端点还是要用队列来串行处理的,如果只用列程StartIO函数,不能完美的解决上述两个问题,不是吗?
[编辑 - 12/16/03 by red_orange] |
|
7楼#
发布于:2003-12-16 09:15
用户被禁言,该主题自动屏蔽! |
|
8楼#
发布于:2003-12-16 09:11
对pengenwen:
我不知道你是否熟悉drivestudio,在drivestudio中有个KDriverManagedQueueEx类来串行化由驱动程序管理的IRP队列,它有一个叫StartIo()的虚函数,在驱动程序中继承此类,如果有多个端口就生成多个对应的此类对象,每个端口的IRP请求都放入对应的自己的队列中,如果某一队列处理完自己提交的当前请求,就提交队列中的下一个,已达到本队列的串行处理。不需要通过驱动类中的StartIO()函数来处理,是这样的吗? [编辑 - 12/16/03 by red_orange] |
|
9楼#
发布于:2003-12-16 08:56
用户被禁言,该主题自动屏蔽! |
|
10楼#
发布于:2003-12-16 08:52
有道理,IRP已经将请求的所有信息都保存在里面了,如参数,取消列程,完全可以不保持任何关于当前处理的任何信息。
|
|
11楼#
发布于:2003-12-16 08:46
用户被禁言,该主题自动屏蔽! |
|
12楼#
发布于:2003-12-16 08:40
pengenwen说的有些道理,但在驱动程序中常常用到(drivestudio中)CurrentIrp()来返回当前的正在处理的Irp,如果同时处理,那此函数返回的是什么意义能?
|
|
13楼#
发布于:2003-12-16 08:37
用户被禁言,该主题自动屏蔽! |
|
14楼#
发布于:2003-12-16 08:30
pengenwen说的能具体些吗?
这种模式主要是基于各端点传输的内容是不相干为基础的,谁有数据谁就先发送。USB规范中既然可以定义多个端点,那就应该支持这中模式的哪? |
|
15楼#
发布于:2003-12-16 08:28
用户被禁言,该主题自动屏蔽! |
|
16楼#
发布于:2003-12-15 18:29
这个问题比较麻烦,我也有很多地方弄不明白,
我觉得在一个irp没处理完成之前,下一个irp只能等待的,对于异步方式也是排队的, 所以我认为设置一个超时控制比较好,如果一个端点在一段时间后还没有数据,那就cancle掉该irp,并把这个irp从队列里去掉,这样轮换着查询端点。 不过这样处理比较麻烦,不知道是否有更好的方法。 |
|
17楼#
发布于:2003-12-15 17:38
用户被禁言,该主题自动屏蔽! |
|