Ich mache Messungen im Zusammenhang mit der USB-Verzögerung mit dem USB-UART-Konverterchip (CP2102 Silicon Laboratory Chip). Ich sende ein Array von Daten, wenn 0xee
es empfangen wird, gibt der Mikrocontroller das Byte zurück. Ich nehme Zeitstempel zwischen dem Moment, an dem ich mit dem Senden der Daten beginne, bis ich die 0xee
. Um die Verarbeitungszeit am CP2102-Chip herauszufinden, habe ich die Chip-Ack-Verzögerung gemessen (es ist die Zeit zwischen dem Punktpaket und dem vom Chip empfangenen sofortigen Ack-Paket). Der USB-UART-Chip ist ein Massengerät mit zwei Endpunkten (IN und OUT) mit einer maximalen Paketgröße von 64 Bytes, es wird USB 2.0 mit voller Geschwindigkeit (12 Mbit / s) verwendet. Ich nehme 500 Proben für jede Datengröße (1 Byte wird 500 Mal gesendet und Messungen werden durchgeführt, ebenso 2 Bytes bis 127 Bytes).
Ich habe drei Diagramme gezeichnet, eines für total_delay
, chip_ack_delay
und total_delay_without_uart_delay_chip_ack_delay = total_delay - chip_ack_delay - 86.6*data_size
Diese Verzögerung sollte die Verarbeitungsverzögerung und die USB-Abfrageverzögerung am Hostcomputer darstellen. Ich verwende einen Linux-PC mit Ubuntu 16.04, die UART-Baudrate beträgt 115200 (daher 86,6 Mikrosekunden pro Byte). Es ist verständlich, dass die Chip-Ack-Verzögerung zunimmt, wenn die Paketgröße mehr als 64 Byte beträgt, da er auf zwei Transaktionen warten muss. Ich bin nicht in der Lage, den zweiten Plot zu interpretieren. Er zeigt, dass die hostseitige Abfrage und die Verarbeitungsverzögerung abnimmt, wenn die Paketgröße mehr als 64 Bytes beträgt. Kann jemand erklären, wie dies zu interpretieren ist? Oder übersehe ich hier etwas?
Übrigens habe ich die Chip-Ack-Verzögerung mit dem USBmon-Protokoll gemessen. In der Grafik ist die x-Achse die Datengröße, die y-Achse der MATLAB-Boxplot, der den Wertebereich der Verzögerung zeigt, der für eine bestimmte Datengröße gemessen wurde.
Das Datenblatt des CP210x erwähnt große FIFOs sowohl auf der Sende- als auch auf der Empfangsseite.
Ich vermute stark, dass sie auch die Auslastung von USB (und Host-CPU) optimieren, indem sie UART-Daten in größeren USB-Paketen "sammeln".
Dies würde bedeuten, dass Daten zurückgehalten werden, bis entweder 64 Bytes im FIFO sind oder der Empfänger für einige Bitzeiten nicht aktiv war.
Beachten Sie, dass 64-Byte-Massenpakete etwas Besonderes sind: Sie beenden eine Transaktion im Host nicht (es sei denn, ein Puffer war zu klein).
Sie können tatsächlich einen "hohen Einbruch" für die 64-Byte-Transaktionen sehen, da diese als ein 64-Byte-Paket gefolgt von einem Null-Byte-Paket ausgeführt werden könnten.
Randbemerkung: Es kann sich lohnen, die Timings mit einem USB 2.0-Hochgeschwindigkeits-Hub zwischen dem PC-Host und dem CP210x erneut zu überprüfen. Diese Konfiguration könnte die verwenden0,25 ms0,125 ms Microframe-Timing in hoher Geschwindigkeit verfügbar.
Ale..chenski
Ale..chenski
jadhu
0xee
ob es übereinstimmt, und gebe das Byte wieder. In Bezug auf den Zeitpunkt nehme ich einen Zeitstempel, bevor ich Daten an die serielle Schnittstelle schreibe, wieder nehme ich einen Zeitstempel, nachdem ich ein Echo empfangen habe. Ich subtrahiere den alten Zeitstempel vom neuen. In Bezug auf die USB-Stack-Verzögerung verstehe ich, dass Stack und Treiber eine gewisse Verzögerung hinzufügen, aber das sollte konstant sein.jadhu
Ale..chenski
jadhu