Hallo! Ich suche nach einer geeigneten Möglichkeit den normalen Programmablauf durch Interrupts zu ändern. Der Sinn hinter der ganzen Sache soll darin bestehen, ein umfangreicheres System mit Menü und kleinen Unterprogrammen zu erstellen. Zu diesem Zweck soll es so eine Art Countdown geben. Nach einer gewissen Zeit ohne weitere Aktivitäten des Benutzers soll immer automatisch zum huptmenü zurückgesprungen werden. Diese Inaktivität könnte durch Timer-Interrupts registriert werden. Im Interrupt selbst die Funktion für das Hauptmenü aufzurufen, ist vermutlich nicht so sinnvoll. Der Interrupt würde quasi eine neue Funktion aufrufen und nie terminieren, ich fürchte da wären Fehler dann vorprogrammiert? ;-) Einzige Lösung wäre also in jedem Programmteil, in dem der Controller verweilen könnte, immer eine Überprüfung auf eine registrierte Inaktivität durchzuführen und dann vom aktuellen Programm aus den Rücksprung einzuleiten. Natürlich wäre aber eine Variante viel schöner, bei der man nicht immer eigenständig in jedem Abschnitt diese Überprüfung einbringen müsste (natürlich kann man das mit einem Makro noch etwas verkürzen). Gibt es sonst keine elegantere Lösung dies umzusetzen?
Hendrik Motza schrieb: > Im Interrupt selbst die Funktion für das Hauptmenü aufzurufen, ist > vermutlich nicht so sinnvoll. Der Interrupt würde quasi eine neue > Funktion aufrufen und nie terminieren, ich fürchte da wären Fehler dann > vorprogrammiert? ;-) Genau. Das macht man nicht so. > Einzige Lösung wäre also in jedem Programmteil, in dem der Controller > verweilen könnte, immer eine Überprüfung auf eine registrierte > Inaktivität durchzuführen und dann vom aktuellen Programm aus den > Rücksprung einzuleiten. Ist eine Möglichkeit, ja. "registrierte Inaktivität feststellen" ist einfach nur das Abfragen einer globalen Variablen. Und wenn die gesetzt ist, dann bricht die Menüsteuerung ab und gibt zurück. > Natürlich wäre aber eine Variante viel schöner, > bei der man nicht immer eigenständig in jedem Abschnitt diese > Überprüfung einbringen müsste (natürlich kann man das mit einem Makro > noch etwas verkürzen). Das wäre eigentlich nicht wirklich schöner. Denn je nach Aktivität willst du nicht wirklich haben, dass die von aussen abgewürgt wird, sondern du willst haben, dass die Funktionalität selbst entscheidet an welcher Stelle sie abbrechen darf und eventuell noch Aufräumarbeiten durchführen muss. Die elegante Methode besteht allerdings darin, dass kein Programmteil die Erlaubnis hat, in einer länger dauernden Schleife zu laufen, sondern immer nur kurz nachsieht ob es etwas zu tun gibt, wenn ja diese Aktion macht und danach sofort wieder zur Hauptschleife zurückkehrt. Die Hauptschleife ist die einzige Schleife die länger (nämlich unendlich lange) laufen darf. Auch eine Menüsteuerung hat sich daran zu halten. In diesem Zusammenhang kann man oft das Konzept einer State-Maschine sinnvoll einsetzen.
Erfahrungsgemäß funktionieren nur 2 Möglichkeiten. Die von dir beschriebenen Abfragen oder ein kompletter Reset, wie beim Watchdog Timer. Das Problem ist: ab und zu musst du beim Rücksprung noch ein paar Sachen aufräumen. Gelegentlich bleiben da mal ein paar inkonsistente Zustände zurück. Bei so etwas dauert die Fehlersuche ewig. Da hättest du in der Zwischenzeit schon 10 mal die Überprüfungen eingebaut.
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.