gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 15:54:58 24 4
gpt4 key购买 nike

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

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

我担心的一个问题是,在旧系统中,我们的系统中有一个专门用于通信的板。 CPU 只会通过总线将数据写入该板,并且它将处理通信,这意味着 CPU 不必浪费空闲时间来处理实际通信,而是可以将通信卸载到“协处理器”(不是CPU,但功能相同)。即使有这样的担忧,但我认为我应该获得更快的速度,因为全速 USB 的数量级为 MB/s,而 IEEE-488 的数量级为 kB/s。

简而言之,这更有可能是基本系统限制还是软件优化问题?

最佳答案

I thought that number was a dummy value that is a holdover from RS232 days, but I might be wrong.

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

Is there a more efficient way to do this?

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

根据您的延迟要求,您可以坚持使用循环缓冲区,并且仅当您有 ENDPOINT_SZ 字节数时才将数据从该缓冲区发送到 USB_Write 函数。如果这导致过多的延迟或您的接口(interface)并不总是进行通信,您可能需要实现 Nagles 算法。

One of my concerns that I have, is that in the old system we had a board in the system dedicated to communications.

您在评论中提到的 NXP 部件无疑足够快,足以使 USB 全速连接饱和。

In short is this more likely a fundamental system constraint or a software optimization issue?

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

请务必弄清楚您所使用的 USB 连接类型,如果您使用 USB 1.1,您将被限制为 64KB/s,而 USB 2.0 全速则将被限制为 512KB/s。如果您需要更高的吞吐量,您应该迁移到使用单独的批量端点进行数据传输。

我建议您阅读 USB made simple 网站,以更好地了解各种 USB 速度及其功能。

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

尝试在多个系统上测试您的设备,您可能会发现 Windows 和 Linux 之间得到的结果截然不同。这将有助于将矛头指向主机端。

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

关于c - 如何提高 USB cdc 设备的速度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44099976/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com