上期我們介紹了在IAR Embedded Workbench中程序連上仿真器調(diào)試時(shí)正常但是斷開仿真器單獨(dú)運(yùn)行時(shí)不正常的情況。
在嵌入式軟件開發(fā)中,有時(shí)會(huì)遇到程序斷開仿真器單獨(dú)運(yùn)行時(shí)正常,但是連上仿真器調(diào)試時(shí)不正常。本文主要介紹在IAR Embedded Workbench中程序斷開仿真器單獨(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)的寄存器和程序開始運(yùn)行是通過(guò)軟復(fù)位(Software Reset),而斷開仿真器單獨(dú)運(yùn)行時(shí)需要程序設(shè)置對(duì)應(yīng)的寄存器和程序開始運(yùn)行是通過(guò)硬復(fù)位 (Hardware Reset)。由于程序斷開仿真器單獨(dú)運(yùn)行時(shí)正常,連上仿真器調(diào)試的時(shí)候不需要像之前那樣不使用Flash loader,只需要在調(diào)試開始之前進(jìn)行一次硬復(fù)位 (Hardware Reset)(硬復(fù)位讓程序在連上仿真器調(diào)試時(shí)的初始狀態(tà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ù)位向量開始調(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ù)位向量開始調(diào)試)。
下載完成之后通過(guò)外部Reset進(jìn)行Hardware Reset
如果對(duì)應(yīng)的硬件仿真器不支持Hardware Reset或者并且對(duì)應(yīng)的硬件仿真器的nRESET引腳沒有連接到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中程序斷開仿真器單獨(dú)運(yùn)行時(shí)正常但是連上仿真器調(diào)試時(shí)不正常的情況。通過(guò)分析可能的原因及對(duì)應(yīng)的策略,可以解決斷開仿真器單獨(dú)運(yùn)行時(shí)正常正常但是連上仿真器調(diào)試時(shí)不正常的問(wèn)題。
審核編輯:劉清
-
寄存器
+關(guān)注
關(guān)注
31文章
5363瀏覽量
120931 -
仿真器
+關(guān)注
關(guān)注
14文章
1019瀏覽量
83881 -
IAR
+關(guān)注
關(guān)注
5文章
354瀏覽量
36747 -
調(diào)試器
+關(guān)注
關(guān)注
1文章
306瀏覽量
23803
原文標(biāo)題:程序單獨(dú)運(yùn)行正常但是仿真調(diào)試不正常
文章出處:【微信號(hào):IAR愛亞系統(tǒng),微信公眾號(hào):IAR愛亞系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論