Last Updated on 24. Mai 2020 by sfambach
Gerade beim neuen Entwicklungen ist es wichtig ein paar Ausgaben über die serielle Schnittstelle oder ein anderes Medium zu schicken. Natürlich können diese Ausgaben einfach gelöscht oder ausdokumentiert werden. Aber spätestens wenn die Implementierung erweitert wird, werden sie wieder benötigt.
Es gibt unterschiedliche Ansätze welche ich hier kurz vorstellen möchte. Welche Variante die Richtige ist muss jeder für sich selbst entscheiden.
Boolische Variable + IF
Verwendung einer globale boolischen Variable und eine IF-Bedinung für jede Ausgabe.
bool debug = true;
void funktion1(){
// ....
if(debug){
Serial.println("Debug Nachricht");
}
// ....
}
Dieser Variante ermöglicht es, das Debugging auch noch während des Betriebes ein zu schalten. Dies ist bei den folgenden Varianten nicht möglich. Der größte Nachteil ist der zusätliche Code und der Speicher für die Texte. Um Speicher zu sparen können die Texte ins EEPROM oder in den Flash Speicher ausgelagert werden. Hier ein Beispiel für den Flash Speicher:
bool debug = true;
void funktion1(){
// ....
if(debug){
Serial.println(F("Debug Nachricht"));
}
// ....
}
Präprozessor Bedingung
In folgenden Beispiel wir die Variante von oben mit Präprozessoranweisungen realisiert. Fällt das #define oben weg, werden auch die Ausgabe nicht eincompiliert. Dies spart Speicher ein. Ein Nachteil ist der druchbrochene Code, Präprozessornaweisungen zerfleddern einwenig das Gesamtbild.
#define DEBUG
void funktion1(){
// ....
#ifdef DEBUG
Serial.println(F("Debug Nachricht"));
#enfif
// ....
}
Präprozessor Ersetzung
Roeln hat im Arduino Forum das folgende Beispiel gebracht:
#include "Arduino.h"
#define DEBUG true // flag to turn on/off debugging
#define Serial if(DEBUG)Serial
Dies scheint mir eine der elegantesten Varianten zu sein, weil die Serial Klasse wie gewohnt verwendet werden kann und danach komplett ausgeschaltet wird. Laut einiger Forenteilnehmer scheint dies aber nicht immer zu Funktionieren. Somit kommen wir zur letzten Variante.
Präprozessor Funktionen
Definition von Präprozessor Funktionen. Diese können leicht ausgeschaltet werden und belasten den Speicher nicht. Nachteil jede Funktion muss einzeln definiert und im Quellcode verwendet werden.
#ifdef DEBUG
#define DEBUG_PRINT(x) Serial.print (x)
#define DEBUG_PRINTDEC(x) Serial.print (x, DEC)
#define DEBUG_PRINTLN(x) Serial.println (x)
#else
#define DEBUG_PRINT(x)
#define DEBUG_PRINTDEC(x)
#define DEBUG_PRINTLN(x)
#endif
void setup()
Serial.begin(115200);
DEBUG_PRINT ("Hallo ich bin ein Text2");
}
Oder diese im Arduino Forum gefundene Version, hier ist mir nicht ganz klar worfür die Schleife gebaucht werden …
#define DEBUG false // flag to turn on/off debugging
#define debug_begin(...) do { if (DEBUG) { Serial.begin(__VA_ARGS__); while(!Serial); }} while (0)
#define debug_print(...) do { if (DEBUG) Serial.print(__VA_ARGS__); } while (0)
#define debug_println(...) do { if (DEBUG) Serial.println(__VA_ARGS__); } while (0)
#define debug_printf(...) do { if (DEBUG) Serial.printf(__VA_ARGS__); } while (0)
void setup()
debug_begin(115200);
debug_begin("Hallo ich bin ein Text2");
}
Online Debugger
Noch besser ist natürlich ein Debugger, der schrittweise über den Code gehen kann. Dies war beim Atmel mit JTAG schon immer möglich. Arduino scheint diese Möglichkeit etwas verschlafen zu haben. Hier die Bemühungen der Arduino IDE.
Hier die Bestrebungen von PlatformIO
https://docs.platformio.org/en/latest/plus/debugging.html
https://docs.platformio.org/en/latest/tutorials/espressif32/arduino_debugging_unit_testing.html
Eclipse kann es Grundsätzlich, es gibt auch Ansätze für den Arduino:
https://www.codeproject.com/Articles/1037057/Debugger-for-Arduino
Fazit
Es gibt zahlreiche Möglichkeiten Debugging Nachrichten aus dem produktiven Code heraus zu nehmen. Die letzten Varianten sind sicherlich die meist angewandten. Um Variablen inhalte über alles Änderungen hinweg zu verfolgen ist sicherlich ein „Richtiger“ Debugger besser geeignet.
Quellen
https://forum.arduino.cc/index.php?topic=155268.0
Preview the Debugger feature for the Arduino Pro IDE