"); //-->

狠狠做深爱婷婷久久一区,欧美日韩国内,久久麻豆精品传媒,久久久一区一区二区,色鬼伦理片,99视频精品久久,久久精品国产久久久久久,久久久伦理电影一区二,磁力天堂河北彩花

專欄中心

EEPW首頁(yè) > 專欄 > 傳說中的軟件斷點(diǎn)到底是什么?

傳說中的軟件斷點(diǎn)到底是什么?

發(fā)布人:魚鷹談單片機(jī) 時(shí)間:2021-06-03 來源:工程師 發(fā)布文章

不知道道友是否有這樣的經(jīng)歷,代碼全速運(yùn)行的時(shí)候,等了很久發(fā)現(xiàn)并沒有得到想要的結(jié)果,然后暫停之后發(fā)現(xiàn)程序死在了循環(huán)里面,或者斷言里面。

那么我們是否有辦法在程序斷言失敗的時(shí)候,讓程序自動(dòng)停下來呢?而不是苦苦等待結(jié)果呢?

如果用常規(guī)的方法,肯定是在斷言里面加入斷點(diǎn),只要斷言失敗,那么程序自然就停下來了。

但是我們知道,KEIL 加入斷點(diǎn)后有可能在再次打開工程后消失,而且STM32單片機(jī)支持的斷點(diǎn)數(shù)量也有限,有沒有好的方法?

有的,就是軟件斷點(diǎn)。

你可以在需要停止CPU運(yùn)行的代碼中加入這條語句:

__breakpoint(0);  //后面的立即數(shù)不怎么重要

這樣,當(dāng)你的程序斷言失敗了之后,如果運(yùn)行到這條語句,在線調(diào)試模式下就會(huì)自動(dòng)停止單片機(jī)運(yùn)行(如果不在在線調(diào)試模式,也會(huì)進(jìn)入停止運(yùn)行,所以需要后面的優(yōu)化方案)。

比如 hardfault 錯(cuò)誤很難查,但是你可以在進(jìn)入這個(gè)中斷后,立刻執(zhí)行一條匯編軟件斷點(diǎn)代碼:

BKPT  0

或者直接在中斷處理函數(shù)中加入代碼:

void HardFault_Handler(void)
{
    __breakpoint(0);
}

這樣一來,一旦運(yùn)行到這個(gè)函數(shù),單片機(jī)就會(huì)馬上自動(dòng)停止運(yùn)行,而且你還可以通過 stack 窗口查看是從哪里跳進(jìn)這個(gè)函數(shù)的,這樣就能快速定位這種錯(cuò)誤了!

只有在滿足條件下,才會(huì)在你設(shè)置斷點(diǎn)位置自動(dòng)停止在斷點(diǎn)處。比如一個(gè)條件下,會(huì)導(dǎo)致整個(gè)程序出問題,那么你可以在應(yīng)用程序中添加代碼,讓其在滿足條件時(shí)自動(dòng)停止運(yùn)行(前提是處于在線調(diào)試,否則沒有任何打印信息的情況下停止運(yùn)行是很麻煩的事情)。

但有的時(shí)候,我只想讓軟件斷點(diǎn)在進(jìn)入調(diào)試模式時(shí)生效,正常運(yùn)行時(shí)不產(chǎn)生軟件斷點(diǎn),又該如何處理;換句話說,如何判斷單片機(jī)處于調(diào)試模式還是正常模式。

C 語言版

if(*((uint32_t*)0xE000EDF0) & 0x00000001) // 判斷是否工作在調(diào)試模式
{
    __breakpoint(0);
}

匯編版

DEMCR          EQU     0xE000EDF0
            LDR     r0, =DEMCR
            LDR     r0,[r0,#0x00]
            AND     r0,r0,#0x00000001
            CBZ     r0,no_debug
            BKPT    0
no_debug  ; 地址標(biāo)簽

適用于 STM32f1x  or  Cortex-M3/M4 平臺(tái),其他平臺(tái)自行研究


注意,剛下載程序時(shí)判斷也會(huì)成立,必須斷開調(diào)試器后再上電才可退出調(diào)試模式(或者其他方式退出調(diào)試模式)


*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。

關(guān)鍵詞: 程序

相關(guān)推薦

海可枯石可爛,程序存儲(chǔ)的空間也會(huì)變

程序示例

jackwang 2002-05-15

寫代碼不寫注釋?!無注釋主義了解一下~

2018-09-17

使用GDB命令行調(diào)試器調(diào)試C/C++程序

Linux下查看某一個(gè)程序所使用的內(nèi)存方法

學(xué)習(xí)51單片機(jī)的基本調(diào)試經(jīng)驗(yàn)

DSP C2000程序員高手進(jìn)階 PDF 版

資源下載 2007-12-29

PIC系列單片機(jī)接口子程序集

U盤1114的電路圖和程序

資源下載 2007-12-24

從HelloWorld說程序運(yùn)行機(jī)制

2023-06-27

SD卡讀寫程序

編寫可移植C/C++程序的要點(diǎn)

2023-09-26

一位程序猿的經(jīng)歷與現(xiàn)實(shí):我只想要一個(gè)倉(cāng)庫(kù)!

改變文件和程序的關(guān)聯(lián)方法

程序的書寫規(guī)則(程序的編碼規(guī)范)

更多 培訓(xùn)課堂
更多 焦點(diǎn)
更多 視頻

技術(shù)專區(qū)

宾阳县| 克拉玛依市| 达州市| 界首市| 利辛县| 新泰市| 安化县| 普兰县| 普洱| 青龙| 辉县市| 滨州市| 龙胜| 余姚市| 射阳县| 翼城县| 鸡西市| 江口县| 东宁县| 农安县| 浦东新区| 祥云县| 澄迈县| 拉萨市| 佳木斯市| 保定市| 哈尔滨市| 星子县| 井陉县| 嘉善县| 莆田市| 都匀市| 衢州市| 肥乡县| 申扎县| 高尔夫| 伊金霍洛旗| 布拖县| 十堰市| 原阳县| 盐津县|