Sheduler u. Queues?

Gast #33644
Lesenswert?
• ▲
▼
Gibt es Sheduler u. Queues für Microcontroller?

Mich stört nämlich, dass Wartezeiten meist mit busy waiting verschwendet 
werden und einzelne Datenpakte ohne Queue chaotisch  versendet werden 
und dadurch mehrere Pakete als ein einziges (u. damit fehlerhaftes) 
versendet werden.
Gast #33646
Lesenswert?
• ▲
▼
Das sind verschiedene.
Also ein Problem ist die Kommunikation über eine serielle Schnittstelle. 
Es werden Datenpakete in einem festliegenden Format verwendet. Ohne 
Wartezeiten werden die Datenpakete ohne Pause, also mehrere als ein 
großes versandt. Mit einer Queue gäbe es das Problem nicht.
Gast #33647
Lesenswert?
• ▲
▼
Du stellst Dir also einen Puffer vor, welcher auf der einen Seite Daten 
über diese serielle Schnittstelle gefüttert bekommt und auf der anderen 
Seite diese nach Anforderung über ein Handshake-Verfahren ausgibt?
Wie groß muß den der Puffer sein? Welche Datenraten kommen vor?
Gast #33648
Lesenswert?
• ▲
▼
Hallo,

wenn ich Dich richtig verstehe sollte Dir einfach ein Ringbuffer mit zB. 
256Bytes reichen, indem Du die Daten die Du verschicken willst ablegst 
und nach erfolgreicher Übertragung des jeweiligen Bytes wird vom UART 
ein Interrupt ausgelöst und Deine IRoutine schickt dann das nächste Byte 
raus. Sowas ist halt eine Queue per Software. Ich kenn sonst keine 
andere Lösung.
Gast #33650
Lesenswert?
• ▲
▼
??? Wartezeit ??? Meinst Du die Wartezeit für den IRQ, damit die 
Gegenstelle die Abstände mitbekommt? Hat die denn keinen UART? Außerdem 
mußt Du doch sowieso auf das Startbit warten, und ob Du nun 1, 1,5, oder 
2 oder mehr Stopbits auf das nächste Startbit wartest ist doch egal.

Mit dem Interrupt kann Deine normale Anwendung im Hintergrund laufen. 
Wenn die gerade langeweile hat Läuft sie halt in einer Endlosschleife. 
Aber auch hier kommt dann der IRQ und erlösst die CPU aus der 
Endlosschleife und schickt das nächste Byte raus.
Gast #33651
Lesenswert?
• ▲
▼
Also die Wartezeit ist auch nötig, weil die Gegenstelle das abgeschickte 
Datenpaket verarbeitet haben muss um ein neues entgegennehmen zu können.
Damit es ein timeout gibt, müssen die Daten deshalb in einem Zeitraster 
geschickt werden; z. B. 100 ms.
Zur Zeit verwende ich eine nach jedem Timer-IRQ aufgerufene Funktion, 
die alle 250 ms aufgerufen wird. Das Zeitraster muss ich mit goto 
end_250ms_function nach jedem send_data sicherstellen. Das funktioniert 
zwar und verbraucht wenig Flash u. RAM, macht aber das Programmieren 
aufwendiger, weil die Reihenfolge in der Funktion genau stimmen muss.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren