一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

jf_pJlTbmA9 ? 來源:AT32 MCU 雅特力科技 ? 作者:AT32 MCU 雅特力科技 ? 2023-10-27 09:51 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

概述

在使用ARM Cortex-M系列MCU時(shí)(如AT32 MCU),有時(shí)會(huì)出現(xiàn)程序運(yùn)行異常。當(dāng)通過編譯器在debug模式查原因時(shí),會(huì)發(fā)現(xiàn)程序跑到HardFault_Handler函數(shù)中,產(chǎn)生HardFault,即硬件錯(cuò)誤。

wKgaomUD5y2AVdTEAADhuODZqcE557.png

圖1. HardFault_Handler函數(shù)

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

HardFault產(chǎn)生原因

常見產(chǎn)生HardFault產(chǎn)生的原因大概有如下幾類:

數(shù)組越界操作;

內(nèi)存溢出,訪問越界;

堆棧溢出,程序跑飛;

中斷處理錯(cuò)誤。

數(shù)組越界

程序中使用了靜態(tài)數(shù)組,而在動(dòng)態(tài)傳參時(shí)數(shù)組賦值溢出。或者動(dòng)態(tài)分配內(nèi)存太小,導(dǎo)致程序異常。

內(nèi)存溢出

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

堆棧溢出

這在使用操作系統(tǒng)的代碼中尤其容易發(fā)生,在操作系統(tǒng)中,任務(wù)的變量均分配放置在任務(wù)所申請(qǐng)的堆棧空間中。

例如FreeRTOS中調(diào)用xTaskCreate來創(chuàng)建任務(wù),該函數(shù)以參數(shù)usStackDepth指定任務(wù)堆棧的大小,如果指定的堆棧太小,則會(huì)堆棧申請(qǐng)不足,進(jìn)入HardFault。

中斷處理異常

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

但在程序執(zhí)行中,滿足中斷條件,但并未能查找到該部分對(duì)應(yīng)的中斷服務(wù)函數(shù),則可能會(huì)出現(xiàn)該異常。

HardFault分析方法

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

但以上方法要求對(duì)ARM內(nèi)核比較熟悉,且操作較為繁瑣。

以下重點(diǎn)介紹采用開源庫CmBacktrace作為快速分析的方法。

基于CmBacktrace庫分析方法

CmBacktrace(Cortex Microcontroller Backtrace)是一款針對(duì)ARM Cortex-M系列MCU的錯(cuò)誤代碼自動(dòng)追蹤、定位,錯(cuò)誤原因自動(dòng)分析的開源庫。主要特性如下:

支持的錯(cuò)誤包括:

1) 斷言(Assert)

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

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

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

支持IAR、KEIL、GCC編譯器;

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

基于MDK的CmBacktrace庫使用流程

基于MDK的移植方法按如下步驟進(jìn)行:

步驟一 添加cm_backtrace庫文件到MDK中

wKgZomUD5y-AHkFSAAErBsj9Ouo043.png

圖2. cm_backtrace庫文件夾

把cm_backtrace文件夾復(fù)制到我們的工程目錄下,并添加至keil工程中。

wKgaomUD5zCALuP9AAGueoRovYQ301.png

圖3. 添加cm_backtrace后keil工程目錄

步驟二 添加頭文件、勾選C99模式

wKgZomUD5zKAftzSAAHqQgMxQpM886.png

圖4. Keil中配置C99和頭文件

步驟三 編譯和調(diào)試

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

wKgZomUD5zOAa4v6AAIn_tEA-Kk953.png

圖5. cmb_cfg.h文件配置

這時(shí)候編譯有一個(gè)錯(cuò)誤,這是因?yàn)閏mb_fault.c與at32f4xx_int.c中的HardFault_Handler函數(shù)重復(fù)定義:

wKgaomUD5zWASM91AAErJbI8zNg837.png

圖6. at32f4xx_it.c編譯報(bào)錯(cuò)

需要把a(bǔ)t32f4xx_int.c中的HardFault_Handler函數(shù)屏蔽掉。

wKgaomUD5ziAITdxAADr2mO9OEE201.png

圖7. HardFault_Handler函數(shù)屏蔽

步驟四 測(cè)試與查看

這時(shí)候就可以編譯通過了。下面測(cè)試這個(gè)庫的功能。

測(cè)試函數(shù)如下:

wKgZomUD5zmAJkirAAC7ZedBDCg081.png

圖8. 編寫除零錯(cuò)誤函數(shù)

然后在主函數(shù)中調(diào)用cm_backtrace_init();來初始化cm_backtrace,并調(diào)用該測(cè)試函數(shù):

wKgaomUD5zuAI7sUAAGKUyHDMAk220.png

圖9. main函數(shù)調(diào)用除零錯(cuò)誤函數(shù)

下載運(yùn)行程序,PC端接收串口信息:

wKgZomUD5z2AClv-AAE-7APsd_4047.png

圖10. 串口助手輸出錯(cuò)誤信息

可以看到,列出了出錯(cuò)原因(除0)和一條命令。運(yùn)行這個(gè)命令需要用到addr2line.exe工具,該工具在tools文件夾中:

