Gast
#6178711
Hallo, ich arbeite derzeit an einem Projekt bei dem ich in von einem PC (Linux, low-latency-Kernel) mit bei einem Takt von 1.25 kHz 256 Byte pro Nachricht an einen Mikrocontroller (TI TMS320F28377D) per virtuelle serielle Schnittstelle (USB2-Adapter) schicke. Der Taktgeber ist hierbei eine Industrie-Kamera deren Jitterverhalten ich im Griff habe (avg=0.8 ms, std.dev=60µs). Wenn ich mit 10 Bit rechne komme ich im Schnitt auf eine Datenrate von 3.2 Mbit/s. Laut Doku erreicht der TI bei einer USB2 "High-Speed" Anbindung theoretisch bis zu 12 Mbit/s, d.h. es sollte prinzipiell mit der Hardware möglich sein. Auf der PC-Seite habe ich die serielle Schnittstelle per ttyAMC0 mit Parametern für eine Binärübertragung geöffnet und sende die Daten in einem C-Program mit hoher Prozesspriorität "sudo -E nice -19" jeden Takt in einer per "write(fd,buffer,len)" gefolgt von einem "tcdrain(fd)" alle 1250 Hz raus. Inhaltlich passt die Datenübertragung. Ich habe hierfür in meinen Datenpaketen eine Sequenznummer untergebracht, die der PC hochzählt und die ich auf der Mikrocontroller-Seite prüfe und mit einem Zähler dort abgleiche. Allerdings ist die Performanz schlechter als erwartet. Ich habe auf der PC-Seite ein Histogram über einige Minuten gebildet stelle fest, dass ich im Schnitt ca. 500µs für die Übertragung der 256 Bytes (10 Bit) mit worst-case-Spitzen bis zu 2000 µs erhalte. Beim Average komme ich daher nur auf rund 1 Mbit/s, d.h. mehr als Faktor 3 unter dem, was ich erreichen will. Um den Flaschenhals zu finden, habe ich beide Seiten untersucht. Die Mikrocontroller-Seite sieht gut aus, da ich für das Auslesen und Entpacken der 256 Bytes lediglich 60-70 µs benötige. Ich vermute daher, dass der Sender bzw. die Übertragung auf der PC-Seite den Engpass darstellt. Seht ihr eine Möglichkeit wie ich das Ganze PC-seitig beschleunigen kann? Meine erste Überlegung war, dass ich die Hardware nicht als serielle Schnittstelle fahre, sonder per libusb/bulktransfer anspreche. Seht ihr eine Alternative? Die Datenpakete kann ich leider nicht deutlich vergrößern, da ich low-latency sein will und sie möglichst schnell Zeitnah zum Takt von der PC-Seite versenden möchte. Allgemein frage ich mich, was für eine Übertragungstechnologie für meinen Anwendungsfall low-latency, 1.25 Khz/256 Bytes sinnvoll ist. Ich würde mich freuen, wenn ihr mir mit Anregungen helfen könnt. Vielen Dank und schönen Gruß