醴陵市聯(lián)洲電器有限公司為您提供chrhq3y-100a4p聯(lián)洲電器傳說中的軟件斷點到。聯(lián)洲牌 chrhq3y-100a/4p#聯(lián)洲電器# 傳說中的軟件斷點到
不知道道友是否有這樣的經(jīng)歷,代碼全速運行的時候,等了很久發(fā)現(xiàn)并沒有得到想要的結(jié)果,然后暫停之后發(fā)現(xiàn)程序死在了循環(huán)里面,或者斷點里面。
那么我們是否有辦法在程序斷言失敗的時候,讓程序自動停下來呢?而不是苦苦等待結(jié)果呢?如果用常規(guī)的方法,肯定是在斷言里面加入斷點,只要斷言失敗,那么程序自然就停下來了。但是我們知道,keil 加入斷點后有可能在再次打開工程后消失,而且stm32單片機支持的斷點數(shù)量也有限,有沒有好的方法?有的,就是軟件斷點。你可以在需要停止cpu運行的代碼中加入這條語句:
__breakpoint(0); //后面的立即數(shù)不怎么重要
這樣,當(dāng)你的程序斷言失敗了之后,如果運行到這條語句,在線調(diào)試模式下就會自動停止單片機運行如果不在在線調(diào)試模式,也會進入停止運行,所以需要后面的優(yōu)化方案。比如 hardfault 錯誤很難查,但是你可以在進入這個中斷后,執(zhí)行一條匯編軟件斷點代碼:
bkpt 0
或者直接在中斷處理函數(shù)中加入代碼:
void hardfault_handler(void){ __breakpoint(0);}
這樣一來,一旦運行到這個函數(shù),單片機就會馬上自動停止運行,而且你還可以通過 stack 窗口查看是從哪里跳進這個函數(shù)的,這樣就能快速定位這種錯誤了!只有在滿足條件下,才會在你設(shè)置斷點位置自動停止在斷點處。比如一個條件下,會導(dǎo)致整個程序出問題,那么你可以在應(yīng)用程序中添加代碼,讓其在滿足條件時自動停止運行前提是處于在線調(diào)試,否則沒有任何打印信息的情況下停止運行是很麻煩的事情。但有的時候,我只想讓軟件斷點在進入調(diào)試模式時生效,正常運行時不產(chǎn)生軟件斷點,又該如何處理;換句,如何判斷單片機處于調(diào)試模式還是正常模式。
c 語言版
if(*((uint32_t*)0xe000edf0) & 0x00000001) // 判斷是否工作在調(diào)試模式{ __breakpoint(0);}
匯編版
demcr equ0xe000edf0 ldr r0, =demcr ldr r0,[r0,#0x00] & r0,r0,#0x00000001 cbz r0,no_debug bkpt 0no_debug ; 地址標(biāo)簽
適用于 stm32f1x or cortex-m3/m4 平臺,其他平臺自行研究
注意,剛程序時判斷也會成立,必須斷開調(diào)試器后再上電才可退出調(diào)試模式或者其他方式退出調(diào)試模式