<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>
"); //-->

博客專(zhuān)欄

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

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

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

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

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

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

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

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

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

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

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

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

BKPT  0

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

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

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

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

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

C 語(yǔ)言版

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

匯編版

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

適用于 STM32f1x  or  Cortex-M3/M4 平臺,其他平臺自行研究


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


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



關(guān)鍵詞: 程序

相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>