Wo ist "serialEventRun" definiert?

Hallo zusammen,

ich habe mal eine Frage zur folgenden Anweisung aus der main.cpp:

if (serialEventRun) serialEventRun();

Wenn ich es richtig sehe, wird ja die Funktion serialEventRun() aus HardwareSerial.cpp aufgerufen, falls die Variable serialEventRun ungleich Null ist. Ich finde aber nirgends eine Stelle, wo die Variable "serialEventRun" definiert ist. Kann mir jemand einen Tipp geben?

Vielen Dank im Voraus!

Das ist ein wenig tricky, denn das "serialEventRun" ist keine Variable, sondern die Funktion selbst :slight_smile:
Der Trick liegt in der HardwareSerial.h:

extern void serialEventRun(void) __attribute__((weak));

Die Funktion "serialEventRun" wird als "weak"-Symbol deklariert. Damit kann dieses Symbol von anderen Definitionen überschrieben werden, aber auch "0" sein, wenn es keine Definition für dieses Symbol gibt.
Das

if (serialEventRun) serialEventRun();

bedeutet also im Grunde: Wenn es eine implementierte Funktion "serialEventRun" gibt, dann führe sie aus. Wenn nicht, dann nicht.
Die Erklärung warum das gemacht wird, findet sich in der HardwareSerial.cpp:

// this next line disables the entire HardwareSerial.cpp,
// this is so I can support Attiny series and any other chip without a uart
#if defined(UBRRH) || defined(UBRR0H) || defined(UBRR1H) || defined(UBRR2H) || defined(UBRR3H)

Wenn also ein Chip verwendet wird, der kein UART kann, gibts auch keine implementierte "serialEventRun" Funktion. Dann würde der Compiler aber meckern, weil es die Funktion nicht gibt, da sie ja in der main.cpp drin steht.

Das Gleiche wird übrigens auch mit der Funktion "serialEvent()" gemacht. Die wird in der HardwareSerial.cpp auch als "weak"-Symbol definiert und dort zusätzlich als "leere"-Funktion angelegt. Damit kann man die Funktion trotzdem durch eine eigene im Sketch überschreiben und es gibt keine Compilerfehler das eine Funktion doppelt definiert wurde.

Sehr geschickt, wenn auch etwas verwirrend XD

Mario.

Edit: Hier noch ein Beispiel dafür: Weak symbol - Wikipedia

Hallo Mario, vielen Dank für die schnelle und perfekte Erklärung und WOW... das ist wirklich sehr geschickt gelöst.. 8)