Sheduler u. Queues?

Gast #33644
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
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
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
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
??? 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
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

Eine eigene Frage? Dieser Thread ist über 23 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.