zurück

Debugging in Arduino IDE

21.09.2018
Debugging...

Das debuggen von Programmen (Sketches) auf dem Arduino ist schwieriger als beispielsweise in Hochsprachen wie C# oder Java. Dennoch kann man sich beim debugging in der Arduino-IDE das Leben etwas leichter machen. Die Idee für diese Dokumentation kam mir durch einen Beitrag der Seite "Der Hobbyelektroniker", wovon ein Teil des Codes stammt.

Die folgende kleine Library besitzt/vermisst folgende Features: - Ausgabe von Werten über die serielle Schnittstelle
- Breakpoints sind nicht möglich
- Optionale Delays notwendig
- Benötigt zusätzlichen Speicherplatz auf dem Mikrocontroller

Verwendete Bauteile

Debug-Library

Der folgende Code ist eine Sammlung einiger Makros zum Debugging, welcher in den eigentlichen Sketch eingebaut werden muss.

/**
 * SimpleDebug.h - Library for basic debugging features
 * (c) 2018 Christian Grieger
 * GNU GENERAL PUBLIC LICENSE
 */

#ifndef SIMPLEDEBUG_H
#define SIMPLEDEBUG_H

	#ifdef _SIMPLEDEBUG
		void debugWait(void)
		{
			// empty serial buffer
			char ch;
			while (Serial.available()) {
				ch = Serial.read();
			}
			ch = 0;

		Serial.println(F("DEBUG: Press 'c' to continue."));

		// wait for keypress "c"
		do {
			if (Serial.available() > 0) {
				ch = Serial.read();
			}
		} while (ch != 'c');

		// empty serial buffer
		while (Serial.available()) {
			ch = Serial.read();
		}
		}

		#define DEBUG_INIT(speed) Serial.begin(speed)
		#define DEBUG_PRINT(val) Serial.print("DEBUG: " + String(val))
		#define DEBUG_PRINTLN(val) Serial.println("DEBUG: " + String(val))
		#define DEBUG_DELAY(ms) delay(ms)
		#define DEBUG_WAIT(condition) if (condition) debugWait()
	#else
		// Empty macros bodies if debugging is not needed
		#define DEBUG_INIT(speed)
		#define DEBUG_PRINT(val)
		#define DEBUG_PRINTLN(val)
		#define DEBUG_DELAY(ms)
		#define DEBUG_WAIT(condition)
	#endif

#endif

Beispielcode

Der folgende Sketch benutzt diese Library zur Debug-Ausgabe:

// comment the following line for toggling the debug outputs:
#define _SIMPLEDEBUG
#include "SimpleDebug.h"


void setup()
{
  DEBUG_INIT(9600);
  DEBUG_WAIT(true);
}

void loop()
{
  DEBUG_PRINTLN(millis());
  delay(2000);
}
Ausgabe auf der seriellen Konsole
Abb.: Ausgabe auf der seriellen Konsole

Speicherverbrauch

Der Verbauch von Speicher auf dem Mikrocontroller zum Vergleich mit an- und ausgeschaltetem Debug-Code:

Speicherverbrauch mit Debugging-Code
Abb.: Speicherverbrauch mit Debugging-Code
Speicherverbrauch ohne Debugging-Code
Abb.: Speicherverbrauch ohne Debugging-Code