Hallo, Wei macht man folgendes richtig? Plattform ist ein stm32 M4 ohne Betriebssystem. B.z.w. man könnte die angedachte Architektur als kooperatives Betriebssystem bezeichnen. Was ich machen möchte ist das Objekte nach einer Zeit x, die die Objekte selber setzen, aufgerufen werden und dann eben etwas machen oder eben nicht. Die aufrufe sollen -nicht- aus einer Timer ISR erfolgen. Ich habe das gelöst, indem ich eine Art TimerController Objekt permanent aufrufe. Dieses TimerController Objekt hat auf eine 1ms Taktquelle Zugriff. Kann also 1ms genau messen. An diesem TimerController Objekt können sich andere Objekte mit gewünschter aufrufzeit anmelden. Das TimerController Objekt ruft dann entsprechend auf, wenn die Zeit heruntergelaufen ist. Habe hierzu quasi das Observer Pattern verwendet. Meine frage ist ob dieses herangehen ok ist oder ob man das anders machen sollte. Alternativ könnte ich die Objekte pollen ihnen die Zeit mitteilen. Sie entscheiden dann ob sie was machen oder nicht.
Emil schrieb: > Habe hierzu quasi das Observer Pattern verwendet. > > Meine frage ist ob dieses herangehen ok ist oder ob man das anders > machen sollte. Klingt vernünftig. Vorallem ersparst du dir jede Menge Ärger mit Eintrittsinvarianz und konkurrierenden Speicherzugriffen, da ja alle angemeldeten Funktionen aus demselben Programmpfad aufgerufen werden. Also Programmpfad i.S.v. Hauptprogramm <--> Interrupt. Ich löse zeitunkritische Sachen meistens mit deinem Alternativvorschlag. Die einzelnen Prozesse/Objekte haben nicht-blockierende Zustandsautomaten und es gibt eine "timeout"-Funktion, mit der man testen kann, ob eine bestimmte Zeit vorüber ist. Im Hauptprogramm (main) werden dann alle Zustandsautomaten hintereinander aufgerufen.
Emil schrieb: > Ich habe das gelöst, indem ich eine Art TimerController Objekt permanent > aufrufe. Nachteil: Du kannst während dieser Zeit die CPU nicht schlafen legen. Hat also deutliche Auswirkungen auf Stromverbrauch und Batterielebensdauer. > Meine frage ist ob dieses herangehen ok ist oder ob man das anders > machen sollte. Die Frage ist ob man das alles selber machen muss, wenn es das, und weitere praktische Konzepte, alles schon fertig als kleines RTOS gibt. Ich verwende für sowas sehr gerne ChibiOS: http://www.chibios.org/dokuwiki/doku.php Um sich da einen Überblick zu verschaffen und für den Einstieg empfehle ich: http://www.chibios.org/dokuwiki/doku.php?id=chibios:book:start Im ChibiOS könntest Du für Deine Aufgabe die virtuellen Timer verwenden.
Gerd E. schrieb: > Emil schrieb: >> Ich habe das gelöst, indem ich eine Art TimerController Objekt permanent >> aufrufe. > > Nachteil: Du kannst während dieser Zeit die CPU nicht schlafen legen. > Hat also deutliche Auswirkungen auf Stromverbrauch und > Batterielebensdauer. Muss er doch garnicht. Wenn er die CPU einigermaßen ausbucht, reicht es doch, die CPU im Millisekundentakt aufzuwecken. Das größte Einsparpotential ist damit schon ausgereizt. Ansonsten melden sich ja alle beim TimeController-Objekt an, d.h. es wäre für dieses auch ziemlich banal, die Zeit bis zum nächsten Aufwachen auszurechnen und entsprechend lange zu gehen.
Sven P. schrieb: > Ansonsten melden sich ja alle beim TimeController-Objekt an, d.h. es > wäre für dieses auch ziemlich banal, die Zeit bis zum nächsten Aufwachen > auszurechnen und entsprechend lange zu gehen. ja, genau das ist das Konzept hinter den "tickless"-Systemen. So implementiert es das ChibiOS auch standardmäßig. Nur die Frage ist halt ob man das alles selber schreiben muss oder ob man nicht ein fertig implementiertes und getestetes RTOS dafür hernimmt.
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.