日韩一区二区三区精品,欧美疯狂xxxxbbbb牲交,热99re久久免费视精品频,人妻互换 综合,欧美激情肉欲高潮视频

歷史上的今天

今天是:2025年08月10日(星期日)

2021年08月10日 | STM32 | MCU錯(cuò)誤代碼自動(dòng)追蹤庫的使用經(jīng)驗(yàn)分享

發(fā)布者:云淡風(fēng)輕2014 來源: eefocus關(guān)鍵字:STM32  MCU  錯(cuò)誤代碼 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

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

======001

下面針對這個(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

======002

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

======003
======004

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

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

我們修改后的cmb_cfg.h內(nèi)容變?yōu)椋?p>======007

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

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

======009

這時(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ù):

======010
======011

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

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

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


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

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

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

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

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

對應(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)威指南》。

關(guān)鍵字:STM32  MCU  錯(cuò)誤代碼 引用地址:STM32 | MCU錯(cuò)誤代碼自動(dòng)追蹤庫的使用經(jīng)驗(yàn)分享

上一篇:STM32 | STM32F429的USB有坑?
下一篇:STM32 | 分享自定義協(xié)議的一些典型例子

推薦閱讀

? ? ??盡管小米8在今年的手機(jī)市場上表現(xiàn)并不出色,但是作為幾乎探底的搭載了旗艦級(jí)CPU芯片驍龍845的手機(jī),在用戶口中依然保持了不錯(cuò)的口碑。特別是當(dāng)小米8探索版公開售賣后,又是一股搶購潮!可是,大多數(shù)人依然沒有買到。黃章出山首作,魅族16終于給小米8上了一課_新浪眾測而就在今天,魅族不僅發(fā)布了自己的2018年旗艦產(chǎn)品,更是給小米上了一課。配...
1. 概述S5PC100有5個(gè)32位的計(jì)時(shí)器。這些計(jì)時(shí)器能夠產(chǎn)生內(nèi)部中斷給ARM子系統(tǒng)。此外,計(jì)時(shí)器0、1和2包括脈沖寬度調(diào)制(PWM)功能驅(qū)動(dòng)外部I / O信號(hào)。PWM計(jì)時(shí)器0有一個(gè)可選的死區(qū)發(fā)生器功能來支持一個(gè)大電流裝置。計(jì)時(shí)器3和4內(nèi)部定時(shí)器沒有輸出的引腳。計(jì)時(shí)器工作的時(shí)鐘來源于APB-PCLK。計(jì)時(shí)器0和1共享一個(gè)可編程的8位預(yù)分頻器,它提供了從PCLK時(shí)鐘的第一級(jí)分...
電源管理半導(dǎo)體IC設(shè)計(jì)公司Silicon Mitus 近日推出用于汽車車載主機(jī)(AVN)的SoC電源管理IC “SM6700Q”。通過汽車AVN電源管理IC能夠從汽車電池流入的電源有效切換、分配及控制于車輛SoC平臺(tái)上。另外,新產(chǎn)品SM6700Q高度符合汽車AVN的SoC上所需要的電源、CPU、存儲(chǔ)、I/O和I/F等各種電源需求。SM6700Q的特征為:支持3.5~5.5V輸入范圍;搭載6個(gè)降壓穩(wěn)壓器 (B...
實(shí)驗(yàn)6:模數(shù)遞減計(jì)數(shù)器MCCNT和定時(shí)中斷ECT 模塊包含一個(gè)16位的模數(shù)遞減計(jì)數(shù)器計(jì)數(shù)寄存器MCCNT。MCCNT的輸入時(shí)鐘信號(hào)由BUSCLOCK 分頻得到,分頻系數(shù)有四種選擇。每次時(shí)鐘到來后MCCNT自動(dòng)減1。當(dāng)MDC計(jì)數(shù)值減到0后,立即置位模數(shù)遞減計(jì)數(shù)器標(biāo)志寄存器MCFLG中的中斷標(biāo)志MCZF,若MCCTL中的中斷允許位MCZI=1,則向CPU發(fā)出中斷請求,向MCFLG的MCZF位寫1將清除該標(biāo)...

史海拾趣

問答坊 | AI 解惑

MSP430的TI官方C例程

MSP430x13x,14x,15x,16x TI官方C源程序例程 給要用到的人共享吧!?。 ?

查看全部問答∨

各種功放電路集錦

本帖最后由 paulhyde 于 2014-9-15 03:27 編輯 包括30W-100W功放電路和電子二分頻功放電路設(shè)計(jì)及說明~~~~~  …

查看全部問答∨

誰有關(guān)于投影機(jī)軟件開發(fā)的資料?DDP2230之類

哪位大哥有關(guān)于投影機(jī)軟件開發(fā)的資料?TI有個(gè)DDP2230的芯片,有誰了解?…

查看全部問答∨

無刷電機(jī)驅(qū)動(dòng)

無刷電機(jī)驅(qū)動(dòng)…

查看全部問答∨

關(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\" ...…

查看全部問答∨

格式化NandFlash

通過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ìn)來討論下TTL,CMOS,NMOS電路的區(qū)別以及應(yīng)用

大家進(jìn)來討論下TTL,CMOS,NMOS電路的區(qū)別以及應(yīng)用…

查看全部問答∨

單片機(jī)C程序中如何傳遞32位的參數(shù)

單片機(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ā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號(hào)

 
EEWorld服務(wù)號(hào)

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號(hào) 京ICP備10001474號(hào)-1 電信業(yè)務(wù)審批[2006]字第258號(hào)函 京公網(wǎng)安備 11010802033920號(hào) Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved