一、CmBacktrace特性
CmBacktrace 是一款针对 ARM Cortex-M 系列 MCU 的错误代码自动追踪、定位,错误原因自动分析的开源库。
支持的错误包括:
断言(assert)
故障(Hard Fault, Memory Management Fault, Bus Fault, Usage Fault, Debug Fault)
故障原因 自动诊断 :可在故障发生时,自动分析出故障的原因,定位发生故障的代码位置,而无需再手动分析繁杂的故障寄存器;
支持 裸机 及以下操作系统平台:
UCOS
FreeRTOS(需修改源码)
故障诊断信息支持多国语言(目前:简体中文、英文);
适配 Cortex-M0/M3/M4/M7 MCU;
支持 IAR、KEIL、GCC 编译器;
CmBacktrace 源码下载地址:https://github.com/armink/CmBacktrace
二、移植步骤
从下载的源码中将cm_backtrace文件夹复制到已有的工程目录下,在Keil工程中添加cmbacktrace目录,并将cm_backtrace.c和cmb_fault.S添加到cmbacktrace目录线下;记住要勾选C99模式。
![](https://img-blog.csdnimg.cn/img_convert/9b1e9ea312cf2e3367ec6b8418e9c4bc.png)
![](https://img-blog.csdnimg.cn/img_convert/63fac7d0615979436ad04d332b5d42c7.png)
上述操作完成后执行编译会报错,此时需要修改cmb_cfg.h文件内的相关配置,修改后的配置如下:
![](https://img-blog.csdnimg.cn/img_convert/e1f2b46e42485003ee8e2631c85d499e.png)
再次编译还产生一个error,这是因为cmb_fault.c与.S中的HardFault_Handler函数重定义了,此时将context_rvds.S修改如下:
![](https://img-blog.csdnimg.cn/img_convert/a72981e5b09557d72ab3ac46ddad52a7.png)
上述修改全部完成后编译OK。
编译OK后,将CmBacktrace源码目录下的tools文件夹的addr2line.exe工具拷贝到工程的可执行文件所在目录下。
![](https://img-blog.csdnimg.cn/img_convert/138b539ff87e378346b1be2d062c83bf.png)
三、代码测试
cmbacktrace初始化:
![](https://img-blog.csdnimg.cn/img_convert/8b9e14d2ae2e768142c0091e297820d8.png)
上图红色框中的字符串为工程可执行文件名;
![](https://img-blog.csdnimg.cn/img_convert/2dd3d92ae4d4e886eed29c4b8d765be9.png)
下面编写一个测试函数进行测试:
![](https://img-blog.csdnimg.cn/img_convert/30bafc7f4369836df1b8df3e495d80b0.png)
运行代码后程序发生崩溃,打印串口输出如下:
![](https://img-blog.csdnimg.cn/img_convert/1b04e43bb68f6490ac8330cb828c7afc.png)
进入到工程的可执行文件所在目录,按住键盘Shift+鼠标右键,打开Powershell窗口;
![](https://img-blog.csdnimg.cn/img_convert/ae9572b97b29e6910a20bc0219d90509.png)
复制串口输出窗口的红色框内容,粘贴到Powershell的命令行中(注意win10系统要在命令行先输入.\),然后回车。
![](https://img-blog.csdnimg.cn/img_convert/5e0eb6f25dc602ed3da3b9556ef2ba9d.png)
从命令行输出Log可以看出,是fault_test_by_div0这个函数发生了错误,并且错误出现在bll_4gcat1.c第653行。
通过以上方法可以发现,使用CmBacktrace 库能帮助我们有效、快速地定位到HardFault之类的错误,提高代码开发效率。