如何提高USB cdc设备的速度?

时间:2017-05-21 17:46:43

标签: c embedded bare-metal

我正在升级嵌入式系统中的处理器以进行工作。这都是C语言,没有操作系统。部分升级包括将处理器-PC通信接口从IEEE-488迁移到USB。我终于写了USB固件,并一直在测试它。直到我试图推送大量数据才发现我的USB连接比旧的IEEE-488连接慢。我将USB设备枚举为CDC设备,波特率为115200 bps,但很明显我甚至没有达到那个吞吐量,我认为这个数字是一个虚拟值,是RS232天的保留,但是我可能是错的。我控制从PC前端到嵌入式系统固件的各个方面。

我假设我的问题是如何写入嵌入式系统端的USB。现在我的USB_Write函数在空闲时间运行,并且只是一个while循环,它将一个char写入USB端口,直到写缓冲区为空。有没有更有效的方法来做到这一点?

我的一个担忧是,在旧系统中,我们在系统中有一个专用于通信的板。 CPU只需将数据通过总线写入该板,它就可以处理通信,这意味着CPU不必浪费空闲时间处理实际通信,但可以将通信卸载到一个总线上。 co处理器" (不是CPU,但在功能上相同)。即使考虑到这一点,我认为我的速度会更快,因为全速USB大约为MB / s,而IEEE-488大约为kB / s。

简而言之,这更可能是基本的系统约束还是软件优化问题?

1 个答案:

答案 0 :(得分:0)

  

我认为这个数字是一个虚拟值,是RS232天的延迟,但我可能错了。

你是对的,波特率是一个虚拟值。如果您创建一个CDC / RS232适配器,您可以使用它来配置您的RS232硬件,在这种情况下它没有任何意义。

  

有更有效的方法吗?

绝对!您应该编写与USB端点大小相同的数据块,以获得最大的传输速度。根据您使用的设备,您可以在发送之前将单字节写入流收集到一个数据包中,但根据我的经验(以及您的结果),这是不太可能的。

根据您的延迟要求,您可以粘贴在循环缓冲区中,只有当您有ENDPOINT_SZ个字节时,才会将数据从它发送到USB_Write函数。如果这会导致延迟过长或者您的界面并不总是在通信,那么您可能需要实现Nagles算法。

  

我的一个担忧是,在旧系统中,我们在系统中有一个专门用于通信的电路板。

您在评论中提到的恩智浦部分毫无疑问足以让USB全速连接饱和。

  

简而言之,这更可能是基本的系统约束还是软件优化问题?

我认为这是一个软件设计问题,而不是优化问题,但不是,你不可能从根本上陷入困境。

请注意确切地知道您正在使用哪种USB连接,如果您使用的是USB 1.1,则限制为64KB / s,USB 2.0全速将限制为512KB / s。如果您需要更高的吞吐量,则应迁移到使用单独的批量端点进行数据传输。

我建议您通过USB简单的网站阅读,以便全面了解各种USB速度及其功能。

最后一个问题,供应商CDC库并不总是最好的,CDC标准的实现可能会有所不同。理论上,您可以通过使用更大的端点通过CDC端点获取更多数据,我已经看到这会让主机端驱动程序瘫痪 - 如果您按照此路线创建使用批量端点的自定义驱动程序。

尝试在多个系统上测试您的设备,您可能会发现Windows和Linux之间的结果会有很大差异。这将有助于将手指指向主机端。

最后,确保您在主机端进行大缓冲读取,一旦主机端缓冲区已满,USB将停止传输数据。