mikrocontroller.net

Forum: Compiler & IDEs selbstgebauter Watchdog?


Autor: Oz zy (ozzy)
Datum:

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

Autor: Oliver (Gast)
Datum:

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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

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

Autor: Bernd (Gast)
Datum:

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

Autor: A. K. (prx)
Datum:

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

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.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

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