0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

不復(fù)位MCU直接調(diào)試運(yùn)行程序

痞子衡嵌入式 ? 來(lái)源:痞子衡嵌入式 ? 作者:痞子衡嵌入式 ? 2022-05-12 15:43 ? 次閱讀

1

調(diào)試窘境

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

2

配置過(guò)程

軟硬件環(huán)境:

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

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

MCU型號(hào):STM32F429

展示方法:

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

代碼實(shí)例如下:


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

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

a97f9d62-d1b2-11ec-bce3-dac502259ad0.png

a9d8577c-d1b2-11ec-bce3-dac502259ad0.png

可能你該問(wèn)了.axf文件是什么?

其實(shí)axf全稱(chēng)為: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)場(chǎng)。

aa50abbe-d1b2-11ec-bce3-dac502259ad0.png

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

aa624e28-d1b2-11ec-bce3-dac502259ad0.png

3

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

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

aa73309e-d1b2-11ec-bce3-dac502259ad0.png

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

aa9b3c06-d1b2-11ec-bce3-dac502259ad0.png

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

4

思考

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

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

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

審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    146

    文章

    16802

    瀏覽量

    349357
  • 仿真
    +關(guān)注

    關(guān)注

    50

    文章

    3995

    瀏覽量

    133225

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

文章出處:【微信號(hào):pzh_mcu,微信公眾號(hào):痞子衡嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    變頻器調(diào)試的前期準(zhǔn)備和試運(yùn)行

    一、前期準(zhǔn)備 1. 確定調(diào)試目標(biāo) 在開(kāi)始調(diào)試之前,首先需要明確調(diào)試的目標(biāo)。這包括確定所需的輸出頻率范圍、電壓范圍、額定電流等關(guān)鍵參數(shù)。這些參數(shù)將直接影響變頻器的設(shè)定和后續(xù)的
    的頭像 發(fā)表于 09-09 15:28 ?257次閱讀

    廣西柳州的思必馳智能制造基地正式投入試運(yùn)行

    近日,隨著一臺(tái)臺(tái)智能智造設(shè)備的陸續(xù)進(jìn)廠和調(diào)試完成,位于廣西柳州的思必馳智能制造基地正式投入試運(yùn)行。
    的頭像 發(fā)表于 05-29 10:32 ?391次閱讀

    請(qǐng)問(wèn)stm8l101p3u為什么進(jìn)入halt之后看門(mén)狗不復(fù)位?

    在網(wǎng)上查了半天,很多人都是說(shuō)halt之后不想讓看門(mén)狗運(yùn)行卻停不下來(lái),為什么到了我這我想halt之后看門(mén)狗繼續(xù)運(yùn)行它反而不復(fù)位了呢?? 看門(mén)狗的代碼 RST_ClearFlag
    發(fā)表于 05-13 07:01

    用Keil上下載按鈕下載執(zhí)行程序直接斷電執(zhí)行程序,有什么不一樣?

    在連接上J-Link或者ST-Link的時(shí)候,可以直接在Keil上點(diǎn)擊下面的按鈕下載程序并執(zhí)行程序(當(dāng)然要勾選下載復(fù)位后自動(dòng)執(zhí)行) 想問(wèn)的是,這樣下載
    發(fā)表于 05-06 06:43

    STM32H750如何使用IAR調(diào)試運(yùn)行在外部SDRAM的程序?

    (.mac file)腳本,在程序下載前,運(yùn)行腳本初始化外部SDRAM,然后直接下載程序到外部SDRAM。 然后就要像在內(nèi)存中調(diào)試代碼一樣
    發(fā)表于 04-01 07:40

    stm32g030j6m6串口如何燒錄程序,NRST引腳能否在作為輸入IO使用時(shí)不復(fù)位?

    ; 2.使用SWD下載,NRST引腳必須作為輸入,但外部輸入低電平時(shí),MCU會(huì)復(fù)位。 問(wèn):串口如何燒錄程序,NRST引腳能否在作為輸入IO使用時(shí)不復(fù)位。
    發(fā)表于 03-11 07:48

    MCU復(fù)位RAM會(huì)保持嗎,如何實(shí)現(xiàn)復(fù)位時(shí)變量數(shù)據(jù)保持

    在使用MCU時(shí),通常大家默認(rèn)MCU復(fù)位時(shí)RAM會(huì)被復(fù)位清零,那實(shí)際MCU復(fù)位時(shí)RAM是什么狀態(tài)?
    的頭像 發(fā)表于 03-01 09:32 ?2167次閱讀
    <b class='flag-5'>MCU</b><b class='flag-5'>復(fù)位</b>RAM會(huì)保持嗎,如何實(shí)現(xiàn)<b class='flag-5'>復(fù)位</b>時(shí)變量數(shù)據(jù)保持

    MCU不復(fù)位調(diào)試的小技巧

    場(chǎng)景,也并非無(wú)路可循。原則上只要我們通過(guò)仿真器調(diào)試時(shí),做到代碼不被重新下載覆蓋,MCU 不被復(fù)位,就可能保留當(dāng)前程序運(yùn)行的狀態(tài),讓 Bug
    發(fā)表于 02-26 11:30 ?780次閱讀
    <b class='flag-5'>MCU</b><b class='flag-5'>不復(fù)位</b><b class='flag-5'>調(diào)試</b>的小技巧

    如何排查GD32 MCU復(fù)位是由哪個(gè)復(fù)位源導(dǎo)致的?

    上期為大家講解了GD32 MCU復(fù)位包括電源復(fù)位和系統(tǒng)復(fù)位,其中系統(tǒng)復(fù)位還包括獨(dú)立看門(mén)狗復(fù)位、內(nèi)
    的頭像 發(fā)表于 02-03 09:46 ?1572次閱讀
    如何排查GD32 <b class='flag-5'>MCU</b><b class='flag-5'>復(fù)位</b>是由哪個(gè)<b class='flag-5'>復(fù)位</b>源導(dǎo)致的?

    不復(fù)位MCU繼續(xù)調(diào)試的方法

    在產(chǎn)品開(kāi)發(fā)時(shí),經(jīng)常會(huì)碰到在測(cè)試過(guò)程中或設(shè)備出廠后才發(fā)現(xiàn)程序異常,但當(dāng)重新對(duì)設(shè)備仿真調(diào)試時(shí)卻復(fù)現(xiàn)不出現(xiàn)場(chǎng)的問(wèn)題,或者只通過(guò)保存的日志信息艱難分析代碼運(yùn)行到了何處而導(dǎo)致的異常。
    的頭像 發(fā)表于 01-26 09:25 ?772次閱讀
    <b class='flag-5'>不復(fù)位</b><b class='flag-5'>MCU</b>繼續(xù)<b class='flag-5'>調(diào)試</b>的方法

    GD32 MCU進(jìn)入低功耗模式導(dǎo)致無(wú)法再進(jìn)行程序下載怎么辦?

    很多朋友在調(diào)試GD32 MCU的低功耗模式時(shí)會(huì)遇到一個(gè)問(wèn)題:程序中讓MCU進(jìn)入了Sleep、Deepsleep或者Standby模式,之后MCU
    的頭像 發(fā)表于 01-12 09:41 ?3063次閱讀
    GD32 <b class='flag-5'>MCU</b>進(jìn)入低功耗模式導(dǎo)致無(wú)法再進(jìn)<b class='flag-5'>行程序</b>下載怎么辦?

    idea如何多次運(yùn)行程序

    在計(jì)算機(jī)編程的世界中,我們通常需要多次運(yùn)行程序來(lái)測(cè)試其性能、調(diào)試錯(cuò)誤或者進(jìn)行大規(guī)模的數(shù)據(jù)處理。但是有些編程初學(xué)者可能會(huì)困惑于如何多次運(yùn)行程序的問(wèn)題。本文將會(huì)詳細(xì)介紹如何多次運(yùn)行程序的不
    的頭像 發(fā)表于 12-06 14:59 ?1235次閱讀

    運(yùn)行Python程序的幾種常見(jiàn)方法

    方法: 使用Python解釋器 Python解釋器是運(yùn)行Python程序的基本工具。在命令行中輸入 python 命令,即可啟動(dòng)解釋器。然后輸入程序代碼,按回車(chē)即可執(zhí)行。這種方法適用于簡(jiǎn)單的
    的頭像 發(fā)表于 11-28 15:32 ?2144次閱讀

    python怎么運(yùn)行程序

    Python是一種廣泛使用的編程語(yǔ)言,它的簡(jiǎn)易和可讀性使得它成為初學(xué)者和專(zhuān)業(yè)開(kāi)發(fā)人員的首選。在運(yùn)行Python程序之前,您需要安裝Python解釋器,然后按照以下步驟進(jìn)行操作。 步驟1:安裝
    的頭像 發(fā)表于 11-24 09:25 ?2429次閱讀

    STM8上電不復(fù)位自動(dòng)運(yùn)行程序是什么情況?

    必須要手動(dòng)按復(fù)位才會(huì)執(zhí)行,這是什么情況
    發(fā)表于 10-24 08:13