在嵌入式开发中,调试是一个重要的环节,尤其是当程序出现异常时,能够快速定位问题所在是提高开发效率的关键。STM32 微控制器在运行过程中可能会遇到各种异常情况,如断言失败、硬件故障等。此时,栈回溯(Stack Trace)功能就显得尤为重要。CmBacktrace 是一款针对 ARM Cortex-M 系列 MCU 的错误代码自动追踪、定位,错误原因自动分析的开源库,它可以帮助开发者在遇到异常时快速定位问题。
CmBacktrace 库简介
CmBacktrace 库支持多种错误类型,包括断言(assert)、硬件故障(如 Hard Fault、Memory Management Fault、Bus Fault、Usage Fault、Debug Fault)等。它能够在故障发生时自动分析出故障的原因,并定位到发生故障的代码位置,从而无需手动分析繁杂的故障寄存器。此外,CmBacktrace 还支持输出错误现场的函数调用栈,还原发生错误时的现场信息,使得定位问题代码位置和逻辑更加快捷和精准。
移植和配置 CmBacktrace
首先,需要将 CmBacktrace 库的源代码移植到工程目录下。库文件包括 cm_backtrace.c
、cm_backtrace.h
、cmb_cfg.h
和 cmb_def.h
等。在 cmb_cfg.h
文件中,需要根据实际的硬件平台和需求进行配置,包括错误和诊断信息输出、是否使用裸机平台、CPU 平台类型、是否使用 Dump 堆栈的功能等 。
示例代码
以下是使用 CmBacktrace 库进行栈回溯的示例代码:
#include "cm_backtrace.h"void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART2_UART_Init(void);int main(void) {HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_USART2_UART_Init();// 初始化 CmBacktrace 库cm_backtrace_init("STM32F103CB_CmBacktrace_Demo", "V1.0.0", "V0.1.0");while (1) {// 模拟一个断言失败的场景assert(0);}
}void SystemClock_Config(void) {// 时钟配置代码
}static void MX_GPIO_Init(void) {// GPIO初始化代码
}static void MX_USART2_UART_Init(void) {// UART初始化代码,用于输出调试信息
}
在上述代码中,首先初始化了硬件和外设,然后调用 cm_backtrace_init
函数初始化 CmBacktrace 库。在主循环中,通过 assert(0)
模拟一个断言失败的场景,此时 CmBacktrace 库将自动输出栈回溯信息,帮助开发者定位问题所在。
注意事项
- 库配置:确保在
cmb_cfg.h
中正确配置了错误和诊断信息输出、CPU 平台类型等选项。 - 串口输出:由于 CmBacktrace 库需要通过串口输出调试信息,因此需要确保 UART 已经正确初始化并配置。
- 故障模拟:在实际使用中,可以根据需要模拟不同的故障场景,以测试 CmBacktrace 库的效果。
通过使用 CmBacktrace 库,可以大大提高 STM32 程序调试的效率,尤其是在遇到复杂的故障时,能够快速定位问题所在。这对于嵌入式开发者来说是一个非常有用的工具。
✅作者简介:热爱科研的嵌入式开发者,修心和技术同步精进
❤欢迎关注我的知乎:对error视而不见
代码获取、问题探讨及文章转载可私信。
☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。
🍎获取更多嵌入式资料可点击链接进群领取,谢谢支持!👇
点击领取更多详细资料