代碼全速運(yùn)行的時(shí)候,等了很久發(fā)現(xiàn)并沒(méi)有得到想要的結(jié)果,然后暫停之后發(fā)現(xiàn)程序死在了循環(huán)里面,或者斷言里面。那么,我們是否有辦法在程序斷言失敗的時(shí)候,讓程序自動(dòng)停下來(lái)呢?而不是苦苦等待結(jié)果呢?如果用常規(guī)的方法,肯定是在斷言里面加入斷點(diǎn),只要斷言失敗,那么程序自然就停下來(lái)了。但是我們知道,KEIL加入斷點(diǎn)后有可能在再次打開(kāi)工程后消失,而且STM32單片機(jī)支持的斷點(diǎn)數(shù)量也有限,有沒(méi)有好的方法?有的,就是軟件斷點(diǎn)!你可以在需要停止CPU運(yùn)行的代碼中加入這條語(yǔ)句:
__breakpoint(0); //后面的立即數(shù)不怎么重要
這樣,當(dāng)你的程序斷言失敗了之后,如果運(yùn)行到這條語(yǔ)句,在線調(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)
這樣一來(lái),一旦運(yùn)行到這個(gè)函數(shù),單片機(jī)就會(huì)馬上自動(dòng)停止運(yùn)行,而且你還可以通過(guò)stack窗口查看是從哪里跳進(jìn)這個(gè)函數(shù)的,這樣就能快速定位這種錯(cuò)誤了!只有在滿足條件下,才會(huì)在你設(shè)置斷點(diǎn)位置自動(dòng)停止在斷點(diǎn)處。比如一個(gè)條件下,會(huì)導(dǎo)致整個(gè)程序出問(wèn)題,那么你可以在應(yīng)用程序中添加代碼,讓其在滿足條件時(shí)自動(dòng)停止運(yùn)行(前提是處于在線調(diào)試,否則沒(méi)有任何打印信息的情況下停止運(yùn)行是很麻煩的事情)。但有的時(shí)候,我只想讓軟件斷點(diǎn)在進(jìn)入調(diào)試模式時(shí)生效,正常運(yùn)行時(shí)不產(chǎn)生軟件斷點(diǎn),又該如何處理;換句話說(shuō),如何判斷單片機(jī)處于
調(diào)試模式
還是正常模式。
C語(yǔ)言版:
if(*((uint32_t*)0xE000EDF0)&0x00000001)//判斷是否工作在調(diào)試模式
匯編版:
DEMCREQU0xE000EDF0
適用于 STM32f1x or Cortex-M3/M4平臺(tái),其他平臺(tái)自行研究。

注意:剛下載程序時(shí)判斷也會(huì)成立,必須斷開(kāi)調(diào)試器后再上電才可退出調(diào)試模式(或者其他方式退出調(diào)試模式)。
審核編輯:湯梓紅
-
軟件
+關(guān)注
關(guān)注
69文章
5155瀏覽量
89248 -
C語(yǔ)言
+關(guān)注
關(guān)注
180文章
7632瀏覽量
141874 -
代碼
+關(guān)注
關(guān)注
30文章
4900瀏覽量
70801
發(fā)布評(píng)論請(qǐng)先 登錄
介紹幾種判斷電線電纜斷點(diǎn)的檢測(cè)方法

關(guān)于斷點(diǎn)的問(wèn)題
cortex-m3軟件斷點(diǎn)/單步執(zhí)行的實(shí)現(xiàn)機(jī)制是什么?
硬件斷點(diǎn)是什么?開(kāi)發(fā)環(huán)境中的斷點(diǎn)是軟件斷點(diǎn)嗎?
VI調(diào)試(設(shè)置斷點(diǎn))
python斷點(diǎn)調(diào)試方法

python程序調(diào)試中設(shè)置條件斷點(diǎn)

Studio 6.2中數(shù)據(jù)斷點(diǎn)分析介紹
介紹六種判定電纜斷點(diǎn)的方法
cortex-m3軟件斷點(diǎn)/單步執(zhí)行的實(shí)現(xiàn)機(jī)制

Segger的無(wú)限Flash斷點(diǎn)調(diào)試功能
硬件斷點(diǎn)和軟件斷點(diǎn)是什么

評(píng)論