C# WinUsb:写入输出管道会导致管道内的数据损坏

C# WinUsb:写入输出管道会导致管道内的数据损坏,c#,thread-safety,winusb,C#,Thread Safety,Winusb,这是我第一个使用WinUsb驱动程序和库的项目 我的主机运行WINDOWS 10,安装了所有更新。 我的高速设备运行三个数据端点: OUT命令端点:主机使用它发送命令 回复端点:主机接收对每个命令的回复 流内端点:设备发送流数据,1600字节,周期为10毫秒 在主机应用程序中,有两个相关线程: 命令线程向命令管道发送命令,并从回复管道接收回复 流线程从流管道收集数据 非等待功能用于所有管道 如果另一个线程挂起,则每个线程都能正常工作。 但是,如果两个线程同时工作,则流数据在任意点出现损坏

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

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

  • OUT命令端点:主机使用它发送命令
  • 回复端点:主机接收对每个命令的回复
  • 流内端点:设备发送流数据,1600字节,周期为10毫秒
在主机应用程序中,有两个相关线程:

  • 命令线程向命令管道发送命令,并从回复管道接收回复
  • 流线程从流管道收集数据
非等待功能用于所有管道

如果另一个线程挂起,则每个线程都能正常工作。
但是,如果两个线程同时工作,则流数据在任意点出现损坏

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

  • 损坏显示为错误字节的连续序列。这个 错误序列的长度大致对应于 命令和回复
  • 错误的序列从与数据包边界无关的任意点开始
  • 错误的字节可能不同;有时候,它们都是零, 有时它们看起来像垃圾
  • 时间分析表明,一旦命令被执行,就会发生损坏 发送到命令管道
如果我在线程之间实现同步,读/写操作在时间上被分离,那么效果将消失。但是,这是不可接受的解决方案,我希望两个线程异步工作。

有人面临过这样的影响吗?

回答我自己的问题

汉斯的评论是正确的,问题根源在于固件

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

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


修复错误后,一切正常。

回答我自己的问题

汉斯的评论是正确的,问题根源在于固件

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

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


修复错误后,一切正常。

没有太多理由怀疑该库,特别是考虑到它被敲打的频率有多高,而且几乎没有什么作用。更有可能的是,设备固件出现错误。设备固件是我的第一个猜测,特别是因为它也是我项目的一部分。因此,我在传输之前和之后执行了流缓冲区完整性检查。没有发现任何问题。如果没有库或固件-那么,只剩下硬件了?没有太多理由怀疑库,特别是考虑到它被敲打的频率和很少。更有可能的是,设备固件出现错误。设备固件是我的第一个猜测,特别是因为它也是我项目的一部分。因此,我在传输之前和之后执行了流缓冲区完整性检查。没有发现任何问题。如果没有库或固件-那么,只剩下硬件?