上期我們介紹了在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)的寄存器和程序開始運行是通過軟復位(Software Reset),而斷開仿真器單獨運行時需要程序設(shè)置對應(yīng)的寄存器和程序開始運行是通過硬復位 (Hardware Reset)。由于程序斷開仿真器單獨運行時正常,連上仿真器調(diào)試的時候不需要像之前那樣不使用Flash loader,只需要在調(diào)試開始之前進行一次硬復位 (Hardware Reset)(硬復位讓程序在連上仿真器調(diào)試時的初始狀態(tài)與斷開仿真器單獨運行時硬復位之后的初始狀態(tài)時一致的)。
下面主要介紹如何在IAR Embedded Workbench中連上仿真器調(diào)試時進行硬復位 (Hardware Reset):
下載完成之后讓程序停在復位向量而不是main函數(shù)
在IAR Embedded Workbench工程選項Options > Debugger > Setup >Run to選項:默認情況下會選中Run to main,調(diào)試器下載完成之后,程序會停在main函數(shù)。如果不勾選Run to,調(diào)試器下載完成之后,程序會停在復位向量,這樣就可以從復位向量開始調(diào)試。
下載完成之后通過調(diào)試器進行Hardware Reset
如果對應(yīng)的硬件仿真器支持Hardware Reset并且對應(yīng)的硬件仿真器的nRESET引腳連接到MCU的復位引腳nRESET, 將Reset類型改成Hardware,然后Reset(模擬程序單獨運行時硬復位,并從復位向量開始調(diào)試)。
下載完成之后通過外部Reset進行Hardware Reset
如果對應(yīng)的硬件仿真器不支持Hardware Reset或者并且對應(yīng)的硬件仿真器的nRESET引腳沒有連接到MCU的復位引腳nRESET, 可以通過外部Reset對MCU進行Hardware Reset。但是外部Reset之后,程序需要停在復位向量,然后就可以通過調(diào)試器調(diào)試。 如果對應(yīng)的MCU和硬件仿真器支持CORERESET選項 (Options > I-jet > Breakpoints > Catch exceptions > CORERESET),勾選CORERESET之后,調(diào)試時如果有外部Reset, 程序會停在復位向量。
注:Vector catch是arm支持的調(diào)試特性,更多信息請參考arm相關(guān)文檔。
如果對應(yīng)的MCU或者硬件仿真器不支持CORERESET選項,則需要在復位向量打斷點,調(diào)試時如果有外部Reset, 程序會停在復位向量。
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在軟件出錯的時候復位MCU。MCU內(nèi)部Watchdog控制寄存器一般會有選項可以配置Watchdog在調(diào)試模式是否使能:
當Watchdog配置為調(diào)試模式不使能時,Watchdog在調(diào)試模式暫停時會停止,不會導致MCU復位。反之,當Watchdog配置為調(diào)試模式使能時,Watchdog在調(diào)試模式暫停時會繼續(xù)運行,從而可能會導致MCU復位(因為暫停的時候Watchdog得不到正常的刷新)。在單獨運行時,當軟件運行正常時,Watchdog會正常的刷新,所以不會復位。
將MCU內(nèi)部Watchdog配置成在調(diào)試模式不使能,這樣在調(diào)試時,暫停的時候Watchdog會停止,不會復位MCU。
總結(jié)
本文主要介紹了在IAR Embedded Workbench中程序斷開仿真器單獨運行時正常但是連上仿真器調(diào)試時不正常的情況。通過分析可能的原因及對應(yīng)的策略,可以解決斷開仿真器單獨運行時正常正常但是連上仿真器調(diào)試時不正常的問題。
審核編輯:劉清
-
寄存器
+關(guān)注
關(guān)注
31文章
5427瀏覽量
123743 -
仿真器
+關(guān)注
關(guān)注
14文章
1034瀏覽量
85119 -
IAR
+關(guān)注
關(guān)注
5文章
372瀏覽量
37326 -
調(diào)試器
+關(guān)注
關(guān)注
1文章
312瀏覽量
24221
原文標題:程序單獨運行正常但是仿真調(diào)試不正常
文章出處:【微信號:IAR愛亞系統(tǒng),微信公眾號:IAR愛亞系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
基于 IAR Embedded Workbench 的自研 MCU 芯片軟件函數(shù)與變量內(nèi)存布局優(yōu)化精控方法

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

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

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

評論