Schönen guten Tag.
Endlich habe ich auch mal wieder ein Problem, dessen Lösung/Ursache sich mir entzieht.
Erstmal, wozu es dienen soll:
Es ist die Xte Variante meiner Multitasking Makros.
Dieses mal ganz im OOP Gewand.
Seit Monaten läuft es stabil.
In mehren Anwendungen.
Für das nächste Projekt musste die Erzeugung von Tasks dynamisch erfolgen. Auf Grund des hohen Speicher/RAM Bedarfs einzelner Aufgaben.
Und da klemmt es jetzt.
Meine Task Klasse hat 3 virtuelle Methoden:
- begin()
- loop()
- destructor
Mit Constructor, Destructor, loop() ist alles ok.
Bisher immer.
Das Kind, welches Husten hat, ist begin()
Grundsätzlich ist der Aufbau jetzt:
Jede konstruierte Task, trägt sich mit Scheduler::add(Task*) in die Liste ein.
Scheduler::instance().begin();
Ruft die begin() Methoden aller von Task abgeleiteten Objekte auf.
Perfekt!
Scheduler::begin(); setzt auch eine interne Variable beginDone.
Klappt perfekt.
Scheduler::add(Task*) prüft ob beginDone schon gesetzt ist, und wenn ja ruft es begin() der jeweiligen Task auf.
Und das geht eben schief.
Es wird dummer Weise die Methode von Task aufgerufen, und nicht die Methode begin() der abgeleiteten Klasse.
In dem konkreten Beispiel äußert es sich dann so, dass pinMode() nicht aufgerufen wird.
void setup() // funktioniert
{
new BlinkTask(13,500);
Scheduler::instance().begin();
}
void setup() // versagt
{
Scheduler::instance().begin();
new BlinkTask(13,500);
}
Es ist also so, dass alle Tasks, welche vor dem Scheduler::begin() Lauf erzeugt werden, perfekt funktionieren. Nur die später Erzeugten, da versagt der Task::begin() Aufruf.
Task::loop() Aufrufe haben kein Problem.
Es wäre schön, wenn mir einer sagt, was ich da falsch mache.
Auch eine alternative Variante, wie man solche Tasks dynamisch verketten kann, wäre genehm.
Wobei Singleton, List und ListNode auch schon mehrfach im Einsatz sind und andernorts wie erwartet arbeiten.
EDIT:
Die korrigierte/aktuelle Lib findet sich in diesem Beitrag
CooperativeTask.zip (10.5 KB)