当前位置: 首页 > 科技观察

Keil环境下如何使用Cm_Backtrace进行STM32错误跟踪

时间:2023-03-14 17:56:01 科技观察

介绍我们在使用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#defineHARDWARE_VERSION"V1.0.0"#defineSOFTWARE_VERSION"V0.1.0"externvoidfault_test_by_div0(void);/***@briefmainfunction*@paramnone*@retvalnone*/intmain(void){/*初始化USART配置模式为1152008-N-1,中断接收*/USART_Config();/*CmBacktraceinitialize*/cm_backtrace_init("CmBacktrace",HARDWARE_VERSION,SOFTWARE_VERSION);fault_test_by_div0();while(1){}}将程序烧入单片机,通过串口调试助手查看输出信息:image-20210306105316179我们可以看到输出信息显示当前使用错误为:Attempttodivideby0,并给出了相关的寄存器信息,但是还是不知道错误在哪一行代码,这时候就需要使用tools下的工具上面提到的文件夹,addr2line工具。使用该工具时,需要知道当前工具输出的可执行文件的名称。我们打开keil,信息如下:image-20210306105719377然后,我们找到cm_backtrace文件夹下的tools工具,复制到USART.axf所在目录,复制后的文件夹目录如下:image-20210306110017993打开当前文件夹下的cmd窗口,然后运行addr2line-eUSART.axf-a-f080018440800189a,这里是打开cmd的方法,按住Shift键,然后右键打开Powershell镜像-20210306110527928打开的Powershell如下,在Powershell中输入startcmd打开cmd窗口,然后在cmd窗口中输入addr2line-eUSART.axf-a-f080018440800189a,结果如下图所示:-20210306110839097,可以看到报错信息是fault_test.c的第38行,我们打开源码查看:image-20210306111229605,可以看到确实是第38行,问题分析是正确的。总结以上就是本期分享的全部内容。工欲善其事,必先利其器,这句话还是很有道理的。学习使用各种分析工具也可以加快我们的开发进度,帮助我们更好更快的解决问题。