乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

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

       新用戶0118F7lQ 2022-05-13

      1

      調(diào)試窘境

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

      2

      配置過程

      軟硬件環(huán)境:

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

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

      MCU型號:STM32F429

      展示方法:

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

      代碼實例如下:

      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  :公眾號:最后一個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、首先編譯好工程,把將要實驗的程序完整的燒錄一次,必須要保證MCU中正在運行的程序與所要仿真的工程同步,這樣調(diào)試器通過調(diào)試接口獲取的程序運行位置信息才能與工程代碼中的位置一一對應。

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

      圖片

      圖片

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

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

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

      圖片

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

      圖片

      3

      驗證結(jié)果

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

      圖片

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

      圖片

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

      4

      思考

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

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

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

      最后

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

      圖片

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多