Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Multitasking mit Microcontroller
#1
Hallo zusammen,

oft kommt es vor das man mit einem Microcontroller mehrere Sachen auf einmal machen muß. Das kann im einfachsten Fall sein, das bestimmte Ausgänge/Eingäne zu unterschiedlichen Zeiten abgefragt oder gesetzt werden müssen.
Beispiel: LED1 blinkt alle 3 Sekunden, gleichzeitig blinkt LED2 beim Eintreffen eines Signals an der RS232 oder USB-Schnittstelle.

Es gibt aber auch kompliziertere Sachen mit noch mehr gleichzeitigen Aufgaben. So muß ich bei der Entwicklung meines Internetradios gleichzeitig einen Datenstrom von einem Webserver empfangen, damit auf der einen Seite einen FiFO-Pufferspeicher  füllen, auf der anderen Seite die Daten aus dem FiFO-Pufferspeicher zu einem MP3-Dekoder senden.
Nach dem MP3-Dekoder sind die Daten für die NF zu analogisieren. Gleichzeitig sind Benutzereingaben abzufangen und ein Display zur Anzeige anzusteuern. Nur ein kleiner Teil dieser Aufgaben kann interrupt-gesteuert in einer Interrupt-Service-Routine ablaufen.

Welche Lösungen hat man?

1. Man nimmt für all diese Aufgaben ein Echtzeitbetriebssystem wie FreeRTOS. http://www.freertos.org/
    Dieses Betriebssystem gibt es für sehr viele Microcontroller, so auch für den Arduino (AVR), aber auch für den ESP8266.
    Auch der ESP32,der ja schon 2 Prozessorkerne hat und somit ideal für Multitasking ist, wird von FreeRTOS unterstützt.
   
    
2. Anstelle eines kompletten Betriebssystems (man braucht nicht immer alle Funktionen eines Betriebssystems) benutzt man eine Taskscheduler-Bibliothek für kooperatives Multitasking. Eine solche Bibliothek findet man zum Beispiel hier https://github.com/arkhipenko/TaskScheduler

Die Integration dieser Bibliothek in eigene Projekte ist ganz einfach. Man lädt die Bibliothek aus oben genannter Quelle oder aus dem Anhang dieses Posts als zip-Datei herunter und entpackt diese im lokalen Arduino-Verzeichnis unter dem Ordner "libraries".
Der zentrale Bestandteil der Bibliothek, die Datei TaskScheduler.h, kommt dann beispielsweise (für meinen Fall) im Verzeichnis /home/bernhard/Arduino/libraries/TaskScheduler-master/src zu liegen.
Unter Windows wäre es das Verzeichnis C:\Benutzer\bernhard\Eigene Dokumente\Arduino\libraries\TaskScheduler-master\src

Nun kann man im eigenen Programm ganz einfach mehrere Aufgaben parallel laufen lassen.

Code:
#include <TaskScheduler.h>  // Einbinden der Multitasking-Bibliothek

Scheduler ts;  // hier wird ein TaskScheduler-Objekt angelegt

// Deklaration der Funktionen die parallel ablaufen sollen
void Aufgabe1();
void Aufgabe2();

void Aufgabe1() {
   // ... hier steht der Code für die Aufgabe 1
}

void Aufgabe2() {
   // ... hier steht der Code für die Aufgabe 2  
}
   
// Aus den Aufgabe-Funktionen werden jetzt Tasks für den Scheduler gemacht

Task t1(100,  TASK_FOREVER,  &Aufgabe1); // Alle 100ms führe Aufgabe 1 aus
Task t2(1000, TASK_FOREVER, &Aufgabe2);  // Alle 1000ms führe Aufgabe 2 aus


void setup() {
  ts.init(); // der ThreadScheduler wird initialisiert
 
  ts.addTask(t1); // Task1 wird an den Scheduler gereicht
  ts.addTask(t2); // Task2 wird an den Scheduler gereicht
 
  t1.enable(); // Task1 wird aktiv geschaltet
  t2.enable(); // Task2 wird aktiv geschaltet

}

void loop() {
 ts.execute(); // der TaskScheduler wird gestartet
}

Oben gezeigtes Minimalprogramm ist nur ein Beispiel für 2 Aufgaben, es können natürlich viel mehr Aufgaben so gemanaged werden. Auch gibt es viele zusätzliche Optionen und Schalter. Eine ausführliche Dokumentation liegt der Scheduler-Bibliothek bei, man findet diese im "extra"-Verzeichnis der Bibliothek. Viele fertige Beispielprogramme sind bereits im Ordner "examples" enthalten. Diese kann man direkt in der Arduino-IDE (oder jeden anderen Texteditor) öffnen, kompilieren und in das Zielsystem laden.

Hier nochmal ein FlowChart wie Threads (also Aufgaben) im ThreadScheduler behandelt werden.

   


Angehängte Dateien
.zip   TaskScheduler-master.zip (Größe: 435,25 KB / Downloads: 7)
Ansprechpartner für Umbau oder Modernisierung von Röhrenradios mittels SDR,DAB+,Internetradio,Firmwareentwicklung. 
Unser Open-Source Softwarebaukasten für Internetradios gibt es auf der Github-Seite! Projekt: BM45/iRadio (Google "github BM45/iRadio")
Zitieren


Möglicherweise verwandte Themen…
Thema Verfasser Antworten Ansichten Letzter Beitrag
  Audioerzeugung mit Microcontroller Bernhard45 18 10.336 15.04.2020, 23:39
Letzter Beitrag: Bernhard45
  Microcontroller, kein Problem für Elektronikpraktiker! hardware.bas 15 6.026 08.02.2020, 22:13
Letzter Beitrag: hardware.bas
  Leistungsvergleich/Benchmark Microcontroller Bernhard45 0 1.210 10.08.2017, 14:41
Letzter Beitrag: Bernhard45
  Grafische Programmierung von Microcontroller Bernhard45 2 1.542 16.06.2017, 21:54
Letzter Beitrag: Radiobastler

Gehe zu: