mikrocontroller.net

Forum: PC-Programmierung C++ eventbasiert updaten


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Emil (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gerd E. (robberknight)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gerd E. (robberknight)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: PittyJ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich verwende FreeRTOS dafür und habe gute Erfahrungen damit gemacht.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.