CmBackTrace的移植与使用(​转自https://zhuanlan.zhihu.com/p/366558691)

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/CmBacktrace​github.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的原因。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值