0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于CmBacktrace库,如何快速追踪和定位产生HardFault的原因

jf_pJlTbmA9 来源:AT32 MCU 雅特力科技 作者:AT32 MCU 雅特力科技 2023-10-27 09:51 次阅读

概述

在使用ARM Cortex-M系列MCU时(如AT32 MCU),有时会出现程序运行异常。当通过编译器在debug模式查原因时,会发现程序跑到HardFault_Handler函数中,产生HardFault,即硬件错误。

wKgaomUD5y2AVdTEAADhuODZqcE557.png

图1. HardFault_Handler函数

本文档主要介绍一种基于CmBacktrace库,快速追踪和定位产生HardFault原因的方法。

HardFault产生原因

常见产生HardFault产生的原因大概有如下几类:

数组越界操作;

内存溢出,访问越界;

堆栈溢出,程序跑飞;

中断处理错误。

数组越界

程序中使用了静态数组,而在动态传参时数组赋值溢出。或者动态分配内存太小,导致程序异常。

内存溢出

重点检查RAM区域,程序编译后执行的RAM数据量大小为多少是否可能越界。一般不要设置到极致的情况,程序中的一些动态数组传参时会导致异常。

堆栈溢出

这在使用操作系统的代码中尤其容易发生,在操作系统中,任务的变量均分配放置在任务所申请的堆栈空间中。

例如FreeRTOS中调用xTaskCreate来创建任务,该函数以参数usStackDepth指定任务堆栈的大小,如果指定的堆栈太小,则会堆栈申请不足,进入HardFault。

中断处理异常

程序中开启了某些中断,例如USART,TIMER,RTC等。

但在程序执行中,满足中断条件,但并未能查找到该部分对应的中断服务函数,则可能会出现该异常。

HardFault分析方法

常见的分析方法是:发生异常之后可首先查看LR寄存器中的值,确定当前使用堆栈为MSP或PSP,然后找到相应堆栈的指针,并在内存中查看相应堆栈里的内容。由于异常发生时,内核将R0~R3、R12 Returnaddress、PSR、LR寄存器依次入栈,其中Return address即为发生异常前PC将要执行的下一条指令地址。

但以上方法要求对ARM内核比较熟悉,且操作较为繁琐。

以下重点介绍采用开源库CmBacktrace作为快速分析的方法。

基于CmBacktrace库分析方法

CmBacktrace(Cortex Microcontroller Backtrace)是一款针对ARM Cortex-M系列MCU的错误代码自动追踪、定位,错误原因自动分析的开源库。主要特性如下:

支持的错误包括:

1) 断言(Assert)

2) 故障(Hard Fault, Memory Management Fault, Bus Fault, Usage Fault, Debug Fault)

故障原因自动诊断:可在故障发生时,自动分析出故障的原因,定位发生故障的代码位置,而无需再手动分析繁杂的故障寄存器;

适配Cortex-M0/M3/M4/M7 MCU;

支持IAR、KEIL、GCC编译器;

支持FreeRTOS、UCOSII、UCOSIII、RT-Thread等OS;

基于MDK的CmBacktrace库使用流程

基于MDK的移植方法按如下步骤进行:

步骤一 添加cm_backtrace库文件到MDK中

wKgZomUD5y-AHkFSAAErBsj9Ouo043.png

图2. cm_backtrace库文件夹

把cm_backtrace文件夹复制到我们的工程目录下,并添加至keil工程中。

wKgaomUD5zCALuP9AAGueoRovYQ301.png

图3. 添加cm_backtrace后keil工程目录

步骤二 添加头文件、勾选C99模式

wKgZomUD5zKAftzSAAHqQgMxQpM886.png

图4. Keil中配置C99和头文件

步骤三 编译和调试

首先,cmb_cfg.h文件按以下提示配置修改。

wKgZomUD5zOAa4v6AAIn_tEA-Kk953.png

图5. cmb_cfg.h文件配置

这时候编译有一个错误,这是因为cmb_fault.c与at32f4xx_int.c中的HardFault_Handler函数重复定义:

wKgaomUD5zWASM91AAErJbI8zNg837.png

图6. at32f4xx_it.c编译报错

需要把at32f4xx_int.c中的HardFault_Handler函数屏蔽掉。

wKgaomUD5ziAITdxAADr2mO9OEE201.png

