在 ChibiOS chDbgAssert() 中强制调试器断点

ChibiOS 提供各种调试函数,可使用预处理器定义启用或禁用。

在调试基于 ARM 的微控制器如 STM32 时,硬编码可能很有用

本文提供了一种改进 chdebug.hchDbgAssert() 定义的简单方法,以便在断言失败时强制断点。通过使用 ARM BKPT 指令,开销仅为单个汇编指令。

注意我们这里使用 GCC 内联汇编语法。使用其他编译器时,你需要相应地移植语法。

原始 ChibiOS 2.6.6 代码:

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

修改后的代码:

chdebug_bkpt.h
#if !defined(chDbgAssert)
#define chDbgAssert(c, m, r) {                                              \\
  if (!(c)) {                                                               \\
    __asm volatile("BKPT #0\\n");                                            \\
    chDbgPanic(m);                                                          \\
  }                                                                         \\
}
#endif /* !defined(chDbgAssert) */

注意内联汇编也可作为 CMSIS 函数使用:__BKPT。在默认配置中,ChibiOS 2.6.6 不允许在没有额外 #include 语句的情况下在 chdebug.h 中使用 CMSIS。

注意此代码片段和相应的补丁在与 ChibiOS 相同的许可下许可。

更新 2014-10-23:

偶尔在 chdebug.c 中的 chDbgPanic 实现中添加 BKPT 语句也很有用:

chdebug_panic.cpp
void chDbgPanic(const char *msg) {
  __asm volatile("BKPT #0\\n");
  dbg_panic_msg = msg;
  chSysHalt();
}

更新 2014-11-01:

默认情况下,ChibiOS 2.6.6 使用 chSysHalt() 作为 LWIP_PLATFORM_ASSERT 的处理程序。换句话说,上述方法默认不会捕获 LWIP 断言。

为了修复此问题,打开 os/various/lwip_bindings/arch/cc.h 并替换

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

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

Check out similar posts by category: Embedded