CmBacktrace (Cortex Microcontroller Backtrace)是一款针对 ARM Cortex-M 系列 MCU 的错误代码自动追踪、定位,错误原因自动分析的开源库。主要特性如下:
- 支持的错误包括:
- 断言(assert)
- 故障(Hard Fault, Memory Management Fault, Bus Fault, Usage Fault, Debug Fault)
- 故障原因 自动诊断 :可在故障发生时,自动分析出故障的原因,定位发生故障的代码位置,而无需再手动分析繁杂的故障寄存器;
- 输出错误现场的 函数调用栈(需配合 addr2line 工具进行精确定位),还原发生错误时的现场信息,定位问题代码位置、逻辑更加快捷、精准。也可以在正常状态下使用该库,获取当前的函数调用栈;
移植部分:
项目地址:
https://github.com/armink/CmBacktracegithub.com/armink/CmBacktrace
模块移植比较简单,只需要把cmbacktrace内的文件添加进keil工程, 相应的头文件路径添加完毕,添加对应的hardfault.s以及cmbacktrace.c文件进入keil工程即可。
keil工程添加的内容
cmb_cfg.h为模块配置文件,为了方便查阅本人添加进keil工程。不添加也可
头文件路径
注意:使用本模块需要勾线c99支持。
注释用户自己编写的hardfault处理函数,若无法注释应当在hardfault处理函数中添加cmb模块的函数。参考链接:https://github.com/armink/CmBacktrace/blob/master/README_ZH.md
在初始化部分添加init函数
#include <cm_backtrace.h> #define HARDWARE_VERSION "V1.0.0" #define SOFTWARE_VERSION "V0.1.0" cm_backtrace_init("SPD1188_test", HARDWARE_VERSION, SOFTWARE_VERSION); |
在断言函数内执行如下函数
// assert断言重定向 void __aeabi_assert(const char *expr, const char *file, int line) { uint32_t __msp = 0; __msp = __get_MSP(); cm_backtrace_assert(__msp); printf("assert in file:%s expr:%s line:%d\n", file, expr, line); for(;;); } |
在cfg.h内配置模块的相应选项
/* print line, must config by user */ #define cmb_println(...) printf(__VA_ARGS__);printf("\r\n") //输出选项配置 /* enable bare metal(no OS) platform */ #define CMB_USING_BARE_METAL_PLATFORM //不使用os /* enable OS platform */ /* #define CMB_USING_OS_PLATFORM */ //使用os /* OS platform type, must config when CMB_USING_OS_PLATFORM is enable */ /* #define CMB_OS_PLATFORM_TYPE CMB_OS_PLATFORM_RTT or CMB_OS_PLATFORM_UCOSII or CMB_OS_PLATFORM_UCOSIII or CMB_OS_PLATFORM_FREERTOS *///使用哪种os /* cpu platform type, must config by user */ #define CMB_CPU_PLATFORM_TYPE CMB_CPU_ARM_CORTEX_M4 //cpu类型 /* enable dump stack information */ #define CMB_USING_DUMP_STACK_INFO //追踪堆栈信息 /* language of print information */ #define CMB_PRINT_LANGUAGE CMB_PRINT_LANGUAGE_ENGLISH //打印语言选择英文 // #define CMB_PRINT_LANGUAGE CMB_PRINT_LANGUAGE_CHINESE //打印语言选择中文(中文支持较差,建议英文打印) |
用户自行设置printf函数重定向
使用教程:
在出现硬件异常的时候,cmb模块会在输出端进行错误信息的打印。帮助用户排查hardfault的原因,打印出来的结果如下图所示:
项目名称及软硬件版本,部分堆栈信息
寄存器组信息及cmb模块推测原因,以及工具命令行
结合addr2line工具分析,addr2line工具为gcc分析镜像文件的工具。cmb模块中tools文件下提供,将该工具的地址添加进环境变量。(该工具的使用讲解及环境变量添加略去)
使用addr2line工具分析如下图所示:
从上图可以看出,出现hardfault异常前的函数调用过程以及对应的函数名。使用该信息以定位hardfault的原因。