大家在用STM32的時(shí)候有沒有遇到過HardFault的問題呢:
下面針對這個(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ò)誤;
針對HardFault問題的定位,網(wǎng)上有幾種方法,大概都是圍繞著:在debug模式下,查看一些地址,分析寄存器、函數(shù)調(diào)用棧等,這是很讓人頭疼的事情。這里分享一種簡單的、直觀的HardFault錯(cuò)誤定位的方法,使用開源庫: CmBacktrace 。這個(gè)庫之前已經(jīng)有介紹過了,這篇筆記我們來實(shí)踐一下。
CmBacktrace簡介
CmBacktrace (Cortex Microcontroller Backtrace)是一款針對 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)椋?p>
這時(shí)候編譯還會(huì)有一個(gè)錯(cuò)誤,cmb_fault.c與stm32f10x_it.c中的HardFault_Handler函數(shù)重定義:
需要把stm32f10x_it.c中的HardFault_Handler函數(shù)屏蔽掉:
這時(shí)候就可以編譯通過了。下面我們來看看這個(gè)庫的效果。
測試函數(shù):
void fault_test_entry(fault_test_case_E _test_case)
{
switch (_test_case)
{
case FAULT_TEST_BY_DIV0:
fault_test_by_div0();
break;
case FAULT_TEST_BY_UNALIGN:
fault_test_by_unalign();
break;
default:
printf("test case error!n");
break;
}
}
static void fault_test_by_div0(void)
{
volatile int * SCB_CCR = (volatile int *) 0xE000ED14; // SCB->CCR
int x, y, z;
*SCB_CCR |= (1 << 4); /* bit4: DIV_0_TRP. */
x = 10;
y = 0;
z = x / y;
printf("z:%dn", z);
}
然后在主函數(shù)中調(diào)用測試函數(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),我們看看對應(yīng)行的代碼是什么:
對應(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)威指南》。
上一篇:STM32 | STM32F429的USB有坑?
下一篇:STM32 | 分享自定義協(xié)議的一些典型例子
推薦閱讀
史海拾趣
1979年,F(xiàn)abrimex AG接管了ARCO-Solar(美國)的代表處,標(biāo)志著公司正式進(jìn)入光伏領(lǐng)域。這一舉措為公司帶來了新的增長點(diǎn),并推動(dòng)了相關(guān)產(chǎn)品的研發(fā)和生產(chǎn)。隨著光伏技術(shù)的不斷發(fā)展,F(xiàn)abrimex AG在光伏領(lǐng)域逐漸取得了顯著的成績,為公司帶來了可觀的收益。
Filtran Ltd成立于2000年代初,初期專注于濾波器技術(shù)的研發(fā)。在無線通信領(lǐng)域,濾波器是確保信號(hào)純凈度的關(guān)鍵組件。公司研發(fā)團(tuán)隊(duì)經(jīng)過數(shù)年不懈努力,成功研發(fā)出一種新型高性能陶瓷濾波器,該濾波器不僅體積更小,而且能在更寬的頻率范圍內(nèi)保持優(yōu)異的性能。這一創(chuàng)新技術(shù)迅速吸引了手機(jī)制造商的注意,F(xiàn)iltran Ltd迅速成為多家國際手機(jī)品牌的核心供應(yīng)商,市場份額顯著提升。
在快速發(fā)展的同時(shí),GSR Technology Ltd始終關(guān)注可持續(xù)發(fā)展和社會(huì)責(zé)任。公司積極推動(dòng)綠色生產(chǎn),采用環(huán)保材料和工藝,減少對環(huán)境的影響。同時(shí),公司積極參與公益事業(yè),為貧困地區(qū)提供技術(shù)支持和教育援助。此外,公司還加強(qiáng)知識(shí)產(chǎn)權(quán)保護(hù),維護(hù)行業(yè)健康發(fā)展。這些舉措不僅提升了公司的社會(huì)形象,也為公司的長遠(yuǎn)發(fā)展奠定了堅(jiān)實(shí)的基礎(chǔ)。
請注意,以上故事均為虛構(gòu)內(nèi)容,旨在展示一個(gè)類似公司在電子行業(yè)中的可能發(fā)展路徑。實(shí)際情況可能因公司具體策略、市場環(huán)境等因素而有所不同。
Ericsson非常重視人才培養(yǎng)和團(tuán)隊(duì)建設(shè)。公司設(shè)立了專門的培訓(xùn)機(jī)構(gòu)為員工提供全面的培訓(xùn)和發(fā)展機(jī)會(huì)幫助他們不斷更新知識(shí)和技能以適應(yīng)快速變化的市場環(huán)境。此外Ericsson還注重營造積極向上的企業(yè)文化鼓勵(lì)員工創(chuàng)新創(chuàng)造和發(fā)揮潛力為公司的發(fā)展貢獻(xiàn)自己的力量。這種注重人才培養(yǎng)和團(tuán)隊(duì)建設(shè)的策略也為Ericsson的長期發(fā)展提供了有力保障。
在19世紀(jì)70年代,Ericsson公司主要以修理電報(bào)機(jī)和其他電器儀表為主要業(yè)務(wù)。然而,隨著電話技術(shù)的引入和普及,Ericsson敏銳地捕捉到了這一新技術(shù)帶來的商機(jī)。公司創(chuàng)始人Lars Magnus Ericsson通過購買、拆解和維修電話機(jī),迅速掌握了電話機(jī)制造技術(shù)。1878年,Ericsson公司成功推出了自己的電話機(jī),并憑借其經(jīng)濟(jì)耐用的特點(diǎn)迅速贏得了市場認(rèn)可,為公司的發(fā)展奠定了堅(jiān)實(shí)的基礎(chǔ)。
誰有關(guān)于投影機(jī)軟件開發(fā)的資料?DDP2230之類 哪位大哥有關(guān)于投影機(jī)軟件開發(fā)的資料?TI有個(gè)DDP2230的芯片,有誰了解?… 查看全部問答∨ |
|
關(guān)于ARM的IIC串行通信的幾個(gè)問題!請高手解答 急~~~ 程序的主要目的是將0~0xff這256個(gè)數(shù)按順序?qū)懭氲紼EPROM(AT24C16)的內(nèi)部存儲(chǔ)單元中,然后再依次將他們讀出,并通過實(shí)驗(yàn)室板的串口UART0輸出到PC機(jī)上運(yùn)行的超級(jí)終端上。 程序如下: #include #include \"2410addr.h\" #include \"2410lib.h\" ...… 查看全部問答∨ |
通過FormatVolumeEx,以FAT32格式化NandFlash后,從SD卡復(fù)制文件到格式化的分區(qū)中。但是最后對注冊表的寫操作,在關(guān)機(jī)重啟之前,都存在。一旦關(guān)機(jī)重啟,注冊表寫操作的數(shù)據(jù)全部丟失,不知為什么?… 查看全部問答∨ |
誰能幫忙從 pudn 上下載幾個(gè)程序發(fā)到我的郵箱里,謝謝 一個(gè)內(nèi)存驅(qū)動(dòng)器的源代碼 http://www.pudn.com/downloads/sourcecode/windows/vxd/detail1558.html 虛擬串口用VC編譯 http://www.pudn.com/downloads170/sourcecode/windows/vxd/detail788464.html 8139網(wǎng)卡驅(qū)動(dòng)源碼 http://www.pudn.co ...… 查看全部問答∨ |
|
單片機(jī)C程序的變量都是8位的,現(xiàn)在想傳遞一個(gè)32位或24位的變量參數(shù),怎么傳?。? 用指針?還是結(jié)構(gòu)? 麻煩寫個(gè)簡單的程序,如A函數(shù)調(diào)用B函數(shù)傳參數(shù)?!? 查看全部問答∨ |
請教:對ti串口轉(zhuǎn)網(wǎng)口套件重新下載bootloader后產(chǎn)生的問題 對ti串口轉(zhuǎn)網(wǎng)口套件重新下載自己改的bootloader后,再也連不上該套件,也無法重新下載了,哪位知道如何解決呀,謝謝:(… 查看全部問答∨ |
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- 電動(dòng)車電池成本降一半,續(xù)航卻減一半?寧德時(shí)代新電池能突圍嗎?
- 從“不可修”到可拆可換:CTP電池的售后怎么辦?
- 區(qū)域控制器ZCU國產(chǎn)化:從物料齊全到系統(tǒng)話語權(quán)
- 總額超260億-盤點(diǎn)全球移動(dòng)機(jī)器人領(lǐng)域融資TOP10企業(yè)
- 安森美CEO談?wù)撾妱?dòng)汽車與AI服務(wù)器前景
- LILYGO T-LoRa Pager:復(fù)古造型與前沿技術(shù)結(jié)合的物聯(lián)網(wǎng)手持設(shè)備
- VS Code+PlatformIO搭建ESP32 Arduino開發(fā)環(huán)境
- Esp32環(huán)境離線搭建參考
- ESP32使用舵機(jī)庫時(shí)的錯(cuò)誤
- ESP32 S3接ST7789屏幕線序
- 逛工業(yè)自動(dòng)化展TE Connectivity網(wǎng)上展廳,答題贏好禮!
- 1月22日下午14:00Mouser攜手Maxim邀您觀看有獎(jiǎng)直播:深入淺出可穿戴健康監(jiān)測
- 在線直播 意法半導(dǎo)體工業(yè)峰會(huì)2022
- 合泰ESK32-360 開發(fā)板“拍了拍”你,免費(fèi)測評(píng)在等你
- 點(diǎn)評(píng)《與Atmel SAM D21/R21的相遇、相識(shí)、相知(上)》,贏溫暖新春禮
- 51奇趣DIY(LC測試儀已完成)
- TI 嵌入式處理主題直播月|報(bào)名觀看直播贏好禮【低功耗WiFi MCU、Sitara AM57X平臺(tái)、機(jī)器學(xué)習(xí)】
- 來聊聊你與MP3的情緣吧!——MP3播放板等你拿
- “足智多謀”機(jī)器人發(fā)動(dòng)未來兩大領(lǐng)域智能科技引擎
- 從Linux到RISC-V:合作共享才能顯現(xiàn)出開源的真正價(jià)值
- Wi-Fi6技術(shù)將使戶外熱點(diǎn)、回程和固定無線接入技術(shù)成為可能
- 英特爾已經(jīng)為AI產(chǎn)業(yè)培訓(xùn)了超過15萬名開發(fā)者
- ABB為鎮(zhèn)江文廣集團(tuán)電動(dòng)汽車充電站提供充電解決方案
- 濟(jì)南兩會(huì):2021年大力發(fā)展集成電路等產(chǎn)業(yè)
- 張江·兆芯項(xiàng)目正式開工,助張江科學(xué)城形成集成電路生態(tài)圈
- 中星微技術(shù)獲得2021中國IC風(fēng)云榜“年度IC獨(dú)角獸獎(jiǎng)”
- 創(chuàng)世紀(jì):國家制造業(yè)基金入股深圳創(chuàng)世紀(jì)工商變更登記完結(jié)
- 毛利率遠(yuǎn)比同行低:廣合科技“大客戶病”致外銷占比居高
- [資料] STM8S103F3P6資料 【立創(chuàng)商城】
- 高手幫忙發(fā)個(gè)Usb轉(zhuǎn)rs232串口的電路圖
- A2B, 車載娛樂網(wǎng),新方向
- 《2009-2010學(xué)期網(wǎng)民測評(píng)全國統(tǒng)一考試版(全國卷)》
- 請問是否只需一根JTAG下載線就能向430燒程序?
- zigbee怎么學(xué)習(xí)啊
- 汽車報(bào)警器+GPS方案
- 誠心求教:CCS3.3 如何使用NDK1.94實(shí)現(xiàn)網(wǎng)絡(luò)開發(fā)
- EZ430-F2013仿真器不聯(lián)機(jī)故障如何解決
- 繼續(xù)請教,這個(gè)程序最后一個(gè)問題了