Forum: PC-Programmierung C++ eventbasiert updaten


von Emil (Gast)


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.

von Sven P. (Gast)


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.

von Gerd E. (robberknight)


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.

von Sven P. (Gast)


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.

von Gerd E. (robberknight)


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.

von PittyJ (Gast)


Lesenswert?

Ich verwende FreeRTOS dafür und habe gute Erfahrungen damit gemacht.

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
Noch kein Account? Hier anmelden.