Forum: Mikrocontroller und Digitale Elektronik Programm-Ablauf nach Interrupt an vordefinierter Stelle fortführen


von Hendrik M. (do1hrm)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Egal Anders (Gast)


Lesenswert?

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