日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

cfree运行程序错误的原因_ARM Cortex-M 系列 MCU错误代码自动追踪库的使用分享

發(fā)布時(shí)間:2024/10/14 编程问答 65 豆豆
生活随笔 收集整理的這篇文章主要介紹了 cfree运行程序错误的原因_ARM Cortex-M 系列 MCU错误代码自动追踪库的使用分享 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

大家在用STM32的時(shí)候有沒有遇到過HardFault的問題呢:

下面針對(duì)這個(gè)問題做個(gè)小總結(jié)。

現(xiàn)象還原:在debug模式下進(jìn)行仿真調(diào)試,全速運(yùn)行再停止運(yùn)行,程序會(huì)跑到 HardFault_Handler函數(shù)中,產(chǎn)生 HardFault,即硬錯(cuò)。其產(chǎn)生的原因大概有如下幾類:

(1)數(shù)組越界操作;

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

(3)堆棧溢出,程序跑飛;

(4)中斷處理錯(cuò)誤;

針對(duì)HardFault問題的定位,網(wǎng)上有幾種方法,大概都是圍繞著:在debug模式下,查看一些地址,分析寄存器、函數(shù)調(diào)用棧等,這是很讓人頭疼的事情。這里分享一種簡(jiǎn)單的、直觀的HardFault錯(cuò)誤定位的方法,使用開源庫:CmBacktrace 。這個(gè)庫之前已經(jīng)有介紹過了,這篇筆記我們來實(shí)踐一下。

CmBacktrace簡(jiǎn)介

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

  • 支持的錯(cuò)誤包括:斷言(assert)故障(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 編譯器;

移植及使用(keil)

CmBacktrace 源碼地址:

https://github.com/armink/CmBacktrace

把cm_backtrace文件夾復(fù)制到我們的工程目錄下,并添加至keil工程中,并添加頭文件、勾選C99模式:

此時(shí),編譯會(huì)產(chǎn)生幾個(gè)錯(cuò)誤:

那是因?yàn)橛行╊A(yù)處理宏沒有找到,打開、修改cmb_cfg.h文件的內(nèi)容。cmb_cfg.h文件默認(rèn)內(nèi)容為:

我們修改后的cmb_cfg.h內(nèi)容變?yōu)?#xff1a;

這時(shí)候編譯還會(huì)有一個(gè)錯(cuò)誤,cmb_fault.c與stm32f10x_it.c中的HardFault_Handler函數(shù)重定義:

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

這時(shí)候就可以編譯通過了。下面我們來看看這個(gè)庫的效果。

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

然后在主函數(shù)中調(diào)用測(cè)試函數(shù):

下載運(yùn)行程序:

可以看到,列出的信息很詳細(xì),包括出錯(cuò)原因。按照它的提示,我們運(yùn)行命令:

addr2line -e stm32f10x_demo.axf -a -f 0800162a 080016b7 08001719

運(yùn)行這個(gè)命令需要用到addr2line.exe工具,這個(gè)工具在CmBacktrace源碼目錄下的tools文件夾中:

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

在這個(gè)文件中進(jìn)入到cmd窗口,方法:按下Shift鍵的同時(shí)點(diǎn)擊鼠標(biāo)右鍵:

運(yùn)行上面那條命令:

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

可見,對(duì)應(yīng)的行號(hào)正是出錯(cuò)的地方。

可以看到,使用這個(gè)CmBacktrace 庫能幫助我們有效、快速地定位到HardFault之類的錯(cuò)誤。addr2line命令后面跟著幾個(gè)地址就是錯(cuò)誤相關(guān)的地址,這幾個(gè)地址可以牽扯的內(nèi)容很深,如果我們不使用CmBacktrace 庫,我們可能就得自己去分析這些偏底層的內(nèi)容了,相關(guān)知識(shí)可閱讀:《Cortex-M3/M4權(quán)威指南》。

以上就是本次的筆記分享,如有錯(cuò)誤歡迎指出!謝謝

總結(jié)

以上是生活随笔為你收集整理的cfree运行程序错误的原因_ARM Cortex-M 系列 MCU错误代码自动追踪库的使用分享的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。