1

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

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

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

在 Host 应用程序中,有两个相关线程:

  • 命令线程向命令管道发送命令并从回复管道接收回复
  • Stream 线程从 Stream 管道收集数据

非等待函数用于所有管道。

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

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

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

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

4

1 回答 1

0

回答我自己的问题...

汉斯的评论是正确的,问题出在固件上。

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

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

修复错误后,一切正常。

于 2017-09-24T18:03:57.420 回答