Debugger-Breakpoints in ChibiOS chDbgAssert() erzwingen

English Deutsch

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:

chdebug.h
#if !defined(chDbgAssert)
#define chDbgAssert(c, m, r) {                                              \\
  if (!(c))                                                                 \\
    chDbgPanic(m);                                                          \\
}
#endif /* !defined(chDbgAssert) */

Modifizierter Code:

chdebug_bkpt.h
#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:

chdebug_panic.cpp
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

cc.h
#define LWIP_PLATFORM_ASSERT(x) {                                       \
  chSysHalt();                                                          \
}

durch

cc_fix.h
#define LWIP_PLATFORM_ASSERT(x) {                                       \
  chDbgPanic(x);                                                        \\
}

Check out similar posts by category: Embedded