cfree运行程序错误的原因_ARM Cortex-M 系列 MCU错误代码自动追踪库的使用分享
大家在用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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vba vbscript.regexp加
- 下一篇: .net get set 初始化_RAM