程序单独运行正常但是仿真调试不正常

Technical Note

Architectures:

Arm

Component:

debugger

Updated:

2023/7/21 7:25

在嵌入式软件开发中,有时会遇到程序断开仿真器单独运行时正常,但是连上仿真器调试时不正常。本文主要介绍在IAR Embedded Workbench中程序断开仿真器单独运行时正常但是连上仿真器调试时不正常的情况。

程序仿真调试和单独运行的区别

原因分析及对应策略

1. 程序连上仿真器调试时Flash loader及mac宏会设置对应的寄存器和程序开始运行是通过软复位(Software Reset),而断开仿真器单独运行时需要程序设置对应的寄存器和程序开始运行是通过硬复位 (Hardware Reset)。由于程序断开仿真器单独运行时正常,连上仿真器调试的时候不需要像之前那样不使用Flash loader,只需要在调试开始之前进行一次硬复位 (Hardware Reset)(硬复位让程序在连上仿真器调试时的初始状态与断开仿真器单独运行时硬复位之后的初始状态时一致的)。下面主要介绍如何在IAR Embedded Workbench中连上仿真器调试时进行硬复位 (Hardware Reset):

  • 下载完成之后让程序停在复位向量而不是main函数

在IAR Embedded Workbench工程选项Options > Debugger > Setup >Run to选项:默认情况下会选中Run to main,调试器下载完成之后,程序会停在main函数。如果不勾选Run to,调试器下载完成之后,程序会停在复位向量,这样就可以从复位向量开始调试。

  • 下载完成之后通过调试器进行Hardware Reset

如果对应的硬件仿真器支持Hardware Reset并且对应的硬件仿真器的nRESET引脚连接到MCU的复位引脚nRESET, 将Reset类型改成Hardware,然后Reset(模拟程序单独运行时硬复位,并从复位向量开始调试)。

  • 下载完成之后通过外部Reset进行Hardware Reset

如果对应的硬件仿真器不支持Hardware Reset或者并且对应的硬件仿真器的nRESET引脚没有连接到MCU的复位引脚nRESET, 可以通过外部Reset对MCU进行Hardware Reset。但是外部Reset之后,程序需要停在复位向量,然后就可以通过调试器调试。

如果对应的MCU和硬件仿真器支持CORERESET选项 (Options > I-jet > Breakpoints > Catch exceptions > CORERESET),勾选CORERESET之后,调试时如果有外部Reset, 程序会停在复位向量。
注:Vector catch是arm支持的调试特性,更多信息请参考arm相关文档。

如果对应的MCU或者硬件仿真器不支持CORERESET选项,则需要在复位向量打断点,调试时如果有外部Reset, 程序会停在复位向量。

2. 如果Library low-level interface implementation是通过semihosting (Options > General Options > Library low-level interface implementation > Semihosted > Via semihosting)实现:

而semihosting又是通过SVC指令来实现(非Cortex-M的32位arm内核):

如果程序里面也使用了SVC,那么连上仿真器调试的时候程序会停在SVC Handler:

可以通过将Library low-level interface implementation 设置为None (Options > General Options > Library low-level interface implementation > None):

3. 为了提高系统的健壮性,越来越多的MCU内部集成了Watchdog, 可以让MCU在软件出错的时候复位MCU。MCU内部Watchdog控制寄存器一般会有选项可以配置Watchdog在调试模式是否使能:

当Watchdog配置为调试模式不使能时,Watchdog在调试模式暂停时会停止,不会导致MCU复位。反之,当Watchdog配置为调试模式使能时,Watchdog在调试模式暂停时会继续运行,从而可能会导致MCU复位(因为暂停的时候Watchdog得不到正常的刷新)。在单独运行时,当软件运行正常时,Watchdog会正常的刷新,所以不会复位。

将MCU内部Watchdog配置成在调试模式不使能,这样在调试时,暂停的时候Watchdog会停止,不会复位MCU。

总结

本文主要介绍了在IAR Embedded Workbench中程序断开仿真器单独运行时正常但是连上仿真器调试时不正常的情况。通过分析可能的原因及对应的策略,可以解决断开仿真器单独运行时正常正常但是连上仿真器调试时不正常的问题。

 

参考文献:

  1. Flash Loader Development Guide (The IAR Flash Loader process)
  2. IAR C/C++ Development Guide (semihosting, retargeting)
  3. C-SPY® Debugging Guide (Run to)

 

We do no longer support Internet Explorer. To get the best experience of iar.com, we recommend upgrading to a modern browser such as Chrome or Edge.