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.
erzähl mal ein bißchen mehr über Deine Anwendung, damit klar wird, was Dein Problem ist
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.
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?
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.
??? 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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.