<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          不復(fù)位MCU直接調(diào)試運(yùn)行程序,讓bug聞風(fēng)喪膽

          共 2100字,需瀏覽 5分鐘

           ·

          2022-05-16 00:33

          大家周末好呀,文章轉(zhuǎn)自bug菌的公眾號,文章介紹步復(fù)位情況下調(diào)試bug,希望對大家有用。

          1

          調(diào)試窘境

          經(jīng)常有朋友在開發(fā)中遇到這樣的窘境,當(dāng)單片機(jī)程序運(yùn)行異常以后,由于調(diào)試信息做得并不是很全面,導(dǎo)致相應(yīng)的問題場景非常難分析。
          當(dāng)時(shí)的你肯定會嘆息道:"要是我一直插著仿真器就好了,這個(gè)bug還不是分分鐘的事~",每個(gè)人都想有顆“后悔藥”可吃,然而遇到這種場景也并非絕路。
          主要是因?yàn)榇蟛糠峙笥巡迳戏抡嫫?/span>以后,調(diào)試器在啟動(dòng)時(shí)會發(fā)出硬件重置信號,應(yīng)用程序當(dāng)前的狀態(tài)都會丟失,包括內(nèi)存變量、狀態(tài)等等,對于一些長時(shí)間的偶發(fā)故障調(diào)試更不太友好。
          此時(shí)此刻有一種調(diào)試需求是朋友們非常想要的:一旦程序出了問題,我只需要插上仿真器,目標(biāo)硬件不會復(fù)位,而是與我當(dāng)前所調(diào)試的程序同步,類似于仿真程序的時(shí)候的“全速運(yùn)行”,然而通過添加斷點(diǎn),便可查看程序具體的運(yùn)行狀態(tài),內(nèi)存等等信息,讓bug聞風(fēng)喪膽。
          很多朋友可能也只是想想,畢竟大家都比較專注程序中的應(yīng)用邏輯,而忽略了調(diào)試器這塊的功能研究,自己就定義這種調(diào)試方式比較難吧或者沒有這種功能而不了了之。
          大家調(diào)試的需求也是一種用戶需求,相應(yīng)工具的開發(fā)廠家會根據(jù)相應(yīng)的需求進(jìn)行開發(fā),所以該功能在大部分主流的開發(fā)工具中都已具備,下面我們就驗(yàn)證一下這個(gè)功能的可行性:

          2

          配置過程

          軟硬件環(huán)境:

          IDE版本: Keil V5.36.0.0? (IAR等主流IDE工具均可)

          調(diào)試工具版本: jlinkV9? (目前主流調(diào)試器基本都已具備)

          MCU型號:STM32F429

          展示方法:

          直接采用全局變量進(jìn)行累加然后進(jìn)行串口輸出,如果重新連接目標(biāo)平臺,串口輸出的全局變量還是順著之前的計(jì)數(shù)進(jìn)行累計(jì),便可以證明MCU沒有復(fù)位而是從程序運(yùn)行處開始仿真。

          代碼實(shí)例如下:

          1#include?"led.h"
          2#include?"delay.h"
          3#include?"key.h"
          4#include?"sys.h"
          5#include?"usart.h"
          6
          7uint32_t?Cnt?=?0;
          8
          9/******************************
          10*** Function:測試程序
          11*** Author ?:公眾號:最后一個(gè)bug
          12******************************/

          13
          14int?main(void)
          15
          {????????
          16
          17????u16?times=0;
          18????delay_init();????????????
          19????NVIC_Configuration();???
          20????uart_init(9600);?????
          21????while(1)
          22????{
          23????????times++;
          24????????if(times%30==0)
          25????????{
          26????????????printf("golobal?data?:\r\n",Cnt++);??
          27????????}
          28????????delay_ms(10);???
          29????}????
          30}

          步驟如下:

          1、首先編譯好工程,把將要實(shí)驗(yàn)的程序完整的燒錄一次,必須要保證MCU中正在運(yùn)行的程序與所要仿真的工程同步,這樣調(diào)試器通過調(diào)試接口獲取的程序運(yùn)行位置信息才能與工程代碼中的位置一一對應(yīng)。

          2、去掉啟動(dòng)時(shí)加載應(yīng)用程序,并加入Loader.ini文件,主要用于加載已經(jīng)編譯生成的.axf文件到Keil中,從而進(jìn)行調(diào)試。

          可能你該問了.axf文件是什么?

          其實(shí)axf全稱為:ARM Executable File,該文件包含bin代碼和大量的調(diào)試信息,這些調(diào)試信息可以被調(diào)試器使用,從而定位到我們的C代碼。

          3、在調(diào)試器Setting選項(xiàng)中,去掉"Reset after Connect",為了調(diào)試器鏈接以后不進(jìn)行復(fù)位動(dòng)作,從而破壞現(xiàn)場。


          4、接下來Update Target Before Debugging選擇需要去掉,直接調(diào)試運(yùn)行目標(biāo)不需要勾選,也就不會更新Flash。

          3

          驗(yàn)證結(jié)果

          直接在全局變量打印輸出的地方放置斷點(diǎn),程序運(yùn)行到斷點(diǎn)處正常停止。

          然后我們看一下輸出的串口信息數(shù)據(jù)是否連續(xù),如果打印的數(shù)據(jù)連續(xù)說明程序沒有復(fù)位,接著反正前正在運(yùn)行的程序往下執(zhí)行。


          通過串口接收數(shù)據(jù)時(shí)間戳可以區(qū)分?jǐn)帱c(diǎn)和調(diào)試運(yùn)行數(shù)據(jù),并且數(shù)據(jù)都是連續(xù)的,說明此調(diào)試過程在無需硬件重置即可連接到正在運(yùn)行的目標(biāo)。

          4

          思考

          以前我了解到很多朋友覺得仿真程序是把運(yùn)行程序通過加工調(diào)試信息,然后全部下載到MCU,然后進(jìn)行仿真調(diào)試。

          這種想法在目前的在線調(diào)試中是不太正確的,只需要知道程序運(yùn)行到哪里,并且查看內(nèi)部信息、控制程序的運(yùn)行等,便可以反推定位程序當(dāng)前所運(yùn)行的位置和狀態(tài),這也是本文開頭的前提條件,燒錄到Flash上的固件與你即將要仿真的代碼工程要保持同步,否則接下來的調(diào)試當(dāng)然就是牛頭不對馬嘴。

          仿真并不是什么神秘的東西,你可以認(rèn)為就是與MCU內(nèi)部仿真模塊進(jìn)行通信,從而完成調(diào)試信息的交互和控制。


          最后

          好了,今天就跟大家分享這么多了,如果你覺得有所收獲,一定記得點(diǎn)個(gè)~



          瀏覽 2
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  水多多www视频在线观看高清 | 三级片在线视频 | 国产最新自拍 | 日本A级特黄视频论坛 | 97激情|