【发布时间】:2017-09-22 18:51:51
【问题描述】:
这是我第一个使用 WinUsb 驱动程序和库的项目。
我的主机运行 WINDOWS 10,安装了所有更新。
我的高速设备运行三个数据端点:
- OUT 命令端点:主机使用它发送命令
- IN 回复端点:主机接收对每个命令的回复
- IN Stream 端点:设备发送流数据,1600 字节,周期为 10 毫秒。
在 Host 应用程序中,有两个相关线程:
- 命令线程向命令管道发送命令并从回复管道接收回复
- Stream 线程从 Stream pipe 收集数据
非等待函数用于所有管道。
如果另一个线程被挂起,每个线程都能完美运行。
但是,如果两个线程同时工作,则流数据会在任意点出现损坏。
更多分析揭示了以下事实:
- 损坏显示为错误字节的连续序列。这 错误序列的长度大致对应于 命令和回复。
- 错误的序列从与数据包边界无关的任意点开始。
- 错误的字节可能不同;有时,它们都是零, 有时它们看起来像垃圾。
- 时间分析表明,一旦命令执行,就会发生损坏 发送到命令管道。
如果我实现线程之间的同步,效果消失,这样读/写操作在时间上是分开的。但是,这是不可接受的解决方案,我希望两个线程异步工作。
有人遇到过这样的后果吗?
【问题讨论】:
-
没有太多理由怀疑这个库,尤其是考虑到它被锤击的频率和它的作用很小。更有可能的是,这在设备固件中出错了。做有效的事。
-
设备固件是我的第一个猜测,特别是因为它也是我项目的一部分。因此,我在传输前后实施了流缓冲区完整性检查。没有发现问题。
-
如果没有库或固件 - 那么,只剩下硬件了吗?
标签: c# thread-safety winusb