Interrupt Task wechseln

Guten Morgen.

Ich habe da mal ne Frage zu Interrupts. Ich habe ein Programm, welches in einer Unterfunktion durchläuft.
Wenn ich nun einen Taster betätige, der ein Interrupt ausführt, möchte ich, dass das Programm die Unterfunktion verlässt und in das Hauptprogramm zurückkehrt.
Ich weiß, normalweise wird das Programm nach dem Interrupt an der gleichen Stelle ausgeführt, wo das Interrupt eingesetzt hat.
Habe aber gelesen, dass man den Task auch wechseln kann.

Gibt es dafür irgendwelche Bsp.?

Besten Dank

Habe aber gelesen, dass man den Task auch wechseln kann.

Der Prozessor selber und die Arduino Umgebung ebenso, unterstützen kein hartes Multitasking.

Eigentlich ist "Kooperatives Multitasking" das Mittel der Wahl.

In deinem Fall würde es reichen in der ISR ein Flag zu setzen.
Dein Unterprogramm muss regelmäßig prüfen, ob das Flag gesetzt ist.

Kooperativ: Google("arduino proto threads")
Preemptiv: Google("arduino rtos")

combie:
Dein Unterprogramm muss regelmäßig prüfen, ob das Flag gesetzt ist.

Vor allem in Schleifen!

ok, dann werde ich mal schauen, ob mich das weiter bringt!

Taster betätige, der ein Interrupt ausführt

Schonmal der falsche Ansatz ( in 99% aller Fälle :wink:

Grundsätzlich hat ein Arduino kein Betriebssystem und keine Tasks, sondern die loop() Funktion.
Die sollte so schnell sein, dass sie nur einen Moment dauert und dafür sofort wieder dran kommt.
Ein "Moment" ist von variabler Länge und kann physikalisch wenige µs bis zu mehreren ms dauern, je nach dem was für Reaktionszeiten erforderlich sind.

Die loop Funktion kann für schnelles Erfassen von Ereignissen kurzeitig durch eine Interrupt-Routine unterbrochen werden. Diese Interrupt Routine selbst kann nicht mehr unterbrochen werden und muss deshalb sehr kurz sein. Darf also ihrerseits keine Unterfunktionen aufrufen, von denen man nicht weiss, was sie machen. ( Serial.print ist z.B. verboten )

Handbetätigte Taster sind jedenfalls seeehr langsame Anforderungen, die üblicherweise im Millisekundenbereich prellen und dann viele Millisekunden lang den gleichen Zustand haben.

Natürlich wurde für Arduino schon viel erfunden, u.a. auch Task Scheduler und so. Das zu verwendenwird dich aber in die Irre führen.

Schreib lieber deine Unterfunktion so um, dass sie keine Schleifen enthält und nicht auf irgendwas wartet. Dann braucht sie auch nicht durch einen Taster unterbrochen werden.

Schildere doch mal die Problemstellung und WARUM du das so lösen willst.

Hallo,

für mich klingt das anders. Er hat 2 oder mehr Aufgaben in der loop die je nach Tastendruck durchlaufen werden sollen. Ohne selbstständige Rückkehr in was anderes. Erst auf Tastendruck hin.

Dazu braucht man wie gesagt keine echten Interrupts. Einfach die entprellten Taster ständig abfragen, letzten Tasterdruck merken und je nachdem die gewünschte Aufgabe (Funktionen) abarbeiten lassen und warten bis sich der Zustand der Taster ändert.

Zum Taster entprellen ist die Lib sehr hilfreich finde ich. GitHub - thomasfredericks/Bounce2: Debouncing library for Arduino and Wiring

Meine Glaskugel schreit mal wieder: "Endlicher Automat!"

Hallo,

ganz ehrlich, ich kann das bald nicht mehr hören. Weil es irgendwo immer ein endlicher Automat ist, egal was man programmiert. Es ist eine Ablaufsteuerung. Wird immer wieder und wieder durchlaufen.

combie:
Meine Glaskugel schreit mal wieder: "Endlicher Automat!"

Ich bin neugierig, Du hast eine sprechende Kristallkugel? ist das eine Sonderanfertigung? wo bekommt man so eine? :wink: :wink: :wink: :wink:

grüße Uwe

Ich bin neugierig,

Soll befriedigt werden....

wo bekommt man so eine?

Bei Ebay gibts Kristallglaskugeln.
Die sind aber eher passiv.
Habe schon ein paar ausprobiert, aus meiner Sicht nicht empfehlenswert.
Es sei denn man braucht einen Briefbeschwerer, oder so....

Du hast eine sprechende Kristallkugel?

Sprechen, schreien, aufblitzen, vibrieren.....
Gong, Orchester, Trompete.... je nachdem....

ist das eine Sonderanfertigung?

Ja!
Komplet virtuell, in Wetware.

combie:
Meine Glaskugel schreit mal wieder: "Endlicher Automat!"

Wenn man vernünftig, nicht blockierend und strukturiert programmiert, sind viele Anwendungen auf dem Arduino ein "Endlicher Automat", die meisten wissen nur nicht, dass das so heisst.

die meisten wissen nur nicht, dass das so heisst.

Und da ist der Punkt, wo ich zum Priester werde....

Ist das nicht bescheuert?

@Doc_Arduino
NIE wieder sage ich "Endlicher Automat".

NIE wieder sage ich "Endlicher Automat".

Sag doch FSM, da meinen manche, du redest vom Flying Spaghetti Monster und sind nicht mehr so negativ eingestellt.

Auf einem Arduino mit nur 2k RAM ist es übrigens normal, wenn ein Automat nur Endlich aussieht.

Erstens:
Ich habe mich schon als Pastafarei geoutet. (ist nicht so gut angekommen)
Muss also hier nicht wiederholt werden.

Zweitens:
Dass 2K nicht unendlich sind, will keiner hören.
Darum (viellieicht) auch der Widerstand gegen dieses Design Pattern.

Hallo,

@combie: schön das Du Humor hast :slight_smile: