C++ eventbasiert updaten

Gast #5823629
Lesenswert?

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.
Gast #5823860
Lesenswert?

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.
#5824560
Lesenswert?

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.
Gast #5824581
Lesenswert?

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.
#5824610
Lesenswert?

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.

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