【问题标题】:What is the lowest latency communication method between a computer and a microcontroller?计算机和微控制器之间的最低延迟通信方法是什么?
【发布时间】:2020-03-19 17:24:04
【问题描述】:

我有一个项目,我需要在计算机(Windows + Linux + MacOSX)和微控制器(arduino 或 stm32 或其他任何东西)之间进行通信的尽可能低的延迟(最好在 1-100 微秒范围内) )。

我强调它不仅要快,而且要低延迟(例如,与月球的快速通信将具有低延迟)。

目前我尝试的方法是通过 USB 串行或通过 USB 进行 HID 数据包。我得到的结果大约不到一毫秒。我的测量方法是往返通信,然后除以二。这没关系,但我会更高兴有更快的东西。

编辑: 这个问题似乎很难回答。我发现最好的解决方法是同步计算机和微控制器的时钟。同步确实需要通信。通过下面的过程,dt 是半个往返,sync 是时钟之间的差。

t = time()
write(ACK);
read(remotet)
dt = (time() - t) / 2
sync = time() - remotet - dt

请注意,此同步的不精确性最多为dt。最快的通信渠道很重要,但我对精度有一个估计。

还要注意与不同系统上时间戳差异相关的技术细节(基于 Linux 上的 epoch 的 us/ms,自 Arduino 上启动 MCU 以来的 ms/us)。

注意 Arduino 上的时钟偏移。经常同步会更安全(在我的例子中是每项措施)。

标签: arduino microcontroller stm32


【解决方案1】:

USB Raw HID 具有 8KHz 轮询速率(125us 轮询间隔)与 Teensy 3.2(或更高版本)相结合。 Mouse overclockers 实现了 8KHz 的轮询率和低 USB 抖动,而 Teensy 3.2(Arduino 克隆)能够在 PC 端使用slightly modified USB FTDI driver 实现 8KHz 的轮询率。

除此之外,您还需要更好的方法,您现在正在研究 PCI-Express 并行端口,通过数字引脚直接向并行端口上的引脚发送低延迟信号。它们必须是真正的并行端口,而不是通过 USB 层。千兆赫级 PC 上的 DOS 应用程序经过测试,可通过并行端口引脚信号获得低于 1us 的能力(1.4Ghz Pentium IV),但如果您编写虚拟设备驱动程序,您可能在 Windows 中获得低于 100us 的能力。

使用 wazoo 中提高的优先级和关键部分,最好是非垃圾收集语言,最少的后台应用程序,并且在关键循环上基本上消耗 100% 的 CPU 内核,并且您绝对可以可靠地实现

