代碼全速運行的時候,等了很久發現并沒有得到想要的結果,然后暫停之后發現程序死在了循環里面,或者斷言里面。那么,我們是否有辦法在程序斷言失敗的時候,讓程序自動停下來呢?而不是苦苦等待結果呢?如果用常規的方法,肯定是在斷言里面加入斷點,只要斷言失敗,那么程序自然就停下來了。但是我們知道,KEIL加入斷點后有可能在再次打開工程后消失,而且STM32單片機支持的斷點數量也有限,有沒有好的方法?有的,就是軟件斷點!你可以在需要停止CPU運行的代碼中加入這條語句:
__breakpoint(0); //后面的立即數不怎么重要
這樣,當你的程序斷言失敗了之后,如果運行到這條語句,在線調試模式下就會自動停止單片機運行(如果不在
在線調試
模式,也會進入停止運行,所以需要后面的優化方案)。比如hardfault錯誤很難查,但是你可以在進入這個中斷后,立刻執行一條匯編軟件斷點代碼:
BKPT 0
或者直接在中斷處理函數中加入代碼:
void HardFault_Handler(void)
這樣一來,一旦運行到這個函數,單片機就會馬上自動停止運行,而且你還可以通過stack窗口查看是從哪里跳進這個函數的,這樣就能快速定位這種錯誤了!只有在滿足條件下,才會在你設置斷點位置自動停止在斷點處。比如一個條件下,會導致整個程序出問題,那么你可以在應用程序中添加代碼,讓其在滿足條件時自動停止運行(前提是處于在線調試,否則沒有任何打印信息的情況下停止運行是很麻煩的事情)。但有的時候,我只想讓軟件斷點在進入調試模式時生效,正常運行時不產生軟件斷點,又該如何處理;換句話說,如何判斷單片機處于
調試模式
還是正常模式。
C語言版:
if(*((uint32_t*)0xE000EDF0)&0x00000001)//判斷是否工作在調試模式
匯編版:
DEMCREQU0xE000EDF0
適用于 STM32f1x or Cortex-M3/M4平臺,其他平臺自行研究。
![pYYBAGMz-6WASO45AACuCnchhY8694.png](https://file.elecfans.com/web2/M00/6D/92/pYYBAGMz-6WASO45AACuCnchhY8694.png)
注意:剛下載程序時判斷也會成立,必須斷開調試器后再上電才可退出調試模式(或者其他方式退出調試模式)。
審核編輯:湯梓紅
-
軟件
+關注
關注
69文章
5013瀏覽量
88085 -
C語言
+關注
關注
180文章
7614瀏覽量
137739 -
代碼
+關注
關注
30文章
4828瀏覽量
69063
發布評論請先 登錄
相關推薦
python斷點調試方法
![python<b class='flag-5'>斷點</b>調試方法](https://file1.elecfans.com//web2/M00/A7/28/wKgZomUMQrmAdyd4AAA2m6WDJNM476.png)
python程序調試中設置條件斷點
![python程序調試中設置條件<b class='flag-5'>斷點</b>](https://file1.elecfans.com//web2/M00/A7/28/wKgZomUMQrqAatgbAABFjfln3XE501.png)
cortex-m3軟件斷點/單步執行的實現機制
![cortex-m3<b class='flag-5'>軟件</b><b class='flag-5'>斷點</b>/單步執行的實現機制](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論