wKgZomUD5z-AcZ7hAABo_N11Dt8476.png

圖11. 定位addr2line.exe位置

有32bit和64bit兩個(gè)版本,根據(jù)環(huán)境選擇,并拷貝到keil工程目錄下的.axf文件所在的文件夾中,如demo中所附工程,則拷貝到如下目錄:

AN0028_SourceCode_V2.0.0utilitiesAN0028_demonon_osmdk_v5objects

wKgaomUD50GAIbOoAAHq8x5DO3g696.png

圖12. 拷貝addr2line.exe工具

進(jìn)入到cmd窗口,轉(zhuǎn)到上述文件夾位置,運(yùn)行串口助手中的那條命令:

addr2line -e CmBacktrace(此處要依據(jù)用戶的工程名修改).axf -a -f 080019c6 08001ae9

如demo中工程名為printf,命令則應(yīng)修改為addr2line -e printf.axf -a -f 080019c6 08001ae9

wKgaomUD50KAHTtNAADcrKdlpOU582.png

圖13. 調(diào)用CMD運(yùn)行addr2line.exe工具

可以看到addr2line.exe工具定位出了錯(cuò)誤相關(guān)的代碼行號(hào),查看對(duì)應(yīng)行的代碼:

可以看到addr2line.exe工具定位出了錯(cuò)誤相關(guān)的代碼行號(hào),main.c的第60行,fault_test.c的第38行,查看對(duì)應(yīng)行的代碼:

wKgZomUD50aADrLgAAIFh2oeM0A554.png

圖14. 確認(rèn)錯(cuò)誤代碼區(qū)域

可見,對(duì)應(yīng)的行號(hào)正是出錯(cuò)的地方,使用這個(gè)CmBacktrace庫能幫助用戶有效、快速地定位到HardFault之類的錯(cuò)誤。

案例展示

案例一 無OS除零錯(cuò)誤

工程位置:AN0028_SourceCode_V2.0.0utilitiesAN0028_demonon_os

測(cè)試內(nèi)容:在裸機(jī)上除零錯(cuò)誤

案例二 FreeRTOS上除零錯(cuò)誤

工程位置:AN0028_SourceCode_V2.0.0utilitiesAN0028_demoosfreertos

測(cè)試內(nèi)容:在FreeROTOS上除零錯(cuò)誤,需注意tasks.c中有注釋/**/的三處為針對(duì)CmBacktrace做出的修改

案例三 USOCⅢ上非對(duì)齊訪問錯(cuò)誤

工程位置:AN0028_SourceCode_V2.0.0utilitiesAN0028_demoosucosiii

測(cè)試內(nèi)容:在UCOSⅢ上非對(duì)齊訪問錯(cuò)誤,需注意os_cfg.h中#define OS_CFG_DBG_EN為1u

來源:AT32 MCU 雅特力科技
免責(zé)聲明:本文為轉(zhuǎn)載文章,轉(zhuǎn)載此文目的在于傳遞更多信息,版權(quán)歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權(quán)問題,請(qǐng)聯(lián)系小編進(jìn)行處理


審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    146

    文章

    17961

    瀏覽量

    366190
  • Cortex
    +關(guān)注

    關(guān)注

    2

    文章

    203

    瀏覽量

    47336
  • MDK
    MDK
    +關(guān)注

    關(guān)注

    4

    文章

    211

    瀏覽量

    32662
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    【轉(zhuǎn)載】快速追蹤定位產(chǎn)生HardFault原因的方法

    時(shí),會(huì)發(fā)現(xiàn)程序跑到 HardFault_Handler函數(shù)中,產(chǎn)生 HardFault,即硬件錯(cuò)誤。 本文檔主要介紹一種基于CmBacktrace
    發(fā)表于 08-17 09:44

    Cortex-M系列MCU錯(cuò)誤追蹤有何作用

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

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

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

    如何快速定位HardFault

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

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

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

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

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

    cmbacktrace里面的HARDFAULT函數(shù)如何移植?

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

    產(chǎn)生HardFault原因,HardFault的分析方法

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

    專治MCU各種HardFault問題的開源

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

    一點(diǎn)理解之 CmBacktrace: ARM Cortex-M 系列 MCU 錯(cuò)誤追蹤

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

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

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

    ARM Cortex-M 系列 MCU錯(cuò)誤代碼自動(dòng)追蹤(CmBacktrace)的使用經(jīng)驗(yàn)分享

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

    ARM Cortex-M 系列 MCU 錯(cuò)誤追蹤 --- CmBacktrace

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

    專治MCU各種 HardFaultCmBacktrace(錯(cuò)誤追蹤

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

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

    HardFault,即硬件錯(cuò)誤。圖1.HardFault_Handler函數(shù)本文檔主要介紹一種基于CmBacktrace,快速
    的頭像 發(fā)表于 06-15 10:44 ?4671次閱讀
    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'>產(chǎn)生</b><b class='flag-5'>HardFault</b>的<b class='flag-5'>原因</b>