上期我們介紹了在IAR Embedded Workbench中程序連上仿真器調(diào)試時(shí)正常但是斷開(kāi)仿真器單獨(dú)運(yùn)行時(shí)不正常的情況。
在嵌入式軟件開(kāi)發(fā)中,有時(shí)會(huì)遇到程序斷開(kāi)仿真器單獨(dú)運(yùn)行時(shí)正常,但是連上仿真器調(diào)試時(shí)不正常。本文主要介紹在IAR Embedded Workbench中程序斷開(kāi)仿真器單獨(dú)運(yùn)行時(shí)正常但是連上仿真器調(diào)試時(shí)不正常的情況。
程序仿真調(diào)試和單獨(dú)運(yùn)行的區(qū)別
原因分析及對(duì)應(yīng)策略
1. 程序連上仿真器調(diào)試時(shí)Flash loader及mac宏會(huì)設(shè)置對(duì)應(yīng)的寄存器和程序開(kāi)始運(yùn)行是通過(guò)軟復(fù)位(Software Reset),而斷開(kāi)仿真器單獨(dú)運(yùn)行時(shí)需要程序設(shè)置對(duì)應(yīng)的寄存器和程序開(kāi)始運(yùn)行是通過(guò)硬復(fù)位 (Hardware Reset)。由于程序斷開(kāi)仿真器單獨(dú)運(yùn)行時(shí)正常,連上仿真器調(diào)試的時(shí)候不需要像之前那樣不使用Flash loader,只需要在調(diào)試開(kāi)始之前進(jìn)行一次硬復(fù)位 (Hardware Reset)(硬復(fù)位讓程序在連上仿真器調(diào)試時(shí)的初始狀態(tài)與斷開(kāi)仿真器單獨(dú)運(yùn)行時(shí)硬復(fù)位之后的初始狀態(tài)時(shí)一致的)。
下面主要介紹如何在IAR Embedded Workbench中連上仿真器調(diào)試時(shí)進(jìn)行硬復(fù)位 (Hardware Reset):
下載完成之后讓程序停在復(fù)位向量而不是main函數(shù)
在IAR Embedded Workbench工程選項(xiàng)Options > Debugger > Setup >Run to選項(xiàng):默認(rèn)情況下會(huì)選中Run to main,調(diào)試器下載完成之后,程序會(huì)停在main函數(shù)。如果不勾選Run to,調(diào)試器下載完成之后,程序會(huì)停在復(fù)位向量,這樣就可以從復(fù)位向量開(kāi)始調(diào)試。
下載完成之后通過(guò)調(diào)試器進(jìn)行Hardware Reset
如果對(duì)應(yīng)的硬件仿真器支持Hardware Reset并且對(duì)應(yīng)的硬件仿真器的nRESET引腳連接到MCU的復(fù)位引腳nRESET, 將Reset類型改成Hardware,然后Reset(模擬程序單獨(dú)運(yùn)行時(shí)硬復(fù)位,并從復(fù)位向量開(kāi)始調(diào)試)。
下載完成之后通過(guò)外部Reset進(jìn)行Hardware Reset
如果對(duì)應(yīng)的硬件仿真器不支持Hardware Reset或者并且對(duì)應(yīng)的硬件仿真器的nRESET引腳沒(méi)有連接到MCU的復(fù)位引腳nRESET, 可以通過(guò)外部Reset對(duì)MCU進(jìn)行Hardware Reset。但是外部Reset之后,程序需要停在復(fù)位向量,然后就可以通過(guò)調(diào)試器調(diào)試。 如果對(duì)應(yīng)的MCU和硬件仿真器支持CORERESET選項(xiàng) (Options > I-jet > Breakpoints > Catch exceptions > CORERESET),勾選CORERESET之后,調(diào)試時(shí)如果有外部Reset, 程序會(huì)停在復(fù)位向量。
注:Vector catch是arm支持的調(diào)試特性,更多信息請(qǐng)參考arm相關(guān)文檔。
如果對(duì)應(yīng)的MCU或者硬件仿真器不支持CORERESET選項(xiàng),則需要在復(fù)位向量打斷點(diǎn),調(diào)試時(shí)如果有外部Reset, 程序會(huì)停在復(fù)位向量。
2. 如果Library low-level interface implementation是通過(guò)semihosting (Options > General Options > Library low-level interface implementation > Semihosted > Via semihosting)實(shí)現(xiàn):
而semihosting又是通過(guò)SVC指令來(lái)實(shí)現(xiàn)(非Cortex-M的32位arm內(nèi)核):
如果程序里面也使用了SVC,那么連上仿真器調(diào)試的時(shí)候程序會(huì)停在SVC Handler:
可以通過(guò)將Library low-level interface implementation 設(shè)置為None (Options > General Options > Library low-level interface implementation > None):
3. 為了提高系統(tǒng)的健壯性,越來(lái)越多的MCU內(nèi)部集成了Watchdog, 可以讓MCU在軟件出錯(cuò)的時(shí)候復(fù)位MCU。MCU內(nèi)部Watchdog控制寄存器一般會(huì)有選項(xiàng)可以配置Watchdog在調(diào)試模式是否使能:
當(dāng)Watchdog配置為調(diào)試模式不使能時(shí),Watchdog在調(diào)試模式暫停時(shí)會(huì)停止,不會(huì)導(dǎo)致MCU復(fù)位。反之,當(dāng)Watchdog配置為調(diào)試模式使能時(shí),Watchdog在調(diào)試模式暫停時(shí)會(huì)繼續(xù)運(yùn)行,從而可能會(huì)導(dǎo)致MCU復(fù)位(因?yàn)闀和5臅r(shí)候Watchdog得不到正常的刷新)。在單獨(dú)運(yùn)行時(shí),當(dāng)軟件運(yùn)行正常時(shí),Watchdog會(huì)正常的刷新,所以不會(huì)復(fù)位。
將MCU內(nèi)部Watchdog配置成在調(diào)試模式不使能,這樣在調(diào)試時(shí),暫停的時(shí)候Watchdog會(huì)停止,不會(huì)復(fù)位MCU。
總結(jié)
本文主要介紹了在IAR Embedded Workbench中程序斷開(kāi)仿真器單獨(dú)運(yùn)行時(shí)正常但是連上仿真器調(diào)試時(shí)不正常的情況。通過(guò)分析可能的原因及對(duì)應(yīng)的策略,可以解決斷開(kāi)仿真器單獨(dú)運(yùn)行時(shí)正常正常但是連上仿真器調(diào)試時(shí)不正常的問(wèn)題。
審核編輯:劉清
-
寄存器
+關(guān)注
關(guān)注
31文章
5434瀏覽量
124524 -
仿真器
+關(guān)注
關(guān)注
14文章
1037瀏覽量
85419 -
IAR
+關(guān)注
關(guān)注
5文章
381瀏覽量
37471 -
調(diào)試器
+關(guān)注
關(guān)注
1文章
313瀏覽量
24329
原文標(biāo)題:程序單獨(dú)運(yùn)行正常但是仿真調(diào)試不正常
文章出處:【微信號(hào):IAR愛(ài)亞系統(tǒng),微信公眾號(hào):IAR愛(ài)亞系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
基于 IAR Embedded Workbench 的自研 MCU 芯片軟件函數(shù)與變量?jī)?nèi)存布局優(yōu)化精控方法

用stsw-link004這個(gè)軟件配合仿真器寫(xiě)程序后,直接運(yùn)行程序,程序運(yùn)行不正常是什么原因?
ADS1298 CONFIG2讀取初始值不正常是什么原因引起的?
變頻器輸出波形不正常原因及解決方法

是什么原因使ADS4145 VCM腳輸出電壓不正常?
伺服電機(jī)振動(dòng)不正常原因和維修及案例分析

為什么AIC23剛上電時(shí),工作不正常?
使用C5515 EVM調(diào)試程序,CCS不能識(shí)別到DEMO板的仿真器是怎么回事?
仿真器的使用方法有哪些
ADS1675采樣不正常是哪些原因引起的?
RA-T馬達(dá)工程串口直接啟動(dòng)Workbench調(diào)試方案

評(píng)論