2015-06-10 332 views
0

如果我像WinUSB_ReadPipe()启动时那样调用WinUSB_AbortPipe(),我会陷入死锁状态。我运行了提供here的调试跟踪日志。以下是发生问题的日志中的最后5行。我认为ReadPipe必须错过信号,AbortPipe正在等待ReadPipe完成。WinUSB_AbortPipe挂起

[0]4E34.4B58::06/09/2015-15:42:12.528 - IOCTL_WINUSB_READ_PIPE 
[0]4E34.4B58::06/09/2015-15:42:12.528 - PIPE129: (00000019) The read has been added to the raw io queue 
[0]4E34.4B58::06/09/2015-15:42:12.528 - PIPE129: (00000019) The read is being handled 
[2]4E34.4ECC::06/09/2015-15:42:12.529 - IOCTL_WINUSB_ABORT_PIPE 
[2]4E34.4B58::06/09/2015-15:42:12.529 - PIPE129: (00000019) Reading 64 bytes from the device 

在我的设计中,我有IN端点异步读入缓冲区。我发现最好将读取操作的超时设置为无限,因为当我导致STALL发生时驱动程序会讨厌它(遇到其他问题)。所以我需要让断开序列导致线程醒来,意识到我们需要关闭。有什么方法可以安全地做到这一点?

回答

0

我的解决方法是调用WinUsb_ResetPipe()。这会导致WinUSB_ReadPipe()解除阻塞,并且WinUSB_AbortPipe()有时不会锁定。唯一证明我有这个工作的证据是通过几个小时的成功运行测试,所以我不能保证这是一个解决方案。