1
調試窘境
經常有朋友在開發中遇到這樣的窘境,當單片機程序運行異常以后,由于調試信息做得并不是很全面,導致相應的問題場景非常難分析。當時的你肯定會嘆息道:"要是我一直插著仿真器就好了,這個bug還不是分分鐘的事~",每個人都想有顆“后悔藥”可吃,然而遇到這種場景也并非絕路。主要是因為大部分朋友插上仿真器以后,調試器在啟動時會發出硬件重置信號,應用程序當前的狀態都會丟失,包括內存變量、狀態等等,對于一些長時間的偶發故障調試更不太友好。此時此刻有一種調試需求是朋友們非常想要的:一旦程序出了問題,我只需要插上仿真器,目標硬件不會復位,而是與我當前所調試的程序同步,類似于仿真程序的時候的“全速運行”,然而通過添加斷點,便可查看程序具體的運行狀態,內存等等信息,讓bug聞風喪膽。很多朋友可能也只是想想,畢竟大家都比較專注程序中的應用邏輯,而忽略了調試器這塊的功能研究,自己就定義這種調試方式比較難吧或者沒有這種功能而不了了之。大家調試的需求也是一種用戶需求,相應工具的開發廠家會根據相應的需求進行開發,所以該功能在大部分主流的開發工具中都已具備,下面我們就驗證一下這個功能的可行性:2
配置過程
軟硬件環境:
IDE版本: Keil V5.36.0.0 (IAR等主流IDE工具均可)
調試工具版本: jlinkV9 (目前主流調試器基本都已具備)
展示方法:
直接采用全局變量進行累加然后進行串口輸出,如果重新連接目標平臺,串口輸出的全局變量還是順著之前的計數進行累計,便可以證明MCU沒有復位而是從程序運行處開始仿真。
代碼實例如下:
1#include"led.h" 2#include"delay.h" 3#include"key.h" 4#include"sys.h" 5#include"usart.h" 6 7uint32_tCnt=0; 8 9/****************************** 10*** Function:測試程序 11*** Author :公眾號:最后一個bug 12******************************/ 13 14intmain(void) 15{ 16 17u16times=0; 18delay_init(); 19NVIC_Configuration(); 20uart_init(9600); 21while(1) 22{ 23times++; 24if(times%30==0) 25{ 26printf("golobaldata: ",Cnt++); 27} 28delay_ms(10); 29} 30}
步驟如下:
1、首先編譯好工程,把將要實驗的程序完整的燒錄一次,必須要保證MCU中正在運行的程序與所要仿真的工程同步,這樣調試器通過調試接口獲取的程序運行位置信息才能與工程代碼中的位置一一對應。
2、去掉啟動時加載應用程序,并加入Loader.ini文件,主要用于加載已經編譯生成的.axf文件到Keil中,從而進行調試。
![a9d8577c-d1b2-11ec-bce3-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/62/wKgaomTm_aSAGwgyAABasDYkNBk806.png)
可能你該問了.axf文件是什么?
其實axf全稱為:ARM Executable File,該文件包含bin代碼和大量的調試信息,這些調試信息可以被調試器使用,從而定位到我們的C代碼。
3、在調試器Setting選項中,去掉"Reset after Connect",為了調試器鏈接以后不進行復位動作,從而破壞現場。
4、接下來Update Target Before Debugging選擇需要去掉,直接調試運行目標不需要勾選,也就不會更新Flash。
3
驗證結果
直接在全局變量打印輸出的地方放置斷點,程序運行到斷點處正常停止。
![aa73309e-d1b2-11ec-bce3-dac502259ad0.png](https://file1.elecfans.com//web2/M00/95/62/wKgaomTm_aWAAH5hAAAovBKPV6U787.png)
然后我們看一下輸出的串口信息數據是否連續,如果打印的數據連續說明程序沒有復位,接著反正前正在運行的程序往下執行。
通過串口接收數據時間戳可以區分斷點和調試運行數據,并且數據都是連續的,說明此調試過程在無需硬件重置即可連接到正在運行的目標。
4
思考
以前我了解到很多朋友覺得仿真程序是把運行程序通過加工調試信息,然后全部下載到MCU,然后進行仿真調試。
這種想法在目前的在線調試中是不太正確的,只需要知道程序運行到哪里,并且查看內部信息、控制程序的運行等,便可以反推定位程序當前所運行的位置和狀態,這也是本文開頭的前提條件,燒錄到Flash上的固件與你即將要仿真的代碼工程要保持同步,否則接下來的調試當然就是牛頭不對馬嘴。
仿真并不是什么神秘的東西,你可以認為就是與MCU內部仿真模塊進行通信,從而完成調試信息的交互和控制。
審核編輯 :李倩
-
mcu
+關注
關注
146文章
17347瀏覽量
352708 -
仿真
+關注
關注
50文章
4125瀏覽量
134020
原文標題:不復位MCU直接調試運行程序,讓bug聞風喪膽
文章出處:【微信號:pzh_mcu,微信公眾號:痞子衡嵌入式】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
是否可以用msp430f5529的開發板直接進行程序調試?
變頻器調試的前期準備和試運行
請問stm8l101p3u為什么進入halt之后看門狗不復位?
STM32F4 Keil程序在RAM中調試運行的問題求解
用Keil上下載按鈕下載執行程序和直接斷電執行程序,有什么不一樣?
關于STM32F207VET6運行的疑問求解
stm32g431vet6使用cubemax生成的代碼,在keil5進入debug時會直接運行程序跑飛怎么解決?
在stm32的運行程序中,初始函數明明沒有在while函數里面,為什么能反復運行?
STM32H750如何使用IAR調試運行在外部SDRAM的程序?
STM32H在IAR中如何實現從FLASH加載到SRAM中運行程序?
KEIL調試STM32在運行在打斷點位置后芯片復位是什么原因導致的呢?
stm32g030j6m6串口如何燒錄程序,NRST引腳能否在作為輸入IO使用時不復位?
MCU不復位調試的小技巧
![<b class='flag-5'>MCU</b><b class='flag-5'>不復位</b><b class='flag-5'>調試</b>的小技巧](https://file1.elecfans.com/web2/M00/C0/FE/wKgZomXcBlSAZp-sAABBpbVXrJ4300.png)
評論