不复位MCU直接调试运行程序,让bug闻风丧胆

发布时间:2023-02-06  

1

调试窘境

经常有朋友在开发中遇到这样的窘境,当单片机程序运行异常以后,由于调试信息做得并不是很全面,导致相应的问题场景非常难分析。当时的你肯定会叹息道:"要是我一直插着仿真器就好了,这个bug还不是分分钟的事~",每个人都想有颗“后悔药”可吃,然而遇到这种场景也并非绝路。主要是因为大部分朋友插上仿真器以后,调试器在启动时会发出硬件重置信号,应用程序当前的状态都会丢失,包括内存变量、状态等等,对于一些长时间的偶发故障调试更不太友好。此时此刻有一种调试需求是朋友们非常想要的:一旦程序出了问题,我只需要插上仿真器,目标硬件不会复位,而是与我当前所调试的程序同步,类似于仿真程序的时候的“全速运行”,然而通过添加断点,便可查看程序具体的运行状态,内存等等信息,让bug闻风丧胆。很多朋友可能也只是想想,毕竟大家都比较专注程序中的应用逻辑,而忽略了调试器这块的功能研究,自己就定义这种调试方式比较难吧或者没有这种功能而不了了之。大家调试的需求也是一种用户需求,相应工具的开发厂家会根据相应的需求进行开发,所以该功能在大部分主流的开发工具中都已具备,下面我们就验证一下这个功能的可行性:


2

配置过程

软硬件环境:

IDE版本: Keil V5.36.0.0 (IAR等主流IDE工具均可)

调试工具版本: jlinkV9 (目前主流调试器基本都已具备)

MCU型号:STM32F429


展示方法:

直接采用全局变量进行累加然后进行串口输出,如果重新连接目标平台,串口输出的全局变量还是顺着之前的计数进行累计,便可以证明MCU没有复位而是从程序运行处开始仿真。


代码实例如下:

 1#include "led.h"
 2#include "delay.h"
 3#include "key.h"
 4#include "sys.h"
 5#include "usart.h"
 6
 7uint32_t Cnt = 0;
 8
 9/******************************
10*** Function:测试程序
11*** Author  :公众号:最后一个bug
12******************************/
13
14int main(void)
15{        
16
17    u16 times=0;
18    delay_init();            
19    NVIC_Configuration();   
20    uart_init(9600);     
21    while(1)
22    {
23        times++;
24        if(times%30==0)
25        {
26            printf("golobal data :rn",Cnt++);  
27        }
28        delay_ms(10);   
29    }    
30}


步骤如下:

1、首先编译好工程,把将要实验的程序完整的烧录一次,必须要保证MCU中正在运行的程序与所要仿真的工程同步,这样调试器通过调试接口获取的程序运行位置信息才能与工程代码中的位置一一对应。

2、去掉启动时加载应用程序,并加入Loader.ini文件,主要用于加载已经编译生成的.axf文件到Keil中,从而进行调试。



可能你该问了.axf文件是什么?

其实axf全称为:ARM Executable File,该文件包含bin代码和大量的调试信息,这些调试信息可以被调试器使用,从而定位到我们的C代码。

3、在调试器Setting选项中,去掉"Reset after Connect",为了调试器链接以后不进行复位动作,从而破坏现场。




4、接下来Update Target Before Debugging选择需要去掉,直接调试运行目标不需要勾选,也就不会更新Flash。



3

验证结果

直接在全局变量打印输出的地方放置断点,程序运行到断点处正常停止。

然后我们看一下输出的串口信息数据是否连续,如果打印的数据连续说明程序没有复位,接着反正前正在运行的程序往下执行。




通过串口接收数据时间戳可以区分断点和调试运行数据,并且数据都是连续的,说明此调试过程在无需硬件重置即可连接到正在运行的目标。

4

思考

以前我了解到很多朋友觉得仿真程序是把运行程序通过加工调试信息,然后全部下载到MCU,然后进行仿真调试。

这种想法在目前的在线调试中是不太正确的,只需要知道程序运行到哪里,并且查看内部信息、控制程序的运行等,便可以反推定位程序当前所运行的位置和状态,这也是本文开头的前提条件,烧录到Flash上的固件与你即将要仿真的代码工程要保持同步,否则接下来的调试当然就是牛头不对马嘴。

仿真并不是什么神秘的东西,你可以认为就是与MCU内部仿真模块进行通信,从而完成调试信息的交互和控制。


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    电源稳定,电压和频率与电机标识相符,如果电压不足或频率偏离太远,电机可能无法正常启动。   检查电机绕组:检查电机绕组是否正常,是否有短路或开路现象。使用万用表测试电机绕组的绝缘电阻,如果......
    及时排除缺相故障非常重要。   三相电机启动不了嗡嗡作响   三相电机启动时“嗡嗡”作响可能是由以下原因引起的:   电源电压低:如果电源电压低于电机额定电压,电机会无法正常启动或者启动困难,产生“嗡嗡”声。   电机......
    的功能,应保护车载软件升级系统的可信根、引导加载程序、系统固件不被篡改,或被篡改后无法正常启动”。 故安全启动功能后续将成为强标的一部分,具有OTA功能的ECU都必须配备。但目......
    主控板,看是否有无输出信号,如果无输出信号,则是其中一个芯片HC245损坏。 解决办法:更换HC245芯片  断开电源线,检查电源是否有缺相或断路情况,如果电源正常则再次上电后则检查......
    电机)情况下启动变频器,并测试U、V、W三相输出电压值。如出现缺相、三相不平衡等情况,则模块或驱动板等有故障在输出电压正常(无缺相、三相平衡)的情况下,带载测试。测试时最好是满负载测试。 以上操作完成了我们基本就可以确定变频器通电后无......
    器是电磁调速电机调速器的核心元件之一,如果电容器出现故障,会导致电机无法正常启动或者转速不稳定。   继电器故障:继电器负责控制电流的大小和方向,如果继电器出现故障,会导致电机无法正常启动......
    STM32G0复位后死机;引言 有客户反映,STM32G071RBT6 在使用 STM32CubeProgrammer 烧录完程序后只能运行一次,复位后,程序无法运行,如果掉电后重新上电,程序恢复正常......
    工程师笔记|STM32G0 复位后死机;引言 有客户反映,STM32G071RBT6 在使用 STM32CubeProgrammer 烧录完程序后只能运行一次,复位后,程序无法运行,如果掉电后重新上电......
    工程师笔记 | STM32G0 复位后死机;引言 有客户反映,STM32G071RBT6 在使用 STM32CubeProgrammer 烧录完程序后只能运行一次,复位后,程序无法运行,如果掉电后重新上电......
    。可能是电源开关断路,线路短路、开路等导致电源无法供电。此时需要排除电源故障,确保电源正常。   电机接线故障:如果电机接线不当,可能会导致电机无法正常启动。可以检查电机接线是否正确,电机......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>