Vielleicht habe ich einen Compiler Bug gefunden.
Auf jeden Fall ein Verhalten, welches mir total quer kommt!
Reduziert habe ich es jetzt mal auf ein BlinkTestProgramm.
Verwendet werden meine Task Macros.
Und da scheint der Hase auch im Pfeffer zu liegen.
Die Macros verführen den Compiler zu fehlerhaftem/seltsamen Verhalten.
Beschreibung des Fehlers:
Im Testprogramm werden 2 Objekte erstellt.
a und b
Soweit, so gut.
In der run Methode von a wird auch der Kontext, also "this" von a verwendet.
Auch gut so. Tuts.
In der run Methode von b wird abwechselnd der Kontext von b und dann von a genutzt.
Das ist falsch.
Nochmal: In run() von b, zeigt "this" manchmal auf a
Und damit stimmt die Pause nicht, und mit blinken ist auch nichts.
Testcode:
// https://forum.arduino.cc/index.php?topic=415229.0
#include <TaskMacro.h>
class Blinky
{
private:
byte buttonPin;
byte led;
unsigned long pause;
public:
Blinky(byte buttonPin,byte led,unsigned long pause): buttonPin(buttonPin),led(led),pause(pause){}
void init()
{
pinMode(buttonPin,INPUT_PULLUP);
pinMode(led,OUTPUT);
digitalWrite(led,LOW);
}
void run() // Task
{
taskBegin();
while(1)
{
taskWaitFor(!digitalRead(buttonPin));
Serial.print("this "); Serial.println(int(this));
digitalWrite(led,HIGH);
taskPause(pause);
Serial.print("this "); Serial.println(int(this));
digitalWrite(led,LOW);
taskPause(pause);
}
taskEnd();
}
};
// 2 Instanzen erzeugen
Blinky a(2,12,500UL); // Pinzuordnung Button=2 Led=12 pause=500ms(Blinkinterval)
Blinky b(3,13,1000UL);
void setup()
{
Serial.begin(9600);
Serial.println("Start");
a.init();
b.init();
}
void loop()
{
a.run();
b.run();
}
Weiß einer, warum das so ist?
Eine Idee, wie man das vermeiden kann?