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