【讨论】:

    【解决方案2】:

    要回答这个问题,有两种低延迟方法:

    1. 串行或并行端口。尽管您的性能可能因制造商而异,但可以将延迟降低到毫秒级。 Brainboxes 是一个不错的品牌,尽管他们的卡可能花费超过 100 美元!

    2. 编写您自己的驱动程序。应该可以实现几百微秒的延迟,尽管如果内核需要提供更高优先级的服务,显然可以中途中断您的进程。这就是许多科学设备实际工作的方式。 (而且很多人告诉你不能让 PC 在很短的期限内工作是错误的)。

    【讨论】:

    • 写我自己的驱动是为了什么? USB?我们在项目中使用 USB 上的原始 HID,因为它几乎可以在任何平台上使用而无需硬件修改。我们在毫秒左右得到一些东西。我们希望我们有更小的东西,但这很好。你说的科学设备是什么意思?我们确实有“科学设备”(我们是实验室)。尤其是力反馈装置。通常他们使用并行端口(消失)火线(罕见)或以太网。
    • 物理接口不相关。其中任何一个都可以快速触发。但是您很可能需要编写自己的驱动程序。或者,我相信 Jungo Connectivity 提供商业产品。
    • 通过科学设备,我的意思是我知道一些硬件设备在一些帖子(这里和其他地方)声称是不可能的时间窗口内运行。
    【解决方案3】:

    关于信息,我刚刚在装有两个专用 PCIe 并行端口卡的 Windows 10 PC 上运行了一些测试。

    使用 Python 代码(实际上使用 Psychopy Builder 和 Psychopy 编码器)发送 TTL(方波)脉冲,2 通道示波器显示 4us 到 8us 的两个脉冲之间的偏移非常一致。

    这是 Python 代码以 '高于正常' 优先级运行的时候。 当以正常优先级运行时,除了非常偶尔的 30us 间隙(大概是在任务切换发生时)之外,它几乎是相同的)

    【讨论】:

    • 这不会像 OP 想要的那样测量延迟,它会测量抖动。据我所知,两张 PCIe 卡可能会有一致的 100 毫秒延迟,您会得到相同的结果。这就是 OP 测量往返的原因
    • 你是对的,虽然我为我辩护说“供参考”,我认为这对这个话题很感兴趣。 Windows NT 内核处理实际端口的接口。 W10 中的 AFAIK,您无法直接访问并行端口之类的东西。
    【解决方案4】:

    简而言之,PC 无法处理这么短的截止日期。即使在英特尔酷睿系列处理器上使用裸机 RTOS,您最终也会遇到 2-3 µS 范围内的中断延迟(处理器响应中断的速度)。 (见http://www.intel.com/content/dam/www/public/us/en/documents/white-papers/industrial-solutions-real-time-performance-white-paper.pdf

    这忽略了任何类型的通信链路,如 USB 或以太网(或其他),需要对数据进行分组、握手、缓冲以避免数据丢失等。

    无论链接速度有多快,USB 堆栈都会有延迟,因为它有缓冲以避免数据丢失。与以太网相同。实际上,由于系统中正在发生的其他事情以及对协议稳健性的需求,任何成熟操作系统上的现代堆栈驱动程序都不具备低延迟的能力。

    如果您的截止日期在个位数微秒内(甚至在毫秒范围内),您确实需要在微控制器上进行实时处理,并让主机处理较慢的控制循环/可视化。

    【讨论】:

    • 这是一个有趣的观点。但是我可以承受几十微秒。问题更多是关于识别具有最低延迟的通信通道,并估计此延迟。在我的上下文中,我需要它来测量延迟超过数十毫秒的系统的延迟。对于此测量,我需要这种快速通信,并确保其延迟部分可以忽略。
    【解决方案5】:

    没有real time operating system,您无法保证userland的延迟。你受内核的支配,它是slice time 和抢占规则。这可能高于您的最大 100us。

    为了让工作站响应硬件事件,您必须使用中断和设备驱动程序。 您的选择仅限于提供IRQ 的接口:

    • 硬件串行/并行端口。
    • PCI
    • PCI 上的一些接口桥。

    或者。如果你想滥用 IO,那就是声卡。

    USB 不是其中之一,它的轮询速率为 1kHz。 也许 Thunderbolt 可以,但我不确定。

    【讨论】:

      【解决方案6】:

      以太网

      寻找具有直接连接到微控制器的千兆以太网端口的板,并使用交叉电缆将其直接连接到 PC。

      【讨论】:

      • 不要将速度或带宽与延迟混淆。 OP正在谈论微秒。在 微秒 内,您可以轻松切换一些 gpio,不太容易让以太网控制器发送数据包。
      • 以太网是一种选择,如果我可以在尽可能低的级别进行通信。我可以尝试使用 UDP。不过@linuxfan 是对的,这与带宽无关,而是延迟。
      • @Tom:可能的最低级别是扔掉操作系统,与网卡对话。是你想要的吗?否则,您应该尝试绕过 IP 层,使用带有 MAC 地址而不是 UDP 的原始套接字,从而避免 ARP 查找。
      • @Tom 考虑将通信一分为二。一个通道承载所需的数据,另一个(gpio,串行接口的 CTS 信号等)是低延迟信号,它只生成时间戳,甚至可以在它引用的数据之前。
      • @linuxfan:我相信这是具有最低延迟的通信形式,可以合理地预期可以在任何 PC 上运行。没有人有更好的工作想法。
      猜你喜欢
      • 1970-01-01
      • 2012-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-30
      • 2011-12-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多