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