20.06.2017, 11:16
(Dieser Beitrag wurde zuletzt bearbeitet: 20.06.2017, 12:47 von Bernhard45.)
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.
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.
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.
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")
Unser Open-Source Softwarebaukasten für Internetradios gibt es auf der Github-Seite! Projekt: BM45/iRadio (Google "github BM45/iRadio")