-
-
[求助]如何将数据输出串行化?
-
发表于: 2008-9-23 16:31 3393
-
我现在在写一个USB设备的驱动,现在的情况是这样的:我的USB设备通过中断传输的方式将数据发送到主机,用户层用WaitForSingleObject等待一个事件,我的驱动接收到数据后就将这些数据发给用户模式下的控制程序,驱动通过在内核层用KeSetEvent设置这个事件为信号态,这样控制程序就知道有数据传进来了,然后调用DeviceIoControl来从驱动读走数据随后立即进行运算,问题在于:用户层控制程序运算的速度非常慢,而且他要花多长时间来运算也是不能确定的,快的话几秒钟,慢的十几分钟都有可能,而且用户层控制程序是单线程的,必须等到一个数据运算完成后才能循环回去调用WaitForSingleObject等待驱动再次设置事件为信号态。这样就导致了一个问题:如果在很短的时间内驱动接收到了很多数据,那么必然会导致前面还没有被控制程序取走的数据被新传入的数据覆盖掉(驱动中用来缓冲数据的缓冲区大小是固定的只有1字节,不能改),所以为了保证数据不被覆盖,必须使驱动对缓冲区的访问串行化,也就是说必须等待控制程序把缓冲区内的数据取走后才能再往缓冲区内写入新数据,驱动中接收数据的例程是运行在Dispatch Level上的,不能直接运行KeWaitXXX等函数,于是我想到的办法是采用WorkItem+FastMutex,我在驱动加载的时候就调用用IoAllocateWorkItem创建一个WorkItem(在驱动卸载的时候才调用IoFreeWorkItem,不知道这样做有问题没有),并且创建一个FastMutex,然后在接收数据的例程中用IoQueueWorkItem,在相应的WorkItem例程中先ExAcquireFastMutex,然后SetEvent,通过某种方式确认数据已被取走后调用ExReleaseFastMutex,这样实现了输出数据的串行化,但现在却遇到一个问题,就是如果在Queue中等待的数据只有几个(比如7、8个)那么一切就都OK,但是如果多了,比如有16个,那么在第一个WorkItem返回后就会BSOD,说是INVALID_WORK_QUEUE_ITEM,请问我该怎么办?用户模式下的控制程序不能改代码,驱动中1字节的缓冲区也不能改。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
赞赏
他的文章
看原图
赞赏
雪币:
留言: