Forum: PC-Programmierung schneller zugriff auf serielle schnittstelle


von mussa (Gast)


Lesenswert?

Hallo,
weiß hier jemand ob es unter LINUX eine schnellere möglichkeit gibt auf 
die serielle Schnittstelle zu schreiben als die write() Funktion? 
Hierbei braucht mein  Rechner ca. 20µsec vom Befehlsaufruf bis wirklich 
Daten geschrieben werden. Liegt natürlich auch immer an der 
Rechnerperformance, aber ich bräuchte das schneller, so ca.5µsec oder 
weniger.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Umgehe die Dateisystemarchitektur, komuniziere direkt mit dem 
Devicetreiber oder packe Deine Applikation in einen Devicetreiber. 
Verwende ein Echtzeit-OS, kein Linux.

Könnte es sein, daß Deine Timing-Vorstellungen ein bisschen 
realitätsfremd sind? 20µsec sind -bei 9600- gerade mal zwei Bitzeiten.

von mussa (Gast)


Lesenswert?

Danke für den Tipp!
Nein, meine vorstellungen sind realistisch da ich mit 2MBaud arbeite und 
ein komplettes Byte entsprechend ca.5µs (incl.Start Stop) braucht.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Hmm. Dann verwendest Du aber nicht die serielle Schnittstelle im PC, 
denn die kann maximal 115200 Baud.

Was für eine Schnittstellenhardware verwendest Du denn? Könnte es sein, 
daß die einen Sende-FIFO aufweist?

Was für eine Anwendung ist das, die einerseits eine sehr hohe Datenrate 
und andererseits extrem kurze Reaktionszeiten benötigt?

von Wolfram (Gast)


Lesenswert?

>Nein, meine vorstellungen sind realistisch da ich mit 2MBaud arbeite und
>ein komplettes Byte entsprechend ca.5µs (incl.Start Stop) braucht.
Wow, was für eine Milchmädchenrechnung
Welche Zeit meinst du, bis das erste Byte gesendet wird zwischen den 
Zeichen
Du beschwerst dich über 20us???
Linux kann auch Taskwechsel JEDERZEIT machen, das gibt dann Zeiten die 
noch größer sind wenn deine Anwendung erstmal kurz weg vom Fenster ist.
Solltest du mit einem USB-Seriellwandler arbeiten, dann ist der Begriff 
Milchmädchenrechnung noch sehr geschönt, siehe:
http://www.ftdichip.com/Documents/AppNotes/AN232B-04_DataLatencyFlow.pdf

Es würde mich schon interessieren welches Konzept auf einer normalen? 
seriellen Schnittstelle eine Genauigkeit von <5us benötigt.

von mussa (Gast)


Lesenswert?

Ich arbeite mit einem Embedded ARM System.
Was heißt hier Milchmädchenrechnung?!
Erstens kann ich rechnen und zweitens auch ein Scope bedienen....
Die Anwendung sieht so aus, daß ich einen IO Pin setze (dauert ca.5µsec) 
und dann die Funktion write() aufrufe. Vom setzen des Pins bis Daten 
kommen sind es halt dann 20µsec.Ich schreibe permanent Daten (etwa 5-7 
Bytes) an verschiedene Adressen und lese dann eine ähnliche anzahl 
zurück. Und dann gleich die nächste Adresse und so weiter...
So ein Datentranfer dauert normalerwise dann etwa 50 -70µsec. Da sind 
20µsec doch schon ne ganze menge!

von Wolfram (Gast)


Lesenswert?

Wer garantiert dir das zwischen dem setzen des IO-Pins(oder eigentlich 
dem was du vorher machst)und dem write von Linux kein Task 
zwischenzeitlich ausgeführt wird?
Wenn das write es erstmal dem Devicetreiber der Schnittstelle übergeben 
hat, dann kann gepuffert im Interruptbetrieb? mit FIFO? übertragen 
werden, das dürfte recht gut gehen und einen sehr geringe 
Interbyte-latenzzeit haben.
Was für Interbytezeiten werden erreicht? Laut deinen Angaben 50-70us für 
5 bis 7 Byte Interbytezeit=0. Also schreibe immer gepuffert. Solange der 
Puffer nicht abreißt gibt es keine 20us verzögerung.
Die Frage bleibt:
Welches Konzept erfordert das <5us losgesendet wird? Diese Anforderung 
an eine serielle Schnittstelle mit Linux als Betriebssystem halte ich 
für unrealistisch.

von *.* (Gast)


Lesenswert?

> daß ich einen IO Pin setze (dauert ca.5µsec)
und dann die Funktion write() aufrufe.

Denk dir ein besseres Protokoll aus...

von mussa (Gast)


Lesenswert?

Na, ich glaub ich muß wirklich den Kernel umschreiben. Die Treiber und 
Interruptroutinen der seriellen Schnittstelle sind ja schon mit den 
ganzen if´s und while´s sehr zeitaufwendig. Sind ja auch so geschrieben, 
daß sie möglichst vielseitig verwendbar sind. Ein weiteres Problem ist 
allerding, daß alle UART´s die selben Treiber und Interrupts benutzen...
Wie ist das eigentlich mit dem realtime LINUX Kernel. Hat der auf dem 
Gebiet irgendwelche Vorteile?

von Ulrich (Gast)


Lesenswert?

schonmal rtlinux angeschaut

von Ulrich (Gast)


Lesenswert?

meiner Meinung nach kein Problem. Selbst Windows XP kann man komplett 
gaaaanz hart echtzeitfähig machen.

von mussa (Gast)


Lesenswert?

Habe jetzt RTAI entdeckt. Das scheint ansich ganz brauchbar zu sein.
Wird quasie vor den eigentlichen Kernel gebaut. Allerdings hab ich noch 
keinen arm-patch für den aktuellen Linux Kernel gefunden nur für 386 
bzw. arm für version 2.4.irgendwas! weiß jemand ob es diesen patch als 
"freeware" überhaupt gibt?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.