Debugger-Breakpoints in ChibiOS chDbgAssert() erzwingen
ChibiOS bietet eine Vielzahl von Debug-Funktionen, die über Präprozessor-Definitionen aktiviert oder deaktiviert werden können.
Beim Debuggen von ARM-basierten Mikrocontrollern wie dem STM32 kann es nützlich sein, hartcodierte Breakpoints zu setzen.
Dieser Beitrag stellt eine einfache Methode zur Verbesserung der Definition von chDbgAssert() in chdebug.h vor, sodass bei Assertions-Fehlern ein Breakpoint erzwungen wird. Durch die Verwendung der ARM BKPT-Anweisung beträgt der Overhead nur eine einzige Assembler-Anweisung.
Beachte, dass wir hier die GCC-Inline-Assembler-Syntax verwenden. Bei Verwendung anderer Compiler musst du die Syntax entsprechend anpassen.
Originaler ChibiOS 2.6.6-Code:
#if !defined(chDbgAssert)
#define chDbgAssert(c, m, r) { \\
if (!(c)) \\
chDbgPanic(m); \\
}
#endif /* !defined(chDbgAssert) */Modifizierter Code:
#if !defined(chDbgAssert)
#define chDbgAssert(c, m, r) { \\
if (!(c)) { \\
__asm volatile("BKPT #0\\n"); \\
chDbgPanic(m); \\
} \\
}
#endif /* !defined(chDbgAssert) */Beachte, dass der Inline-Assembler auch als CMSIS-Funktion verfügbar ist: __BKPT. In der Standardkonfiguration erlaubt ChibiOS 2.6.6 die Verwendung von CMSIS in chdebug.h ohne zusätzliche #include-Anweisungen nicht.
Beachte, dass dieser Code-Schnipsel & der entsprechende Patch unter der gleichen Lizenz wie ChibiOS stehen.
Update 2014-10-23:
Es ist gelegentlich auch nützlich, die BKPT-Anweisung in die Implementierung von chDbgPanic in chdebug.c einzufügen:
void chDbgPanic(const char *msg) {
__asm volatile("BKPT #0\\n");
dbg_panic_msg = msg;
chSysHalt();
}Update 2014-11-01:
Standardmäßig verwendet ChibiOS 2.6.6 chSysHalt() als Handler für LWIP_PLATFORM_ASSERT. Mit anderen Worten: Die oben beschriebene Methode fängt LWIP-Assertions standardmäßig nicht ab.
Um dies zu beheben, öffne os/various/lwip_bindings/arch/cc.h und ersetze
#define LWIP_PLATFORM_ASSERT(x) { \
chSysHalt(); \
}durch
#define LWIP_PLATFORM_ASSERT(x) { \
chDbgPanic(x); \\
}