图7. HardFault_Handler函数屏蔽

步骤四 测试与查看

这时候就可以编译通过了。下面测试这个库的功能。

测试函数如下:

wKgZomUD5zmAJkirAAC7ZedBDCg081.png

图8. 编写除零错误函数

然后在主函数中调用cm_backtrace_init();来初始化cm_backtrace,并调用该测试函数:

wKgaomUD5zuAI7sUAAGKUyHDMAk220.png

图9. main函数调用除零错误函数

下载运行程序,PC端接收串口信息

wKgZomUD5z2AClv-AAE-7APsd_4047.png

图10. 串口助手输出错误信息

可以看到,列出了出错原因(除0)和一条命令。运行这个命令需要用到addr2line.exe工具,该工具在tools文件夹中:

wKgZomUD5z-AcZ7hAABo_N11Dt8476.png

图11. 定位addr2line.exe位置

有32bit和64bit两个版本,根据环境选择,并拷贝到keil工程目录下的.axf文件所在的文件夹中,如demo中所附工程,则拷贝到如下目录:

AN0028_SourceCode_V2.0.0utilitiesAN0028_demonon_osmdk_v5objects

wKgaomUD50GAIbOoAAHq8x5DO3g696.png

图12. 拷贝addr2line.exe工具

进入到cmd窗口,转到上述文件夹位置,运行串口助手中的那条命令:

addr2line -e CmBacktrace(此处要依据用户的工程名修改).axf -a -f 080019c6 08001ae9

如demo中工程名为printf,命令则应修改为addr2line -e printf.axf -a -f 080019c6 08001ae9

wKgaomUD50KAHTtNAADcrKdlpOU582.png

图13. 调用CMD运行addr2line.exe工具

可以看到addr2line.exe工具定位出了错误相关的代码行号,查看对应行的代码:

可以看到addr2line.exe工具定位出了错误相关的代码行号,main.c的第60行,fault_test.c的第38行,查看对应行的代码:

wKgZomUD50aADrLgAAIFh2oeM0A554.png

图14. 确认错误代码区域

可见,对应的行号正是出错的地方,使用这个CmBacktrace库能帮助用户有效、快速地定位到HardFault之类的错误。

案例展示

案例一 无OS除零错误

工程位置:AN0028_SourceCode_V2.0.0utilitiesAN0028_demonon_os

测试内容:在裸机上除零错误

案例二 FreeRTOS上除零错误

工程位置:AN0028_SourceCode_V2.0.0utilitiesAN0028_demoosfreertos

测试内容:在FreeROTOS上除零错误,需注意tasks.c中有注释/**/的三处为针对CmBacktrace做出的修改

案例三 USOCⅢ上非对齐访问错误

工程位置:AN0028_SourceCode_V2.0.0utilitiesAN0028_demoosucosiii

测试内容:在UCOSⅢ上非对齐访问错误,需注意os_cfg.h中#define OS_CFG_DBG_EN为1u

来源:AT32 MCU 雅特力科技
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理


审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • mcu
    mcu
    +关注

    关注

    146

    文章

    16017

    浏览量

    343632
  • Cortex
    +关注

    关注

    2

    文章

    194

    浏览量

    45753
  • MDK
    MDK
    +关注

    关注

    4

    文章

    208

    浏览量

    31771
