介绍我们在使用STM32单片机的时候,经常会遇到程序跑飞,hard_fulat等错误,而定位错误的时候,我们使用的方法往往是连接到仿真器通过逐步调试,定位到具体的错误代码,进而猜测、排除、推敲错误原因。这样的过程是非常痛苦的,而且在实际情况下,很多产品都必须在真机上调试断开模拟器或者说,问题确实存在,但是极难发生,所以基于这样的问题背景RTT的领导者armink开发了基于ARMCortex-M系列的MCU错误跟踪库,帮助开发者解决上述问题。CmBacktrace的功能及适用平台首先,CmBacktrace是一个用于ARMCortex-M系列MCU的错误代码自动跟踪、定位、自动分析的开源库。它支持的错误包括:断言(assert)失败HardFault,MemoryManagementFault,BusFault,UsageFault,DebugFaultSupportbaremetal及以下操作系统平台:RT-ThreadUCOSFreeRTOS适配Cortex-M0/M3/M7MCU,支持IAR,KEIL,GCC编译器,可以达到的效果有:故障原因自动诊断,故障原因自动分析,故障代码定位,错误处函数调用栈输出。笔者目前使用的平台是keil5,使用的控制器是STM32F103。我们准备一个带有串口功能的工程。工程结构如下:image-20210306101326283接下来我们看一下cm_backtrace的源码:image-20210306101659128上面源码存放在cm_backtrace文件夹中,我们需要将其全部复制到我们的工程目录下,demos是一个使用示例,分为带操作系统和不带操作系统两种,然后是toolsstore是一个使用命令行来分析代码错误的工具。将相关文件复制到工程目录后,工程目录下的文件如下:image-20210306102410525然后,我们将相关文件添加到工程中。下面是添加后续工程文件:image-20210306102815766同时要添加相关的头文件路径。添加的头文件路径如下:image-20210306102919999至此,cm_backtrace的源码已经添加完毕,我们来编译一下。编译结果如下:image-20210306103031890可以发现有很多错误,这是因为我们相关的宏没有打开,我们按照源码中的一张表依次打开cmb_def.h中对应的宏,表如下:配置名称功能备注cmb_println(…)必须配置错误和诊断信息输出CMB_USING_BARE_METAL_PLATFORM如果在裸机平台上使用,定义该宏CMB_USING_OS_PLATFORM无论是在操作系统平台上使用操作系统还是裸机必须选择其一CMB_OS_PLATFORM_TYPE操作系统平台RTT/UCOSII/UCOSIII/FREERTOSCMB_CPU_PLATFORM_TYPECPU平台M0/M3/M4/M7CMB_USING_DUMP_STACK_INFO是否使用Dumpstack功能,定义这个宏CMB_PRINT_LANGUAGE输出信息时的语言CHINESE/ENGLISH修改后的代码如下:image-20210306103649154Change添加宏后,我们重新编译代码,编译成功结果如下:image-20210306103729814提示开启c99编译模式,我们在keil中设置,设置方法如下:image-20210306103831859继续编译,看到又出现了一个错误信息。编译结果如下:image-20210306104005145这是因为在cmb_fault.S中汇编中定义了HardFault_Handler函数,而在原工程stm32f10x_it.c中已经定义了HardFault_Handler,我们将stm32f10x_it.c中的HardFault_Handler注释掉,代码如下:image-20210306104326301编译后可以通过测试。我们在main函数中添加如下代码:#include"stm32f10x.h"#include"bsp_usart.h"#include
