RM新时代网站-首页

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

基于CmBacktrace庫,如何快速追蹤和定位產生HardFault的原因

jf_pJlTbmA9 ? 來源:AT32 MCU 雅特力科技 ? 作者:AT32 MCU 雅特力科技 ? 2023-10-27 09:51 ? 次閱讀

概述

在使用ARM Cortex-M系列MCU時(如AT32 MCU),有時會出現程序運行異常。當通過編譯器在debug模式查原因時,會發(fā)現程序跑到HardFault_Handler函數中,產生HardFault,即硬件錯誤。

wKgaomUD5y2AVdTEAADhuODZqcE557.png

圖1. HardFault_Handler函數

本文檔主要介紹一種基于CmBacktrace庫,快速追蹤和定位產生HardFault原因的方法。

HardFault產生原因

常見產生HardFault產生的原因大概有如下幾類:

數組越界操作;

內存溢出,訪問越界;

堆棧溢出,程序跑飛;

中斷處理錯誤。

數組越界

程序中使用了靜態(tài)數組,而在動態(tài)傳參時數組賦值溢出?;蛘邉討B(tài)分配內存太小,導致程序異常。

內存溢出

重點檢查RAM區(qū)域,程序編譯后執(zhí)行的RAM數據量大小為多少是否可能越界。一般不要設置到極致的情況,程序中的一些動態(tài)數組傳參時會導致異常。

堆棧溢出

這在使用操作系統的代碼中尤其容易發(fā)生,在操作系統中,任務的變量均分配放置在任務所申請的堆??臻g中。

例如FreeRTOS中調用xTaskCreate來創(chuàng)建任務,該函數以參數usStackDepth指定任務堆棧的大小,如果指定的堆棧太小,則會堆棧申請不足,進入HardFault。

中斷處理異常

程序中開啟了某些中斷,例如USART,TIMER,RTC等。

但在程序執(zhí)行中,滿足中斷條件,但并未能查找到該部分對應的中斷服務函數,則可能會出現該異常。

HardFault分析方法

常見的分析方法是:發(fā)生異常之后可首先查看LR寄存器中的值,確定當前使用堆棧為MSP或PSP,然后找到相應堆棧的指針,并在內存中查看相應堆棧里的內容。由于異常發(fā)生時,內核將R0~R3、R12 Returnaddress、PSR、LR寄存器依次入棧,其中Return address即為發(fā)生異常前PC將要執(zhí)行的下一條指令地址。

但以上方法要求對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)

故障原因自動診斷:可在故障發(fā)生時,自動分析出故障的原因,定位發(fā)生故障的代碼位置,而無需再手動分析繁雜的故障寄存器;

適配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兩個版本,根據環(huán)境選擇,并拷貝到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. 確認錯誤代碼區(qū)域

可見,對應的行號正是出錯的地方,使用這個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 雅特力科技
免責聲明:本文為轉載文章,轉載此文目的在于傳遞更多信息,版權歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權問題,請聯系小編進行處理


審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯系本站處理。 舉報投訴
  • mcu
    mcu
    +關注

    關注

    146

    文章

    17123

    瀏覽量

    350975
  • Cortex
    +關注

    關注

    2

    文章

    202

    瀏覽量

    46482
  • MDK
    MDK
    +關注

    關注

    4

    文章

    209

    瀏覽量

    32063
