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

Technical Note 21904

Architectures:

Arm, Renesas Synergy

Component:

debugger

Updated:

2023/7/6 11:12

在嵌入式软件开发中,有时会遇到程序连上仿真器调试时正常,但是断开仿真器单独运行时不正常。

本文主要介绍在IAR Embedded Workbench中程序连上仿真器调试时正常但是断开仿真器单独运行时不正常的情况。

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

在IAR Embedded Workbench中程序连上仿真器调试和断开仿真器单独运行的主要区别:

china-debug-1.png

原因分析及对应策略

1. 检查调试下载时是否使用了 flash loader(Options > Debugger > Download> Use flash loader(s))。如果配置了 flash loader,可能意味着使用了 flash loader 的.mac宏文件。检查对应.board 和.flash 文件中的.mac宏文件。如果对应.mac宏文件里面的操作在断开仿真器单独运行程序时也需要执行,则需要在程序中添加对应的代码来完成对应的操作。

可以通过不使用flash loader来下载调试,查看对应的问题:

china-debug-2.png

注意:需要先使用flash loader把程序下载到对应的Flash,然后接下来调试就可以不使用flash loader来下载程序了(因为程序已经在Flash里面了),对应.board 和.flash 文件中的.mac宏文件也就不会被调用。

也可以通过Debug without Downloading直接进行调试,查看对应的问题:

china-debug-3.png

 

2. 检查在调试的时候是否使用了相关的.mac宏文件(Options > Debugger > Setup > Setup macros > Use macro file(s))。如果对应.mac宏文件里面的操作在断开仿真器单独运行程序时也需要执行,则需要在程序中添加对应的代码来完成对应的操作。

可以通过不使用相关的.mac宏文件来调试,查看对应的问题:

china-debug-4.png

 

3.如果程序里面使用了printf,而printf是通过semihosting (Options > General Options > Library low-level interface implementation > Semihosted > Via semihosting)实现的,程序里面本身没有重定向printf,那么在连上仿真器调试时会通过semihosting将printf打印的信息输出到Terminal I/O窗口,而在断开仿真器单独运行时程序会被挂起,不能正常运行。

china-debug-5.png

如果程序里面本身没有重定向printf,build的时候会报下面的错误,提示需要重定向printf:

china-debug-6.png

注意:printf重定向需要在程序里面提供__write函数的实现:

china-debug-7.png

对应包含__write函数的示例在安装目录下面的arm\src\lib\file\write.c

china-debug-8.png

对于支持SWO(Serial Wire Output)模式的MCU,也可以将Library low-level interface implementation 设置为SWO (Options > General Options > Library low-level interface implementation > Semihosted > Via SWO)。这样printf打印的信息会通过SWO输出(调试的时候会输出在Terminal I/O窗口,单独运行时没有办法显示出来,但是不会影响程序正常运行)。

 

4. 由于连上仿真器调试时程序开始运行通过软复位,而断开仿真器单独运行时程序开始运行通过硬复位 。为了在连上仿真器调试时模拟断开仿真器单独运行时的程序开始运行过程,可以通过下面的方法。 

在下载完成之后对目标系统进行一次硬复位,然后再运行:

china-debug-9.png

不要勾选Run to 选项(Options > Debugger > Setup > Run to),这样复位之后程序会停在Reset Handler,而不是main,可以从Reset Handler开始调试:

china-debug-10.png

也可以不通过调试器,而是从外部对目标系统进行硬复位(比如给MCU的RESETn引脚一个低电平脉冲),目标系统硬复位之后会全速跑,调试器会跟随目标系统的状态:

china-debug-11.png

总结

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

 

参考文献:

1.  Why is the application not running stand-alone? 

2.  Flash Loader Development Guide (The IAR Flash Loader process)

3.  C-SPY® Debugging Guide

4.  IAR C/C++ Development Guide (semihosting, retargeting)

 

英文版

 

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.