0、CmBacktrace 是什么CmBacktrace (Cortex Microcontroller Backtrace)是一款针对 ARM Cortex-M 系列 MCU 的错误代码自动追踪、定位,错误原因自动分析的开源库。主要特性如下:
1、为什么选择 CmBacktrace入门新人 :对于从 C51 、MSP430 等简单单片机转而使用更加复杂的 ARM 新人来说,时不时出现的 "hard falut" 死机会让新人瞬间懵掉。定位错误的方法也往往是连接上仿真器,一步步 F10/F11 单步,定位到具体的错误代码,再去猜测、排除、推敲错误原因,这种过程十分痛苦。 熟练老手 :慢慢的大家知道可以通过故障寄存器信息来定位故障原因及故障代码地址,虽然这样能解决一小部分问题,但是重复的、繁琐的分析过程也会耽误很多时间。而且对于一些复杂问题,只依靠代码地址是无法解决的,必须得还原错误现场的函数调用逻辑关系。虽然连接仿真器可以查看到的函数调用栈,但故障状态下是无法显示的,所以还是得一步步 F10/F11 单步去定位错误代码的位置。另外,还有两种场景,
所以定位这类问题就显得难上加难。 使用本库 :上述所有问题都迎刃而解,可以将错误信息输出到控制台上,还可以将错误信息使用 EasyFlash 的 Log 功能保存至 Flash 中,设备死机后重启依然能够读取上次的错误信息。CmBacktrace 输出的信息包括函数调用栈、故障诊断结果、堆栈、故障寄存器及产品固件信息,极大的提升了错误定位的效率及准确性。 俗话说,工欲善其事,必先利其器。所以有时候做事效率低的原因也许是,你会用的工具种类太少。 合作、贡献 :开源软件的发展离不开大家的支持,欢迎大家多提建议,也希望更多的人一起参与进来,共同提高 。如果觉得这个开源项目很赞,可以点击 项目主页 (Github|OSChina) 右上角的 Star ,同时把它推荐给更多有需要的朋友。 2、CmBacktrace 如何使用2.1 演示该演示分如下几个步骤:
2.2 Demo
2.3 移植说明2.3.1 准备工作
2.3.2 配置说明配置文件名:
2.4 API 说明2.4.1 库初始化void cm_backtrace_init(const char *firmware_name, const char *hardware_ver, const char *software_ver)
2.4.2 获取函数调用栈size_t cm_backtrace_call_stack(uint32_t *buffer, size_t size, uint32_t sp)
示例: /* 建立深度为 16 的函数调用栈缓冲区,深度大小不应该超过 CMB_CALL_STACK_MAX_DEPTH(默认16) */ uint32_t call_stack[16] = {0}; size_t i, depth = 0; /* 获取当前环境下的函数调用栈,每个元素将会以 32 位地址形式存储, depth 为函数调用栈实际深度 */ depth = cm_backtrace_call_stack(call_stack, sizeof(call_stack), __get_SP()); /* 输出当前函数调用栈信息 * 注意:查看函数名称及具体行号时,需要使用 addr2line 工具转换 */ for (i = 0; i < depth; i++) { printf("%08x ", call_stack[i]); } 2.4.3 追踪断言错误信息void cm_backtrace_assert(uint32_t sp)
2.4.4 追踪故障错误信息void cm_backtrace_fault(uint32_t fault_handler_lr, uint32_t fault_handler_sp)
该函数可以在故障处理函数(例如: 2.5 常见问题2.5.1 编译出错,提示需要 C99 支持2.5.2 如何查看到函数调用栈中函数的具体名称及代码行号2.5.3 故障处理函数:HardFault_Handler 重复定义在使用了本库提供的 cmb_fault.s 汇编文件时,因为该汇编文件内部已经定义了 HardFault_Handler ,所以如果项目中还有其他地方定义了该函数,则会提示 HardFault_Handler 被重复定义的错误。此时有两种解决方法:
2.6 许可采用 MIT 开源协议,细节请阅读项目中的 LICENSE 文件内容。 |
|