Arduino : multithreading /multiprocessing?

hallo,
kann man in Sketches mehrere Prozesse parallel laufen lassen ?
zB. Schranke herunterfahren und gleichzeitig läuten/blinken ?

Yep, kein problem.. But please in English in here..

Ihr Beitrag wurde an seinen aktuellen Speicherort verschoben, da er besser geeignet ist.

Wenn "man" ich sein soll, dann ja.

nein, man braucht mir nix vorlesen..Stichworte und Links zum Kugeln
wären allerdings nützlich..

Paralell (hundertprozentig gleichzeitig) nicht. Schnell nacheinander schon. Ineinander verschachtelt auch.

Schranke herunterfahren ist für Controller-Zeitempinden unendlich langsam. Da kann er zwischenzeitlich auch andere Sachen machen.

Das müssen aber keine unabhängige Prozesse oder Treads sein.

Der Controller hat nur eine CPU und darum nicht multiprocessing. Auch sind in den Controllern des Arduino keine Hardware für Multiprocessing vorhanden.

Der ESP32 müßte mehrere Processoren haben aber ich weiß nicht wie man die einzeln anspricht.

Was combie zaubern kann kann ich nicht beurteilen. :smiley:

Grüße Uwe

Nicht mit der Arduino IDE. Dazu muss man die von Expressif verweden, dann kann man beide Prozessoren parallel verwenden.

OK, dann werde ich dir mal .....

Suchtipp: "@combie multitasking"
Da findest du alles...
Von Erklärungen, bis Beispielcode und fertigen Libraries.

Es gibt schon einige DualCore µC im Arduino Umfeld.
Aber ja, die kooperativen Verfahren überwiegen

Aber wie gesagt dazu braucht es keine Multicore, Multitasking, Multiprocessing oder ähnliches, sondern nur nicht blockierende Programmierung in einem einzigen Sketch.
Grüße Uwe

"gleichzeitig" nicht, aber so schnell hintereinander, dass es für dich wie gleichzeitig aussieht.

Du beginnst mit dem Beispiel "Blink Without Delay".
Das ist die Mutter aller deine Sketche.
Übe damit, bis du diesen Sketch ohne Nachzusehen selber hinschreiben kannst.
Wenn du eine einzige Zeile nicht verstehst, google danach.
Wenn das nicht hilft, frag hier.
Ohne Blink Without Delay hat jede weitere Frage in dieser Richtung keinen Sinn.

Wenn du Blink Without Delay verstanden hast, dann kannst du hier mal lesen:

https://werner.rothschopf.net/202003_arduino_retriggerbares_nachlaufrelais.htm

das Zeigt auch wie man das "vervielfacht".
Und wenn du dann noch Lust hast, hast du hier den Übergang zu OOP:

https://werner.rothschopf.net/202003_arduino_retriggerbares_nachlaufrelais_oop.htm

Damit ist dann deine Andere Frage in dem Nebenthread aus meiner Sicht auch beantwortet.

Man kann. Evtl. ist das Tutorial von Rentner Von delay() bis zur Methode etwas für Dich.

Warum stellst Du Deine Themen eigentlich immer zuerst im englischen Teil ein?

Gruß Tommy

danke erstmal, combie !

uwe : was verstehst Du denn unter "nichtblockierende Programmierung" ?

Also, was ich erreichen will, ist das Verhalten einer Schranke in alter Manier
in Deutschland (andere Länder machen das anders !) an 1gleisigem schienengleichen Bahnübergang

Zug gemeldet
Glocke läutet bzw Blinklicht geht an
einige Sekunden später gehen die Schrankenbäume runter,
während Glocke immer noch läutet bzw Blinklicht aktiv ist
Läuten hört auf bzw Blinklicht aus

nach Zugdurchfahrt und Blockfreigabe : Ein Glockenton !
Schrankenbäume gehen hoch
(werd zu dem Thema mal im Moba-Forum nach nem Video fragen,
meine Erinnerung ist dazu nicht mehr sooo klar)

Freue mich auf Eure Ideen..

Das was noiasca in #10 schreibt.
Kein delay() fast kein for, fast kein while oder do while sondern Zeittriggern mit millis(), Schrittketten und State Machine. Ah EVA schadet auch nicht.

Grüße Uwe

Das stimmt nicht.

ESP32 Dual Core on Arduino IDE including Data Passing and Task Synchronization

1 Like

hi,
das ist ja super erklärt ! Vielen Dank !
Na, da hab ich was zu tun.. :grinning:

Ein Blick in die Bibliothek MobaTools, per IDE zu installieren, könnte nützen. Da gibt es auch blockadearme Zeitgeber.

Auf- und abblendende LEDs sind da auch vorhanden.

Bei mir jetzt mal mehrere Glockentöne und eine blinkende LED als Beispiel:

  • Aufgabe 1: Glockenanschlag - Pause - Glockenanschlag - Pause ...
  • Aufgabe 2: LED ein - Pause - LED aus - Pause - LED ein - Pause - LED aus - Pause ...

Das könnte man schön mit CooperativeTask von @combie erledigen. Aber es geht auch mit den Bordmitteln, weil die Pausen viel länger sind, als die Aktivitäten. Macht die eine Aufgabe gerade Pause, kann die andere aktiv sein.

void loop() {
  aufgabe_1();
  aufgabe_2();
  digitalWrite(herzschlagLEDpin, !digitalRead(herzschlagLEDpin));
}

Solange die herzschlagLED sehr schnell flackert, sind die Funktionen aufgabe_1() und aufgabe_2() hinreichend blockadearm programmiert. Das läßt sich mit millis() ebenso erreichen, wie mit den Timern der MobaTools.

Zu dem Thema hatte ich vor mehreren Jahren schon ein Thema im Stummiforum aufgemacht. Ist inzwischen ein etwas länglicher Thread geworden, bei dem es sich wohl nicht lohnt, alles durchzulesen.
Eine erste nutzbare Version, bei der auch zu sehen ist wie die 'Parallelität' von Schranke, Blinker und Glocke funktioniert gabb's hier. Da wurden die Schrankenbäume noch mit Servos bewegt. Später bin ich dann zu einem kleinen Schrittmotor übergegangen, da sich dort die Bewegung wesentlich gleichmäßiger realisieren lassen.
Das hatte ich dann ab hier beschrieben. Da ist auch ein Video über das Ergebnis dabei:

Für die Mechanik gab's dann weiter hinten in Thread auch noch alternative Vorschläge.

1 Like

Stimmt nicht so ganz. Die arduino-esp32 Umgebung hat die vTask-Aufrufe aus IDF adaptiert, so dass man sie auch in der Arduinowelt benutzen kann. Da auf dem ESP32 FreeRTOS läuft, geht somit Multitasking und auch Multiprocessing (etwas eingeschränkt, weil beide Cores nicht ganz gleich ausgestattet sind).
Ich empfehle auch gerne PlatformIO als IDE, da gibt es die Einschränkungen der Arduino-IDE nicht - auf Kosten etwas erhöhter Komplexität.

Ja, das hatte @Whandall in #15 bereits angemerkt.
Sieht spannend aus! Denke aber für den TE reicht eine Statemaschine locker aus. Da muss man auf einem ESP32 schon mächtig Workload haben, damit sich Multiprocessing lohnt.