收藏 人收藏

    評論

    相關推薦

    【轉載】快速追蹤定位產生HardFault原因的方法

    時,會發(fā)現程序跑到 HardFault_Handler函數中,產生 HardFault,即硬件錯誤。 本文檔主要介紹一種基于CmBacktrace
    發(fā)表于 08-17 09:44

    Cortex-M系列MCU錯誤追蹤有何作用

    @2019-02-14【小記】  CmBacktrace: ARM Cortex-M 系列 MCU 錯誤追蹤,用來將單片機故障狀態(tài)寄存器值翻譯出來輸出至終端上以便排錯CmBacktrace
    發(fā)表于 01-25 06:39

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

    (Cortex Microcontroller Backtrace)是一款針對 ARM Cortex-M 系列 MCU 的錯誤代碼自動追蹤定位,錯誤原因自動分析的開源。主要特性如
    發(fā)表于 01-25 07:01

    如何快速定位HardFault

    1、背景程序運行,發(fā)現程序跑飛到HardFault,但不清楚為什么會跑到HardFault中斷處理函數去。2、分析要想知道為什么會跑到HardFault_Handler中去,就很有必要了解一下
    發(fā)表于 01-27 06:20

    基于ARM Cortex-M的MCU錯誤追蹤有何功能呢

    基于 ARM Cortex-M系列的 MCU錯誤追蹤,用于幫助開發(fā)者解決上述問題。CmBacktrace 的作
    發(fā)表于 02-21 06:01

    CmBacktrace打印hardfault信息時提示棧溢出是何原因?如何解決

    一圈沒找到原因。再次移植于是又把cmbacktrace的demo移植到裸機和ucosii平臺都調通了。這時我就想了下這幾個demo的區(qū)別,發(fā)現調通的這兩個平臺是用的cmb_fault.s里
    發(fā)表于 07-05 11:18

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

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

    產生HardFault原因,HardFault的分析方法

    這篇應用筆記描述了怎么使用CmBacktrace快速追蹤定位產生
    發(fā)表于 10-24 06:54

    專治MCU各種HardFault問題的開源

    的錯誤代碼自動追蹤、定位,錯誤原因自動分析的開源。主要特性如下: 1. 支持的錯誤包括 斷言(assert) 故障(Hard Fault, Memory Management Fa
    的頭像 發(fā)表于 03-10 11:49 ?2185次閱讀

    一點理解之 CmBacktrace: ARM Cortex-M 系列 MCU 錯誤追蹤

    一點理解之 CmBacktrace: ARM Cortex-M 系列 MCU 錯誤追蹤
    發(fā)表于 11-30 19:51 ?10次下載
    一點理解之 <b class='flag-5'>CmBacktrace</b>: ARM Cortex-M 系列 MCU 錯誤<b class='flag-5'>追蹤</b><b class='flag-5'>庫</b>

    keil 編譯很慢_CmBacktrace: ARM CortexM 系列 MCU 錯誤追蹤

    (Cortex Microcontroller Backtrace)是一款針對 ARM Cortex-M 系列 MCU 的錯誤代碼自動追蹤定位,錯誤原因自動分析的開源。主要特性如
    發(fā)表于 11-30 19:51 ?8次下載
    <b class='flag-5'>庫</b> keil 編譯很慢_<b class='flag-5'>CmBacktrace</b>: ARM CortexM 系列 MCU 錯誤<b class='flag-5'>追蹤</b><b class='flag-5'>庫</b>

    ARM Cortex-M 系列 MCU錯誤代碼自動追蹤(CmBacktrace)的使用經驗分享

    停止運行,程序會跑到 HardFault_Handler函數中,產生 HardFault,即硬錯。其產生原因大概有如下幾類:(1)數組越界
    發(fā)表于 11-30 20:21 ?0次下載
    ARM Cortex-M 系列 MCU錯誤代碼自動<b class='flag-5'>追蹤</b><b class='flag-5'>庫</b>(<b class='flag-5'>CmBacktrace</b>)的使用經驗分享

    ARM Cortex-M 系列 MCU 錯誤追蹤 --- CmBacktrace

    一、CmBacktrace簡介一款針對 ARM Cortex-M 系列 MCU 的錯誤代碼自動追蹤、定位,錯誤原因自動分析的開源。主要特性
    發(fā)表于 11-30 20:21 ?0次下載
    ARM Cortex-M 系列 MCU 錯誤<b class='flag-5'>追蹤</b><b class='flag-5'>庫</b> --- <b class='flag-5'>CmBacktrace</b>

    專治MCU各種 HardFaultCmBacktrace(錯誤追蹤

    相信有不少讀者都遇到過 “HardFault” 的問題,而且不止一次,有時候可能因為它連續(xù)幾日加班,甚至通宵。那么今天就來分享一個由armink(也就是現在RTT里面的那位朱大神)整理的開源,借花獻佛分享給大家。
    發(fā)表于 02-08 17:01 ?0次下載
    專治MCU各種 <b class='flag-5'>HardFault</b> 的<b class='flag-5'>庫</b>:<b class='flag-5'>CmBacktrace</b>(錯誤<b class='flag-5'>追蹤</b><b class='flag-5'>庫</b>)

    AT32講堂009 | 基于CmBacktrace,如何快速追蹤定位產生HardFault原因

    HardFault,即硬件錯誤。圖1.HardFault_Handler函數本文檔主要介紹一種基于CmBacktrace,快速
    的頭像 發(fā)表于 06-15 10:44 ?3852次閱讀
    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'>產生</b><b class='flag-5'>HardFault</b>的<b class='flag-5'>原因</b>
    RM新时代网站-首页