历史上的今天
返回首页

历史上的今天

今天是:2026年02月06日(星期五)

正在发生

2023年02月06日 | 不复位MCU直接调试运行程序,让bug闻风丧胆

2023-02-06 来源:zhihu

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内部仿真模块进行通信,从而完成调试信息的交互和控制。


推荐阅读

史海拾趣

虹冠电子(Champion)公司的发展小趣事

虹冠电子注重全球市场的拓展,通过建立完善的营销网络和合作伙伴关系,将产品销往世界各地。公司在新竹、汐止以及美国硅谷等地设有研发中心和生产基地,能够为客户提供及时、高效的技术支持和服务。同时,虹冠电子还与国内优秀的晶圆封测大厂等合作伙伴建立了紧密的合作关系,共同推动电源管理技术的发展和应用。

GE Sensing ( Amphenol Advanced Sensors )公司的发展小趣事

虹冠电子注重全球市场的拓展,通过建立完善的营销网络和合作伙伴关系,将产品销往世界各地。公司在新竹、汐止以及美国硅谷等地设有研发中心和生产基地,能够为客户提供及时、高效的技术支持和服务。同时,虹冠电子还与国内优秀的晶圆封测大厂等合作伙伴建立了紧密的合作关系,共同推动电源管理技术的发展和应用。

Autonics公司的发展小趣事

Autonics始终将产品质量放在首位,建立了严格的质量管理体系。公司引进了先进的生产设备和检测设备,确保产品的生产和质量控制达到国际先进水平。同时,Autonics还积极申请并获得了多项国际产品质量认证,如ISO9001、UL、CE等,进一步提升了产品的竞争力和市场认可度。

Belkin公司的发展小趣事

贝尔金的成功不仅仅局限于美国本土。随着全球市场的不断扩张,贝尔金也在全球范围内建立了广泛的销售网络和物流中心。位于加州洛杉矶的总部、好莱坞的工业设计中心以及纽约州罗切斯特的研发机构,共同构成了贝尔金全球业务的核心。这些机构之间的紧密合作,确保了贝尔金能够迅速响应全球市场的需求,提供高品质的产品和服务。

Displaytech公司的发展小趣事

2012年,Displaytech进行了公司重组,SEACOMP成为公司各部门的主要实体。这次重组不仅优化了公司的组织架构,也进一步整合了公司的资源,提高了运营效率。同时,公司还在中国东莞购买了一家制造工厂,命名为MH MFG,加强了电子合同制造部门的力量。

这些故事只是Displaytech公司发展历程中的一部分,但它们充分展示了公司在电子行业中的实力、创新精神和国际化视野。通过不断的技术创新、产品升级和市场拓展,Displaytech已经成为电子行业中一家具有影响力的企业。

DIOO公司的发展小趣事

随着市场竞争的加剧和消费者需求的不断变化,DIOO公司意识到品牌重塑和多元化发展的重要性。在近几年中,DIOO公司加强了品牌宣传和推广力度,通过推出新的品牌形象和广告活动,提高了品牌知名度和美誉度。同时,DIOO公司还积极拓展产品线,推出了包括智能家居、智能穿戴设备、游戏硬件等在内的多元化产品系列,进一步满足了消费者的多样化需求。

问答坊 | AI 解惑

NXP LPC1343 开发板 学习之旅(一)

前些天在完成了NXP LPC1343开发板 学习之旅序言后,继续研习一些基础知识,所谓工欲善其事必先利其器吗,但是学习完后就没有时间来和大家一起分享和讨论下,有时候,跟产品打交道就是比较麻烦,硬件很稳定了,又要降价,到处找便宜的可替代的芯片, ...…

查看全部问答>

高速SPI的速度最高能够到达多少?10MBPS的高速SPI在WINCE下能不能接收的过来?我接收的前面数据老是会被后面的冲掉。

高速SPI的速度最高能够到达多少?10MBPS的高速SPI在WINCE下能不能接收的过来?我接收的前面数据老是会被后面的冲掉。…

查看全部问答>

BWSCON的bank1对应K9F8G08UOM-PCB0,应该设置多大位宽?

K9F8G08UOM-PCB0这芯片的pdf谁有?在2442的boot里我应该将BWSCON对应的位设置为多少位宽?16-bit or 32-bit? 有的请上传个连接,邮箱最好:haiou_arm@163.com,嘿嘿 谢谢!…

查看全部问答>

加油机程序开发

有加油机程序开发软件,联系我13071555550…

查看全部问答>

关于i.MX27+nandflash(K9F2G08ROA)+wince的FATFS分区挂载问题

这个问题困扰了我好几天了,拜托大家帮帮忙看看是怎么回事了,帖子也看了无数了,但是还是找不到解决办法。 问题的具体情况是这样的,eboot中将nandflash分出了一个BINFS的分区,然后进到系统中可以看到两个分区分别为     1. part00( ...…

查看全部问答>

问一个LoadString的问题

看到一段代码,不明白 PBYTE pRes; pRes = (PBYTE)LoadString (hInst, IDS_DOITEXT , NULL, 0) // Get the length of the string resource int nLen = *(PWORD)(pRes-2) * sizeof (TCHAR); MSDN上面说,字符串资源的字符长度在字符串起始 ...…

查看全部问答>

【M3 入门开发】TI M3 最实用、最便宜的开发板--谈谈 TI M3 的入门

有很多朋友问我,怎么快速入门 TI M3 ,是不是很难,是不是要买很贵的开发板。 其实真的不需要很贵的开发板,有下面这个小黑板,一样可以学好 M3. M3 的开发我个人对软件部分比较感兴趣。我也希望在这里让更多的朋友来学习到 TI M3. 学习都是由 ...…

查看全部问答>

关于AVR STUDIO的使用问题

使用AVR STUDIO 调入ICCAVR的COF文件,接上开发板和JTAG线,弹出一个框:  …

查看全部问答>

2012 TI 微控制器研习班正式招募中

一季度培训课程:MSP 430 Launch Pad - 议程 有点晚了,明天有空的朋友们可以去学习下。3月22日 深圳市南山区华侨城兴隆街汉唐大厦19楼广州市天河区林和西路161号中泰国际广场写字楼B塔1105单元 东莞市常平镇志兴国际商务大厦B座1109室南京市白 ...…

查看全部问答>