CN / EN
CN / EN

写技术文章

CmBacktrace | 基于GR5515移植hardfault追踪库

best

2023-07-18 14:55:48

开源项目CmBacktrace 是一款针对 ARM Cortex-M 系列 MCU 的错误代码自动追踪、定位,错误原因自动分析的开源库,作者armink。

目前 CmBacktrace支持以下功能:

  • 支持断言(assert)和故障(Hard Fault)
  • 故障原因自动诊断
  • 输出错误现场的 函数调用栈
  • 适配 Cortex-M0/M3/M4/M7 MCU;
  • 支持 IAR、KEIL、GCC 编译器;
  • 代码下载地址: https://github.com/armink/CmBacktrace

参考博客: https://blog.csdn.net/Mculover666/article/details/106373147


本文主要介绍基于GR5515 freertos工程移植CmBacktrace。

1.将cm_backtrace.c相关代码添加到工程中;

2.在interrupt_gr55xx.c中 修改 HardFault_Handler 函数,异常时跳转到cm_backtrace_fault 执行;

SECTION_RAM_CODE __asm void HardFault_Handler (void) 
{
 
    IMPORT cm_backtrace_fault
 
    MOV     r0, lr                  ; get lr
    MOV     r1, sp                  ; get stack pointer (current is MSP)
    BL      cm_backtrace_fault
 
Fault_Loop
    BL      Fault_Loop              ;while(1)
    ENDP
 
    END
}

3.CmBacktrace的配置文件在cmb_cfg.h,针对不同的平台和场景,需要自行手动配置:

4.本文是基于SDK freertos 工程移植的,配置如下:

5.不同平台存在差异性,在 cmb_def.h 需要根据flash_scatter_common.sct文件字段设置CMB_CSTACK_BLOCK_NAME CMB_CODE_SECTION_NAME

6.在cm_breaktrace.c,根据statup_gr55xx.s 中stack设置 CSTACK_BLOCK_START CSTACK_BLOCK_END

如若该字段配置错误的情况下,编译会有warning提示,以及初始化报错

7.由于需要用到串口打印,cm_backtrace_fault.c 最后加入串口缓冲app_log_flush();

image.png

至此,CmBacktrace移植、配置已全部完成。


下面看看该如何应用和测试这个模块。

1.使用CmBacktrace使用时包含头文件:

#include "cm_backtrace.h"

2. 初始化CmBacktrace

void cm_backtrace_init(const char *firmware_name, const char *hardware_ver, const char *software_ver);

API 用来初始化CmBacktrace,其中传入的参数分别为:

firmware_name:固件名称,需与编译器生成的固件名称对应;
hardware_ver:固件对应的硬件版本号;
software_ver:固件的软件版本号;
这三个参数用宏定义的方式,会比较方便:
 
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
#define APPNAME                        "ble_app_template_freertos"
#define HARDWARE_VERSION               "V1.0.0"
#define SOFTWARE_VERSION               "V0.0.1"

3.在main函数中初始化CmBacktrace

/* USER CODE BEGIN 2 */
printf("CmBacktrace Test...\r\n");
cm_backtrace_init(APPNAME, HARDWARE_VERSION, SOFTWARE_VERSION);

4.定义一个除0错误的函数:

/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
void fault_test_by_div0(void)
{
    volatile int * SCB_CCR = (volatile int *) 0xE000ED14; // SCB->CCR
    int x, y, z;
 
    *SCB_CCR |= (1 << 4); /* bit4: DIV_0_TRP. */
 
    x = 10;
    y = 0;
    z = x / y;
    printf("z:%d\n", z);
}

5.在并在print_test_task中 调用执行此函数:


fault_test_by_div0();

6.编译,下载运行,在串口助手中查看结果:

查看进一步的信息,需要使用addr2line工具,此工具在cmbacktrace的源码中,按照你的电脑选择32位的或者64位选择,并将此复制到对应ble_app_template_freertos.axf文件夹中;打开cmd命令行,进入axf所在目录,执行串口中提示的命令:

可以从addr2line 结果看到,该错误是 divide by zero,调用函数层级是 fault_test_by_div0 <-- print_test_task

2收藏

2赞成

1条评论
您的评论
我们时刻倾听您的声音
联系销售

扫描关注公众号

打开微信,使用“扫一扫”即可关注