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

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

3天内不再提示

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

雅特力 AT32 MCU 2022-06-15 10:44 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

概述

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

图1. HardFault_Handler函数

7dc45b7c-e6f7-11ec-aa96-dac502259ad0.png

本文档主要介绍一种基于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中

图2. cm_backtrace库文件夹

7df7f1d0-e6f7-11ec-aa96-dac502259ad0.png

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

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

7e294604-e6f7-11ec-aa96-dac502259ad0.png

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

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

7e554998-e6f7-11ec-aa96-dac502259ad0.png

步骤三 编译和调试

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

图5. cmb_cfg.h文件配置

7eb24972-e6f7-11ec-aa96-dac502259ad0.png

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

图6. at32f4xx_it.c编译报错

7ee724a8-e6f7-11ec-aa96-dac502259ad0.png

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

图7. HardFault_Handler函数屏蔽

7f3febba-e6f7-11ec-aa96-dac502259ad0.png

步骤四 测试与查看

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

测试函数如下:

图8. 编写除零错误函数

7f5c8a7c-e6f7-11ec-aa96-dac502259ad0.png

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

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

7f89afc0-e6f7-11ec-aa96-dac502259ad0.png

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

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

7fb45a54-e6f7-11ec-aa96-dac502259ad0.png

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

图11. 定位addr2line.exe位置

7fe6473a-e6f7-11ec-aa96-dac502259ad0.png

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

AN0028_SourceCode_V2.0.0\utilities\AN0028_demo\non_os\mdk_v5\objects

图12. 拷贝addr2line.exe工具

7fff5964-e6f7-11ec-aa96-dac502259ad0.png

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

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

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

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

800b4f6c-e6f7-11ec-aa96-dac502259ad0.png

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

图14. 确认错误代码区域

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

801f3ec8-e6f7-11ec-aa96-dac502259ad0.png

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

案例展示

案例一 无OS除零错误

工程位置:AN0028_SourceCode_V2.0.0\utilities\AN0028_demo\non_os

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

案例二 FreeRTOS上除零错误

工程位置:AN0028_SourceCode_V2.0.0\utilities\AN0028_demo\os\freertos

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

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

工程位置:AN0028_SourceCode_V2.0.0\utilities\AN0028_demo\os\ucosiii

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

