RS232 Kommunikation läuft nicht synchron

Post Reply
Message
Author
Buschi

RS232 Kommunikation läuft nicht synchron

#1 Post by Buschi »

Hi!

Ich programmiere an einer RS232 Schnittstelle für Linux, über die Daten an einen Roboter gesendet und von ihm empfangen werden sollen. Unter Windows läuft das ganze auch schon wunderbar und wenn man sich das ganze auf dem Oszi anschaut, sieht man da auch, dass zu erst vom uC die Daten gesendet werden (dies geschieht per interrupt alle 20 ms, während der PC per busy-wait darauf wartet) Sobald der PC seine Daten empfangen hat, sendet er dem uC umgehend ein Datenpaket, und kann dann was tun, bis das nächste Datenpaket vom uC kommt. Unter Linux kommt es nun zu dem problem, dass der PC zwar die Daten empfängt, dann jedoch eine von Durchlauf zu Durchlauf größer werdende Zeitspanne vergeht, bis er wiederum Daten zurücksendet. Dadurch läuft das Senden der Daten vom PC in den nächsten 20ms Zyklus rein und die Kommunikation bricht ein. Hat jemand eine Idee, warum das Senden der Daten vom PC unter Linus so lange auf sich warten lässt und wie man das unterbinden kann?

Hoffe, dass jemand was mit der Fehlerbeschreibung anfangen kann... sonst einfach fragen und ich versuchs genauer zu erklären.

User avatar
Janka
Posts: 3585
Joined: 11. Feb 2006 19:10

#2 Post by Janka »

Du hast vermutlich eine Busy-Loop programmiert? Wenn ja, wertet Linux den "bösen" Prozess, der ja immer seine Zeitscheibe aufbraucht, in der Priorität herunter, damit auch andere Prozesse mal drankommen.

Um so zeitkritische Dinge zu machen, brauchst du vermutlich schon Echtzeitpriorität (man sched_setscheduler), und solltest evtl. den Timertakt von 250Hz auf 1000Hz hochsetzen (Kernelkonfiguration->Processor Type and Features->Timer Configuration).

Auf jeden Fall dran denken, ab und zu nanosleep() oder sched_yield() aus einem Echtzeitprozess heraus aufzurufen, sonst kommen die normalen Prozesse nicht mehr zum Zuge und die Maschine lässt sich nicht mehr bedienen. Eine auf Echtzeitpriorität gesetzte Shell in einer Textkonsole hilft beim Debuggen.

Vielleicht kannst du aber auch einfach auf die Busy-Loop verzichten? Das wäre die beste Lösung.

Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.

Post Reply