在 ChibiOS chDbgAssert() 中强制调试器断点
ChibiOS 提供各种调试函数,可使用预处理器定义启用或禁用。
在调试基于 ARM 的微控制器如 STM32 时,硬编码可能很有用
本文提供了一种改进 chdebug.h 中 chDbgAssert() 定义的简单方法,以便在断言失败时强制断点。通过使用 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
If this post helped you, please consider buying me a coffee or donating via PayPal to support research & publishing of new posts on TechOverflow