收藏 人收藏

    评论

    相关推荐

    【转载】快速追踪定位产生HardFault原因的方法

    时,会发现程序跑到 HardFault_Handler函数中,产生 HardFault,即硬件错误。 本文档主要介绍一种基于CmBacktrace
    发表于 08-17 09:44

    如何使用STM32HAL去移植CmBacktrace

    CmBacktrace是什么?为什么选择CmBacktraceCmBacktrace如何去使用?如何使用STM32HAL去移植CmBacktra
    发表于 07-01 10:40

    Cortex-M系列MCU错误追踪有何作用

    @2019-02-14【小记】  CmBacktrace: ARM Cortex-M 系列 MCU 错误追踪,用来将单片机故障状态寄存器值翻译出来输出至终端上以便排错CmBacktrace
    发表于 01-25 06:39

    CmBacktrace是什么?主要特性是什么

    (Cortex Microcontroller Backtrace)是一款针对 ARM Cortex-M 系列 MCU 的错误代码自动追踪定位,错误原因自动分析的开源。主要特性如
    发表于 01-25 07:01

    如何快速定位HardFault

    1、背景程序运行,发现程序跑飞到HardFault,但不清楚为什么会跑到HardFault中断处理函数去。2、分析要想知道为什么会跑到HardFault_Handler中去,就很有必要了解一下
    发表于 01-27 06:20

    基于ARM Cortex-M的MCU错误追踪有何功能呢

    基于 ARM Cortex-M系列的 MCU错误追踪,用于帮助开发者解决上述问题。CmBacktrace 的作
    发表于 02-21 06:01

    CmBacktrace打印hardfault信息时提示栈溢出是何原因?如何解决

    一圈没找到原因。再次移植于是又把cmbacktrace的demo移植到裸机和ucosii平台都调通了。这时我就想了下这几个demo的区别,发现调通的这两个平台是用的cmb_fault.s里
    发表于 07-05 11:18

    cmbacktrace里面的HARDFAULT函数如何移植?

    正在移植cmbacktrace,里面的HARDFAULT函数不知道如何移植。 原工程context_rvds.S文件中的HardFault cmd_fault.S 文件中的HardFault
    发表于 08-20 17:17

    产生HardFault原因HardFault的分析方法

    这篇应用笔记描述了怎么使用CmBacktrace快速追踪定位产生
    发表于 10-24 06:54

    专治MCU各种HardFault问题的开源库

    的错误代码自动追踪定位,错误原因自动分析的开源库。主要特性如下: 1. 支持的错误包括 断言(assert) 故障(Hard Fault, Memory Management Fault, Bus Fa
    的头像 发表于 03-10 11:49 1938次阅读

    一点理解之 CmBacktrace: ARM Cortex-M 系列 MCU 错误追踪

    一点理解之 CmBacktrace: ARM Cortex-M 系列 MCU 错误追踪
    发表于 11-30 19:51 10次下载
    一点理解之 <b class='flag-5'>CmBacktrace</b>: ARM Cortex-M 系列 MCU 错误<b class='flag-5'>追踪</b>库

    库 keil 编译很慢_CmBacktrace: ARM CortexM 系列 MCU 错误追踪

    (Cortex Microcontroller Backtrace)是一款针对 ARM Cortex-M 系列 MCU 的错误代码自动追踪定位,错误原因自动分析的开源库。主要特性如下:支持的错...
    发表于 11-30 19:51 8次下载
    库 keil 编译很慢_<b class='flag-5'>CmBacktrace</b>: ARM CortexM 系列 MCU 错误<b class='flag-5'>追踪</b>库

    ARM Cortex-M 系列 MCU 错误追踪库 --- CmBacktrace

    一、CmBacktrace简介一款针对 ARM Cortex-M 系列 MCU 的错误代码自动追踪定位,错误原因自动分析的开源库。主要特性如下:支持的错误包括:断言(assert)故
    发表于 11-30 20:21 0次下载
    ARM Cortex-M 系列 MCU 错误<b class='flag-5'>追踪</b>库 --- <b class='flag-5'>CmBacktrace</b>

    专治MCU各种 HardFault 的库:CmBacktrace(错误追踪库)

    相信有不少读者都遇到过 “HardFault” 的问题,而且不止一次,有时候可能因为它连续几日加班,甚至通宵。那么今天就来分享一个由armink(也就是现在RTT里面的那位朱大神)整理的开源库,借花献佛分享给大家。
    发表于 02-08 17:01 0次下载
    专治MCU各种 <b class='flag-5'>HardFault</b> 的库:<b class='flag-5'>CmBacktrace</b>(错误<b class='flag-5'>追踪</b>库)

    AT32讲堂009 | 基于CmBacktrace库,如何快速追踪定位产生HardFault原因

    HardFault,即硬件错误。图1.HardFault_Handler函数本文档主要介绍一种基于CmBacktrace库,快速追踪
    的头像 发表于 06-15 10:44 2606次阅读
    AT32讲堂009 | 基于<b class='flag-5'>CmBacktrace</b>库,如何<b class='flag-5'>快速</b><b class='flag-5'>追踪</b>和<b class='flag-5'>定位</b><b class='flag-5'>产生</b><b class='flag-5'>HardFault</b>的<b class='flag-5'>原因</b>