关于雅特力雅特力科技于2016年成立,是一家致力于推动全球市场32位微控制器(MCU)创新趋势的芯片设计公司,专注于ARM Cortex-M4/M0+的32位微控制器研发与创新,全系列采用55nm先进工艺及ARM Cortex-M4高效能或M0+低功耗内核,缔造M4业界最高主频288MHz运算效能,并支持工业级别芯片工作温度范围(-40°~105°)。雅特力目前已累积相当多元的终端产品成功案例:如微型打印机、扫地机、光流无人机、热成像仪、激光雷达、工业缝纫机、伺服驱控、电竞周边市场、断路器、ADAS、T-BOX、数字电源、电动工具等终端设备应用,广泛地覆盖5G物联网、消费、商务及工控等领域。

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

    关注

    147

    文章

    19129

    浏览量

    404005
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    PCBA加工中产生不良的原因有哪些?

    PCBA加工中产生不良的原因有哪些? 随着电子制造业的不断发展,PCBA加工服务已经成为主流的生产方式。然而,在实际生产过程中,不良品的出现是无法完全避免的。不良品不仅影响生产效率,更直
    发表于 04-03 09:40

    pcba板短路怎么快速检出原因

      PCBA板短路快速排查方法 PCBA板短路是电子制造中常见且影响严重的故障,需通过系统化流程快速定位原因。以下是分步骤的排查方案: 一、初步检查与现象确认 目视检查 重点区域 :电
    的头像 发表于 03-05 11:09 368次阅读

    色差是什么?它产生原因是什么?

    色像差(简称色差)。色差产生原因色差产生的根本原因就是由于光的色散效应。白光是由不同波长的可见光组成的,例如红色的光波长为620-750纳米,蓝色的波长为450
    的头像 发表于 01-27 17:19 1073次阅读
    色差是什么?它<b class='flag-5'>产生</b>的<b class='flag-5'>原因</b>是什么?

    SL3160HB GPS 定位器专用芯片:150V 宽压 + 1.8A 输出,车载 / 户外定位稳定供电核心

    ,小封装便于隐藏安装。 共享设备定位器:适配共享电动车、共享充电宝、共享雨伞的定位模块,宽压兼容设备内置电池与充电电源,快速启动确保设备启用时即时定位,多重保护降低户外使用故障率。 微
    发表于 12-18 17:28

    室内蓝牙定位追踪技术:从典型场景到技术局限性与优化方向详解(二)

    蓝牙定位技术利用RSSI或AoA/AoD实现高精度室内定位,广泛应用于工业、仓储、楼宇及资产管理中,支持人员与设备实时追踪。虽存在环境干扰与距离限制,但通过多基站融合、AI算法优化及多技术协同,正迈向更高精度与更广覆盖的未来发展
    的头像 发表于 12-18 17:00 1367次阅读

    蓝牙定位追踪技术:从技术原理、核心优势详解(一)

    蓝牙定位追踪技术利用RSSI或AoA/AoD,通过信标、网关或多天线阵列实现室内精准定位,具备低功耗、低成本、易部署、抗干扰强等优势,广泛应用于工业、仓储、楼宇等场景的人员与资产管理。
    的头像 发表于 12-17 14:30 948次阅读

    雅特力AT32 MCU推动低空经济发展

    雅特力AT32系列MCU凭借288MHz主频与高精度外设,为无人机飞控、电调及云台提供核心算力支持,实现厘米级定位与高效动力控制,显著提升在电力巡检、农林植保等低空经济场景下的作业精度与可靠性,助力产业智能化升级。
    的头像 发表于 12-04 09:53 1896次阅读
    雅特力<b class='flag-5'>AT32</b> MCU推动低空经济发展

    MCU调试典型问题与解决方法

    ;CFSR(故障状态寄存器)、SCB->HFSR、SCB->MMFAR(内存管理地址)。 使用ARM Cortex-M的故障诊断(如CmBacktrace)自动定位崩溃代码行。
    发表于 11-17 07:57

    LuatOS下GNSS定位开发实战:初识定位、NMEA解码与位置追踪上报

    在LuatOS环境中进行GNSS定位开发,是许多物联网项目的基础需求。本指南旨在提供一份实战向导,带您经历从GNSS定位的初始化设置,到对NMEA标准数据的解码解析,再到将追踪到的实时位置数据上报
    的头像 发表于 10-29 16:03 463次阅读
    LuatOS下GNSS<b class='flag-5'>定位</b>开发实战:初识<b class='flag-5'>定位</b>、NMEA解码与位置<b class='flag-5'>追踪</b>上报

    Cortex-M0+处理器的HardFault错误介绍

    在ARM处理器中,如果一个程序产生了错误并且被处理器检测到,就会产生错误异常。Cortex-M0+处理器只有一种异常用以处理错误:HardFault
    的头像 发表于 10-14 10:50 3648次阅读
    Cortex-M0+处理器的<b class='flag-5'>HardFault</b>错误介绍

    使用RT-Thread Studio在程序进Hardfault时怎么方便的查看调用栈?

    求助各位大神 使用RT-Thread Studio在程序进Hardfault时怎么方便的查看调用栈 使用MDK的时候可以方便的看调用堆栈,从而很快速的找到问题,使用RT-Thread Studio该如何快速找到问题呢
    发表于 10-10 06:54

    简化定位,从exgnss扩展开始:GNSS开发从此“轻装上阵”

    面对GNSS定位开发的重重挑战,exgnss扩展为你减负!它整合了核心算法与硬件适配,开发者无需重复造轮子,即可快速构建稳定、低功耗的定位应用。
    的头像 发表于 09-16 17:43 933次阅读
    简化<b class='flag-5'>定位</b>,从exgnss扩展<b class='flag-5'>库</b>开始:GNSS开发从此“轻装上阵”

    线程超时函数中 assert 失败是什么原因导致的?

    定位后,发现在调用栈中经常会同时出现两个中断,一个串口中断和systick 中断,就挺奇怪的,这是定时器中断被别的中断打断了吗? rt_sched_lock 的作用似乎就是关闭全局中断吧。。。 请问可能是什么原因? 谢谢! rt-thread 版本: 5.2.1
    发表于 09-09 06:56

    AT32 IAP using the USART

    的中断向量表相应的移动,移动的偏移量为x AT32 USART IAP 快速使用方法 硬件资源 文档中是用 AT-START-AT32F403A 实验板的硬件条件为例,IAP demo 源代码还包括
    发表于 07-11 10:51

    GPS定位器供电DCDC降压恒压芯片H6217L 低功耗 峰值电流大60V 80V 90V100V

    下的安全性和可靠性。 应用领域 定位追踪设备:特别适用于 GPS 定位器,为其提供稳定的电源,确保定位器在各种环境下能准确工作,广泛应用于车辆追踪
    发表于 06-20 09:22