Hinweis: Das Forum wird geschlossen! Neue Registrierungen sind nicht mehr möglich!

 Zurück zu Pro-Linux   Foren-Übersicht   FAQ     Suchen    Mitgliederliste
RS232 Kommunikation läuft nicht synchron

 
Neuen Beitrag schreiben   Auf Beitrag antworten    Pro-Linux Foren-Übersicht -> Programmieren - Allgemein
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Buschi
Gast





BeitragVerfasst am: 17. Okt 2006 22:05   Titel: RS232 Kommunikation läuft nicht synchron

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.
 

Janka



Anmeldungsdatum: 11.02.2006
Beiträge: 3569

BeitragVerfasst am: 18. Okt 2006 9:18   Titel:

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.
 
Benutzer-Profile anzeigen Private Nachricht senden

Beiträge vom vorherigen Thema anzeigen:   
     Pro-Linux Foren-Übersicht -> Programmieren - Allgemein Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehen Sie zu:  

Powered by phpBB © phpBB Group
pro_linux Theme © 2004 by Mandaxy