chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

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

雅特力 AT32 MCU ? 2022-06-15 10:44 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

概述

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

圖1. HardFault_Handler函數(shù)

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

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


HardFault產(chǎn)生原因

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

數(shù)組越界操作;

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

堆棧溢出,程序跑飛;

中斷處理錯誤。

數(shù)組越界

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

內(nèi)存溢出

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

堆棧溢出

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

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

中斷處理異常

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

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


HardFault分析方法

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

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

以下重點介紹采用開源庫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中

圖2. cm_backtrace庫文件夾

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

這時候編譯有一個錯誤,這是因為cmb_fault.c與at32f4xx_int.c中的HardFault_Handler函數(shù)重復(fù)定義:

圖6. at32f4xx_it.c編譯報錯

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

需要把at32f4xx_int.c中的HardFault_Handler函數(shù)屏蔽掉。

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

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

步驟四 測試與查看

這時候就可以編譯通過了。下面測試這個庫的功能。

測試函數(shù)如下:

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

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

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

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

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兩個版本,根據(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

進入到cmd窗口,轉(zhuǎ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運行addr2line.exe工具

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

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

圖14. 確認錯誤代碼區(qū)域

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

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

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

案例展示

案例一 無OS除零錯誤

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

測試內(nèi)容:在裸機上除零錯誤

案例二 FreeRTOS上除零錯誤

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

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

案例三 USOCⅢ上非對齊訪問錯誤

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

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

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

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

    關(guān)注

    147

    文章

    18588

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

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

    MCU調(diào)試典型問題與解決方法

    ;CFSR(故障狀態(tài)寄存器)、SCB->HFSR、SCB->MMFAR(內(nèi)存管理地址)。 使用ARM Cortex-M的故障診斷(如CmBacktrace)自動定位崩潰代碼行。
    發(fā)表于 11-17 07:57

    LuatOS下GNSS定位開發(fā)實戰(zhàn):初識定位、NMEA解碼與位置追蹤上報

    在LuatOS環(huán)境中進行GNSS定位開發(fā),是許多物聯(lián)網(wǎng)項目的基礎(chǔ)需求。本指南旨在提供一份實戰(zhàn)向?qū)?,帶您?jīng)歷從GNSS定位的初始化設(shè)置,到對NMEA標(biāo)準(zhǔn)數(shù)據(jù)的解碼解析,再到將追蹤到的實時位置數(shù)據(jù)上報
    的頭像 發(fā)表于 10-29 16:03 ?157次閱讀
    LuatOS下GNSS<b class='flag-5'>定位</b>開發(fā)實戰(zhàn):初識<b class='flag-5'>定位</b>、NMEA解碼與位置<b class='flag-5'>追蹤</b>上報

    Cortex-M0+處理器的HardFault錯誤介紹

    在ARM處理器中,如果一個程序產(chǎn)生了錯誤并且被處理器檢測到,就會產(chǎn)生錯誤異常。Cortex-M0+處理器只有一種異常用以處理錯誤:HardFault。
    的頭像 發(fā)表于 10-14 10:50 ?2909次閱讀
    Cortex-M0+處理器的<b class='flag-5'>HardFault</b>錯誤介紹

    使用RT-Thread Studio在程序進Hardfault時怎么方便的查看調(diào)用棧?

    求助各位大神 使用RT-Thread Studio在程序進Hardfault時怎么方便的查看調(diào)用棧 使用MDK的時候可以方便的看調(diào)用堆棧,從而很快速的找到問題,使用RT-Thread Studio該如何快速找到問題呢
    發(fā)表于 10-10 06:54

    簡化定位,從exgnss擴展開始:GNSS開發(fā)從此“輕裝上陣”

    面對GNSS定位開發(fā)的重重挑戰(zhàn),exgnss擴展為你減負!它整合了核心算法與硬件適配,開發(fā)者無需重復(fù)造輪子,即可快速構(gòu)建穩(wěn)定、低功耗的定位應(yīng)用。
    的頭像 發(fā)表于 09-16 17:43 ?650次閱讀
    簡化<b class='flag-5'>定位</b>,從exgnss擴展<b class='flag-5'>庫</b>開始:GNSS開發(fā)從此“輕裝上陣”

    線程超時函數(shù)中 assert 失敗是什么原因導(dǎo)致的?

    定位后,發(fā)現(xiàn)在調(diào)用棧中經(jīng)常會同時出現(xiàn)兩個中斷,一個串口中斷和systick 中斷,就挺奇怪的,這是定時器中斷被別的中斷打斷了嗎? rt_sched_lock 的作用似乎就是關(guān)閉全局中斷吧。。。 請問可能是什么原因? 謝謝! rt-thread 版本: 5.2.1
    發(fā)表于 09-09 06:56

    AT32 IAP using the USART

    的中斷向量表相應(yīng)的移動,移動的偏移量為x AT32 USART IAP 快速使用方法 硬件資源 文檔中是用 AT-START-AT32F403A 實驗板的硬件條件為例,IAP demo 源代碼還包括
    發(fā)表于 07-11 10:51

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

    下的安全性和可靠性。 應(yīng)用領(lǐng)域 定位追蹤設(shè)備:特別適用于 GPS 定位器,為其提供穩(wěn)定的電源,確保定位器在各種環(huán)境下能準(zhǔn)確工作,廣泛應(yīng)用于車輛追蹤
    發(fā)表于 06-20 09:22

    使用RT-Thread Studio在程序進Hardfault時怎么方便的查看調(diào)用棧?

    使用RT-Thread Studio在程序進Hardfault時怎么方便的查看調(diào)用棧 使用MDK的時候可以方便的看調(diào)用堆棧,從而很快速的找到問題,使用RT-Thread Studio該如何快速找到問題呢
    發(fā)表于 04-01 07:32

    請問使用RT-Thread Studio在程序進Hardfault時怎么方便查看調(diào)用棧?

    求助各位大神 使用RT-Thread Studio在程序進Hardfault時怎么方便的查看調(diào)用棧 使用MDK的時候可以方便的看調(diào)用堆棧,從而很快速的找到問題,使用RT-Thread Studio該如何快速找到問題呢
    發(fā)表于 03-03 08:10

    智慧園區(qū)人員定位及軌跡追蹤技術(shù)哪個好?

    智慧園區(qū)作為城市發(fā)展的重要組成部分,其管理和服務(wù)效率的提升日益受到重視。人員定位及軌跡追蹤技術(shù)作為智慧園區(qū)建設(shè)的核心環(huán)節(jié)之一,對于提高園區(qū)安全性、優(yōu)化資源配置、提升服務(wù)體驗具有重要意義。然而,傳統(tǒng)
    的頭像 發(fā)表于 01-22 11:18 ?869次閱讀
    智慧園區(qū)人員<b class='flag-5'>定位</b>及軌跡<b class='flag-5'>追蹤</b>技術(shù)哪個好?

    人員軌跡如何追蹤管理?人員定位系統(tǒng)一鍵解決難題

    在快節(jié)奏的現(xiàn)代工業(yè)生產(chǎn)中,有效追蹤與管理人員軌跡是確保生產(chǎn)流程順暢、提升工作效率與保障員工安全的重要一環(huán)。然而,在大型工廠環(huán)境中,人員軌跡的追蹤如何做到呢?其實很多重工業(yè)已經(jīng)用上人員定位系統(tǒng)了,來看
    的頭像 發(fā)表于 12-10 10:42 ?1227次閱讀

    UCC21220EVM-009用戶指南

    電子發(fā)燒友網(wǎng)站提供《UCC21220EVM-009用戶指南.pdf》資料免費下載
    發(fā)表于 12-07 14:47 ?0次下載
    UCC21220EVM-<b class='flag-5'>009</b>用戶指南

    IP定位離線的特點以及作用

    很多人知道IP定位,但是對離線不是很理解。這篇文章會和大家闡述離線的概念、特點以及具體有什么作用。 IP定位路徑https://www.ipdatacloud.com/?utm-s
    的頭像 發(fā)表于 12-06 09:56 ?858次閱讀

    如何快速入門HAL編程 HAL與裸機編程的比較

    如何快速入門HAL編程 要快速入門HAL編程,可以遵循以下步驟: 了解基礎(chǔ)知識 : 掌握C語言編程基礎(chǔ),包括變量、數(shù)據(jù)類型、函數(shù)、指針等。 了解嵌入式系統(tǒng)的基本概念,如微控制器、中
    的頭像 發(fā)表于 12-02 11:39 ?1698次閱讀