WinUsb:写入OUT管道导致IN管道

时间:2017-09-22 18:51:52

标签: c# thread-safety winusb

这是我的第一个使用WinUsb驱动程序和库的项目。

我的主机运行WINDOWS 10,安装了所有更新 我的高速设备运行三个数据端点:

  • OUT命令端点:主机使用它发送命令
  • IN Reply端点:主机收到对每个命令的回复
  • IN Stream端点:设备发送流数据,1600字节,周期为10毫秒。

在主机应用程序中,有两个相关的主题:

  • 命令线程将命令发送到命令管道并接收来自回复管道的回复
  • Stream线程从Stream管道收集数据

非等待功能用于所有管道。

如果另一个线程被暂停,则每个线程都可以完美运行 但是,如果两个线程同时工作,则流数据在任意点上都会出现损坏。

更多分析揭示了以下事实:

  • 腐败显示为错误字节的连续序列。该 错误序列的长度大致对应于长度 命令和回复。
  • 错误的序列从与数据包边界无关的任意点开始。
  • 错误的字节可能不同;有时,它们都是零, 有时他们看起来像垃圾。
  • 时间分析表明,一旦命令出现腐败 发送到命令管道。

如果我在线程之间实现同步,效果消失,以便读/写操作在时间上分开。但是,这是不可接受的解决方案,我希望两个线程异步工作 有人有这样的影响吗?

1 个答案:

答案 0 :(得分:0)

回答我自己的问题......

汉斯'评论是正确的,问题根植于固件。

设备固件开发人员可能会对其他细节感兴趣,特别是如果他们像我一样使用Atmel Cortex M7系列。

在本系列中,USB控制器包括用于端点缓冲的双端口RAM。 DPRAM仅由硬件分配和管理。固件通过在端点控制寄存器中设置ALLOC位来初始化分配。用户手册要求固件应按升序设置ALLOC位。在项目历史记录中,我更改了端点描述符中的端点地址,但没有意识到此更改违反了DPRAM分配的升序。结果,端点缓冲区出现重叠,导致问题中描述的数据干扰。

修复bug后,一切正常。