Forum: Compiler & IDEs selbstgebauter Watchdog?


von Oz z. (ozzy)


Lesenswert?

Moin, ich möchte quasi einen Watchdog selber bauen, weoiß aber nicht 
genau, ob das wirklich so geht...
Ausgangspunkt is folgender: In der Main-Methode wird auf ein Zeichen 
über UART gewartet, und dann mittels switch/case-Anweisung behandelt. In 
einer case-Anweisung wird wieder auf ein Zeichen gewartet, was der 
Anzahl der weiter zu empfangenen bytes entspricht. Werden jetzt aber zu 
wenige Bytes gesendet, bleibt man natürlich in dieser Methode. Nach 
einiger Zeit soll dann ein Reset ausgelöst werden, und wieder an den 
Anfang der main gesprungen werden. Problem dabei ist: die ganze 
initiallisierung soll nicht noch einmal durchgeführt werden, das spricht 
gegen einen Hardreset.
Gibt es da irgendeine Möglichkeit???

von Oliver (Gast)


Lesenswert?

Was auch immer du da genau vorhast, klingt nach der falschen Lösung für 
ein Problem. Aber egal, auch C kennt sowas wie goto, oder 
setjump/lomgjump, und damit kannst du alles verstalten, was den Einsatz 
eines echten Hardwarewatchdogs erst richtig erforderlich macht :-)

Eine timeout-Lösung lässt sich z.B. über einen Timer erledigen, der nach 
Ablauf der zulässigen Wartezeit ein Flag setzt, welches dann zum Abbruch 
deiner Einleseroutine führt.

Oliver

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> Nach einiger Zeit soll dann ein Reset ausgelöst werden, und wieder an
> den Anfang der main gesprungen werden.
Was ist denn das für ein Programmierstil  :-o

Üblicher ist sowas (wenn auch noch nicht gut):
Du zählst an der Stelle, an der du auf das Zeichen wartest, einen 
Timeout-Zähler hoch. Wenn der einen bestimmten Wert erreicht, dann 
beendest du die Funktion mit einem Fehler.

> In der Main-Methode wird auf ein Zeichen über UART gewartet
Schon das ist sehr schlecht.
Normalerweise wird in der main-Funktion in einer Endlosschleife ständig 
geschaut, ob ein Zeichen gekommen ist. Wenn ja, dann wird dieses Zeichen 
behandelt. Wenn kein Zeichen gekommen ist, wird was anderes gemacht.


BTW
Zur Terminologie: in C gibt es Funktionen.
In C++ werden daraus Methoden.

von Bernd (Gast)


Lesenswert?

>> Gibt es da irgendeine Möglichkeit???

Timeout heißt die Lösung... wenn eben keine Zeichen kommen dann wieder 
raus aus der Sub.

Wie baut man einen Watchdog... sehr einfach, retriggerbares Monoflop. 
Diese wird in der main retriggert sonst RESET.

von (prx) A. K. (prx)


Lesenswert?

Christoph O. schrieb:

> Ausgangspunkt is folgender: In der Main-Methode wird auf ein Zeichen
> über UART gewartet, und dann mittels switch/case-Anweisung behandelt. In
> einer case-Anweisung wird wieder auf ein Zeichen gewartet, was der
> Anzahl der weiter zu empfangenen bytes entspricht. Werden jetzt aber zu
> wenige Bytes gesendet, bleibt man natürlich in dieser Methode.

Weshalb Controller-Programmierung recht oft auf Statemachines rausläuft. 
In der also nicht abhängig vom ersten Byte andere Unterprogramme 
aufgerufen werden, sondern das Zeug passend abgespeichert und eine oder 
mehrere Zustandsvariable verändert werden.

Hier hiesse das, dass man auch nach dem Kommandobyte in der Mainloop 
bleibt und Zustand/Zähler/Puffer bearbeitet, bis die Timestamp vom 
Kommandobyte zu alt ist oder das ganze Kommando korrekt empfangen wurde. 
Und erst dann die Methode zum Kommando aufruft. So ist der ganze 
Message-Mechanismus an einer Stelle untergebracht und man muss die 
Methoden nicht einzeln mit Timeout-Exits pflastern, oder sogar solche 
brechstangenmässigen Watchdogs einbauen.

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.