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

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

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

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

雅特力 AT32 MCU ? 2022-06-15 10:44 ? 次閱讀

概述

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

圖1. HardFault_Handler函數(shù)

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

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


HardFault產(chǎn)生原因

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

數(shù)組越界操作;

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

堆棧溢出,程序跑飛;

中斷處理錯(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)的堆??臻g中。

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

中斷處理異常

程序中開(kāi)啟了某些中斷,例如USART,TIMER,RTC等。

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


HardFault分析方法

常見(jiàn)的分析方法是:發(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)介紹采用開(kāi)源庫(kù)CmBacktrace作為快速分析的方法。

基于CmBacktrace庫(kù)分析方法

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

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

1) 斷言(Assert)

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

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

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

支持IAR、KEIL、GCC編譯器;

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

基于MDK的CmBacktrace庫(kù)使用流程

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

步驟一 添加cm_backtrace庫(kù)文件到MDK中

圖2. cm_backtrace庫(kù)文件夾

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

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

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

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

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

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

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

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

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

圖5. cmb_cfg.h文件配置

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

圖11. 定位addr2line.exe位置

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

有32bit和64bit兩個(gè)版本,根據(jù)環(huán)境選擇,并拷貝到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

進(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

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

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

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

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

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

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

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

案例展示

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

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

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

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

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

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

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

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

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

關(guān)于雅特力雅特力科技于2016年成立,是一家致力于推動(dòng)全球市場(chǎng)32位微控制器(MCU)創(chuàng)新趨勢(shì)的芯片設(shè)計(jì)公司,專(zhuān)注于ARM Cortex-M4/M0+的32位微控制器研發(fā)與創(chuàng)新,全系列采用55nm先進(jìn)工藝及ARM Cortex-M4高效能或M0+低功耗內(nèi)核,締造M4業(yè)界最高主頻288MHz運(yùn)算效能,并支持工業(yè)級(jí)別芯片工作溫度范圍(-40°~105°)。雅特力目前已累積相當(dāng)多元的終端產(chǎn)品成功案例:如微型打印機(jī)、掃地機(jī)、光流無(wú)人機(jī)、熱成像儀、激光雷達(dá)、工業(yè)縫紉機(jī)、伺服驅(qū)控、電競(jìng)周邊市場(chǎng)、斷路器、ADAS、T-BOX、數(shù)字電源、電動(dòng)工具等終端設(shè)備應(yīng)用,廣泛地覆蓋5G、物聯(lián)網(wǎng)、消費(fèi)、商務(wù)及工控等領(lǐng)域。

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

    關(guān)注

    146

    文章

    16922

    瀏覽量

    349995
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    園區(qū)封閉化管理之人員和車(chē)輛定位及軌跡追蹤

    如今園區(qū)封閉化管理的需求越來(lái)越普遍,特別是化工類(lèi)的園區(qū),為了實(shí)現(xiàn)對(duì)園區(qū)內(nèi)人員和車(chē)輛的準(zhǔn)確高效管控,人車(chē)定位及軌跡追蹤技術(shù)應(yīng)運(yùn)而生。本文將介紹這一技術(shù)在園區(qū)封閉化管理中的重要作用。 一、 什么是人車(chē)
    的頭像 發(fā)表于 10-11 11:20 ?232次閱讀
    園區(qū)封閉化管理之人員和車(chē)輛<b class='flag-5'>定位</b>及軌跡<b class='flag-5'>追蹤</b>

    無(wú)線定位追蹤器跟手機(jī)怎么連接

    無(wú)線定位追蹤器與手機(jī)的連接方法主要取決于追蹤器的類(lèi)型和功能。以下是一些常見(jiàn)的連接方式: 一、藍(lán)牙連接 確保兼容性 :首先,確保你的定位追蹤
    的頭像 發(fā)表于 09-29 10:01 ?918次閱讀

    說(shuō)明增強(qiáng)現(xiàn)實(shí)技術(shù)的產(chǎn)生原因

    增強(qiáng)現(xiàn)實(shí)技術(shù)(Augmented Reality, AR)的產(chǎn)生,主要源于人類(lèi)對(duì)信息獲取和交互方式的不斷追求與探索,以及計(jì)算機(jī)技術(shù)、圖像處理、傳感器技術(shù)、網(wǎng)絡(luò)通信等多領(lǐng)域技術(shù)的快速發(fā)展。以下是增強(qiáng)現(xiàn)實(shí)技術(shù)產(chǎn)生的主要
    的頭像 發(fā)表于 09-15 14:44 ?507次閱讀

    AT32講堂087 | 雅特力AT32 IDE快速入門(mén)指南

    新建項(xiàng)目新項(xiàng)目向?qū)T32ID提供支持雅特力MCU的C語(yǔ)言項(xiàng)目模板,方便用戶快速創(chuàng)建項(xiàng)目。菜單欄【File】>【New】>【CProject】。新建項(xiàng)目向?qū)У膶?duì)話框?qū)⒊霈F(xiàn)。在對(duì)
    的頭像 發(fā)表于 09-15 08:08 ?320次閱讀
    <b class='flag-5'>AT32</b><b class='flag-5'>講堂</b>087 | 雅特力<b class='flag-5'>AT32</b> IDE<b class='flag-5'>快速</b>入門(mén)指南

    儀表溫度異常的產(chǎn)生原因

    電子發(fā)燒友網(wǎng)站提供《儀表溫度異常的產(chǎn)生原因.docx》資料免費(fèi)下載
    發(fā)表于 09-12 14:09 ?0次下載

    簡(jiǎn)述自激振蕩產(chǎn)生原因

    自激振蕩是指在沒(méi)有外部驅(qū)動(dòng)信號(hào)的情況下,系統(tǒng)內(nèi)部由于某種機(jī)制自發(fā)產(chǎn)生的振蕩現(xiàn)象。這種現(xiàn)象在電子、機(jī)械、聲學(xué)等多個(gè)領(lǐng)域中廣泛存在,其產(chǎn)生原因復(fù)雜多樣。以下是對(duì)自激振蕩產(chǎn)生
    的頭像 發(fā)表于 09-03 10:59 ?516次閱讀

    AT32講堂085 | 雅特力AT32 MCU HICK時(shí)鐘校準(zhǔn)

    簡(jiǎn)介AT32系列MCU內(nèi)部都有提供適合運(yùn)行的內(nèi)部高速時(shí)鐘(HICK),其本質(zhì)就是內(nèi)置于芯片的RC振蕩器。在25℃下,其典型值頻率8MHz的精度由工廠校準(zhǔn)到±1%,在-40到105℃,該內(nèi)部高速時(shí)鐘
    的頭像 發(fā)表于 08-30 12:26 ?478次閱讀
    <b class='flag-5'>AT32</b><b class='flag-5'>講堂</b>085 | 雅特力<b class='flag-5'>AT32</b> MCU HICK時(shí)鐘校準(zhǔn)

    智慧園區(qū)人員定位及軌跡追蹤技術(shù)探討

    智慧園區(qū)是指利用先進(jìn)的信息技術(shù)和物聯(lián)網(wǎng)技術(shù),將各種設(shè)備、系統(tǒng)和人員進(jìn)行互聯(lián)互通,實(shí)現(xiàn)智能化管理和服務(wù)的園區(qū)。在這樣的園區(qū)中,人員定位和軌跡追蹤是極其重要的功能之一。本文將探討智慧園區(qū)人員定位及軌跡
    的頭像 發(fā)表于 08-28 11:31 ?323次閱讀

    STM32G0 FLASH快速寫(xiě)入發(fā)生HardFault原因?

    32的,成員是64bit的數(shù)組。 調(diào)用第3步寫(xiě)入函數(shù)就會(huì)發(fā)生hardfault,查了很多資料沒(méi)有找到原因,求指導(dǎo)
    發(fā)表于 07-23 07:44

    stm32F429zg主頻設(shè)置為180M全速運(yùn)行有概率進(jìn)入HardFault_Handler的原因?

    調(diào)試很容進(jìn)HardFault_Handler。 我嘗試尋跳轉(zhuǎn)到HardFault_Handler的原因,但找到的造成HardFault_Handler的地址全是無(wú)規(guī)律的,后續(xù)我將主頻降
    發(fā)表于 05-29 06:02

    STM32H7在設(shè)置MPU時(shí)為什么會(huì)進(jìn)入hardfault?

    MPU配置截圖 這樣配置會(huì)進(jìn)入hardfault,這么配置的原因是這段里某些地址我用做了ETH和LWIP的緩存 標(biāo)識(shí)符啥的 不知道這么配置為什么就會(huì)進(jìn)入Hardfault,但是如果我把MPU Cacheable Permiss
    發(fā)表于 05-17 15:02

    工程里在keil設(shè)置界面,只要把微庫(kù)勾選的去掉,則程序運(yùn)行就會(huì)進(jìn)入hardfault為什么?

    我的工程里在keil設(shè)置界面,只要把微庫(kù)勾選的去掉,則程序運(yùn)行就會(huì)進(jìn)入hardfault,選中就沒(méi)事了,這是為什么呢?
    發(fā)表于 04-17 06:11

    開(kāi)關(guān)電源產(chǎn)生電磁干擾的原因有哪些

    開(kāi)關(guān)電源產(chǎn)生電磁干擾(EMI)的原因主要與其工作方式有關(guān)。開(kāi)關(guān)電源通過(guò)高頻開(kāi)關(guān)來(lái)控制能量的轉(zhuǎn)換和傳輸,這種快速切換會(huì)在電源內(nèi)部和周?chē)臻g產(chǎn)生電磁場(chǎng),從而引起電磁干擾。以下是一些詳細(xì)的
    的頭像 發(fā)表于 02-16 17:11 ?2624次閱讀

    HardFault 調(diào)試與處理

    電子發(fā)燒友網(wǎng)站提供《HardFault 調(diào)試與處理.pdf》資料免費(fèi)下載
    發(fā)表于 12-18 09:05 ?1次下載
    <b class='flag-5'>HardFault</b> 調(diào)試與處理

    光纜故障的主要產(chǎn)生原因

    光纜故障的主要產(chǎn)生原因 光纜是現(xiàn)代通信和互聯(lián)網(wǎng)領(lǐng)域的重要基礎(chǔ)設(shè)施之一,其承載著海量的信息傳輸任務(wù)。然而,由于各種原因,光纜故障時(shí)有發(fā)生,給通信和互聯(lián)網(wǎng)的正常運(yùn)行帶來(lái)了嚴(yán)重的影響。因此,深入了解光纜
    的頭像 發(fā)表于 12-07 10:10 ?1090次閱讀