Bestimmen Sie die Sende- und Empfangslatenz eines USB-zu-EIA-485-Konverters

Wie kann ich die Latenz ermitteln, die mit der Übertragung von Daten auf einem USB-zu-EIA-485-Konverter verbunden ist?

Der Konverter ist ein USOPTL4 von B&B Electronics, der den FTDI-Chip verwendet, und ich weiß, dass es eine Durchsatzlatenz gibt, wenn meine Windows-Anwendung WriteFile aufruft und Daten tatsächlich übertragen werden.

Die gleiche Frage gilt auf der Empfangsseite der Dinge. Ich weiß, dass es eine Latenz gibt, wenn der FTDI die seriellen Daten empfängt und sie dem Betriebssystem zum Lesen zur Verfügung stellt.

Hat jemand diese Latenzen erfolgreich gemessen?

Antworten (2)

"Wie könnte ich die Latenz ermitteln"?

Typische Latenzen ermittle ich mit einem Oszilloskop.

Ich untersuche den Quellcode und die Hardware, um eine konservative Schätzung der Worst-Case-Latenz zu erhalten.

typische Latenz

Wenn ich die typische Sende- und Empfangslatenz eines bestimmten Setups messen müsste, würde ich mit der einfachsten Messung beginnen: typische Round-Trip-Verzögerung. Vielleicht wäre so etwas relativ einfach einzurichten:

  • Die Software auf dem Arduino schaltet eine LED ein und sendet dann sofort eine Nachricht an den UART
  • Sie haben die UART-Pins mit dem entsprechenden Level-Shift-IC verbunden, der mit Ihrem USB-zu-EIA-485-Konverter verbunden ist.
  • Software auf dem PC wartet auf serielle Eingabe und sendet dann sofort eine kurze Antwortnachricht
  • Die Software auf dem Arduino wartet auf die serielle Eingabe und schaltet dann sofort eine andere LED ein.
  • Die Software auf dem Arduino wartet eine zufällige Zeit, schaltet alle LEDs aus, wartet eine weitere zufällige Zeit und beginnt dann mit dem Einschalten der ersten LED.

  • Sie schließen das O'scope an die 2 LEDs an und messen die typische Verzögerung zwischen dem Einschalten der ersten LED und dem Einschalten der zweiten LED.

  • Sie kompilieren mit unterschiedlichen Nachrichtengrößen neu; Erstellen Sie ein Diagramm der Nachrichtengröße im Vergleich zur typischen Verzögerung.

Worst-Case-Latenz

Ein Echtzeitsystem muss eine begrenzte Worst-Case-Latenz haben. Leider scheint das mit Windows nicht möglich zu sein – selbst wenn Sie den Quellcode für Windows bekommen könnten, könnte ein Gerätetreiber-Patch nächste Woche weitere 2 Millisekunden an Latenz im schlimmsten Fall hinzufügen.

Einige Echtzeit-Betriebssysteme unterstützen USB – insbesondere unterstützt EMC unter Linux unter RTAI USB – hidcomp , benutzerdefiniertes USB-Eingabegerät mit emc usw. USB hat scheinbar „isochrone Übertragungen“ und „Unterbrechungsübertragungen“. Sie könnten nützlich sein, um die Worst-Case-Latenz zu begrenzen. Leider scheint niemand USB für Echtzeitaufgaben zu vertrauen: Von EMC2 unterstützte Hardware , Echtzeit-USB-Steuerung? , USB-Probleme usw.

Daher verwendet EMC2 immer noch parallele Ports, um die Worst-Case-Latenz zu ermitteln. Andere Kommunikationsprotokolle mit niedriger Latenz verwenden eine Vielzahl von Hardware, einschließlich Ethernet-Hardware.

Es wäre wahrscheinlich kostengünstiger und genauer, die Daten durch Messung von der PC-Software über eine serielle Rückkopplung zur PC-Software zu erfassen - Sie benötigen nicht mehr Ausrüstung als ein Stück Draht, und Sie können alle Daten sammeln, um die Statistik zu messen Häufigkeit der Ausreißer. Wenn Sie einen separaten Ausgangskanal mit niedriger Latenz vom PC hätten, könnten Sie die Einwegverzögerung relativ dazu messen, aber ohne das Hacken von Low-Level-Video- oder IDE-Treibern ist so etwas in modernen PCs möglicherweise nicht verfügbar.
@ChrisStratton: Ausgezeichneter Vorschlag. Ich bin mir nicht sicher, wie viel Effekt die zusätzliche Routine "Zeitstempel abrufen" haben wird, aber ich vermute, dass sie im Vergleich zu Latenz und Jitter von USB unbedeutend ist.

Nun, was versuchst du zu tun?

Was Sie feststellen werden, ist, dass jede Ebene in diesem Stapel eine variable Menge an scheinbar zufälliger Latenz hinzufügt. Während sie normalerweise unter 1 ms liegen kann, ist sie wahrscheinlich gelegentlich viel viel größer als das.

Das Betriebssystem selbst wird eine zufällige Multitasking-Scheduler-Latenz haben. Das können 0-50 ms sein (oder mehr auf spezialisierten oder schlecht konfigurierten Systemen). Wenn Sie versuchen, etwas mit sehr engen Timing-Beschränkungen zu tun, müssen Sie dies wahrscheinlich in einem benutzerdefinierten Gerätetreiber im Kernel-Space tun, um das Timing vorzunehmen.

Danach ist USB kein sehr latenzfreundlicher Bus. Das Warten darauf, dass USB die Daten sendet, wird eine kleine zufällige Latenz hinzufügen. Die Leseseite ist eigentlich etwas schlechter ... da der USB-Root angeschlossene Geräte abfragen muss, um zu sehen, ob sie Daten haben. Ich kann Ihnen nicht viel über die Reichweiten dieser Verzögerungen sagen ... vielleicht kann jemand anderes hier helfen. Es ist jedoch wahrscheinlich ziemlich variabel, je nachdem, ob Sie eine Verbindung über einen Hub herstellen und wie viele andere Geräte angeschlossen sind. Wenn Sie es also selbst messen, sollten Sie mindestens ein paar USB-Gerätekombinationen ausprobieren. Probieren Sie es mit angeschlossenen und aktiven Webcams und USB-Sticks aus, über einen Hub und direkt usw.

Ich würde den Standpunkt von @darron verstärken: Wenn Latenzen so wichtig sind, dass es sich lohnt, sie zu messen (z. B. 10 ms), wird USB mehr Ärger bereiten, als es wert ist. Wenn deterministisches Timing erforderlich ist, wird Ihre Architektur von Verbraucherschnittstellen wie USB weggedrängt.