0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

不复位MCU直接调试运行程序

痞子衡嵌入式 来源:痞子衡嵌入式 作者:痞子衡嵌入式 2022-05-12 15:43 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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_tCnt=0;  8  9/****************************** 10*** Function:测试程序 11*** Author :公众号:最后一个bug 12******************************/ 13 14intmain(void) 15{ 16 17u16times=0; 18delay_init(); 19NVIC_Configuration(); 20uart_init(9600); 21while(1) 22{ 23times++; 24if(times%30==0) 25{ 26printf("golobaldata: ",Cnt++); 27} 28delay_ms(10); 29} 30}

步骤如下:

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

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

a97f9d62-d1b2-11ec-bce3-dac502259ad0.png

a9d8577c-d1b2-11ec-bce3-dac502259ad0.png

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

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

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

aa50abbe-d1b2-11ec-bce3-dac502259ad0.png

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

aa624e28-d1b2-11ec-bce3-dac502259ad0.png

3

验证结果

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

aa73309e-d1b2-11ec-bce3-dac502259ad0.png

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

aa9b3c06-d1b2-11ec-bce3-dac502259ad0.png

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

4

思考

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

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

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

审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • mcu
    mcu
    +关注

    关注

    147

    文章

    18627

    浏览量

    387460
  • 仿真
    +关注

    关注

    53

    文章

    4408

    浏览量

    137677

原文标题:不复位MCU直接调试运行程序,让bug闻风丧胆

文章出处:【微信号:pzh_mcu,微信公众号:痞子衡嵌入式】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    CPU的几种复位方式适合哪些场景?

    1、上电复位 适用场景:系统首次上电或电源以外断电后重新上电时; 2、看门狗复位 适用场景:虚脱程序运行异常,如陷入死循环或长时间无响应时; 3、软件
    发表于 11-27 07:56

    解决程序无法下载问题

    一、队伍介绍 本篇为蜂鸟E203系列分享第二篇,本篇介绍的内容是解决程序无法下载问题。 二、问题提出 下载完NICE_demo后,运行程序,无法得到运行结果,然后新的程序(比如hell
    发表于 10-30 07:35

    按下复位键RTT程序死机正常吗?

    裸机程序都是按下复位键从头运行的,RTT按下复位键不运行属于正常吗? 今天使用野火的板子调试程序
    发表于 09-24 06:38

    请问一下我想用ESP8685直接替换ESP8266而不用写程序,可以让ESP8685直接通过之前ESP8266的外挂的flash运行程序

    请问一下我想用ESP8685直接替换ESP8266而不用写程序,可以让ESP8685直接通过之前ESP8266的外挂的flash运行程序
    发表于 09-17 12:06

    KITT2G-B-HLITE评估板不能运行程序和debug,怎么处理?

    你好, KITT2G-B-HLITE的新板子,尝试运行CM0+最基本的GPIO程序,查看板子上的IC丝印为CYT4BF8CEDQ0AESGS,按照手册命名规则理解,工程中IC宏定义应为
    发表于 07-28 08:23

    keil调试阶段无法进行仿真,能进到仿真界面,但是无法执行程序怎么解决?

    keil调试阶段无法进行仿真,能进到仿真界面,但是无法执行程序,这个怎么解决?烧录器用的是jlink
    发表于 07-18 06:08

    MTB如何在运行时介入Jlink调试器?

    目前我们的应用程序运行时会偶发死机现象,有没有办法能够在CYW43907芯片不复位的情况下介入调试器,查看导致死机的问题
    发表于 07-08 07:46

    STM32U585CIU6移植touchgfx之后stm32不运行程序怎么解决?

    画了一个ui,烧写到单片机之后,软件复位和硬件复位了不运行LED亮,然后进入debug一直是卡着的,找遍了全网都没有看到有类似的问题。各位救救孩子undefined,已经卡了好几天了,不知道怎么办了。
    发表于 06-10 07:05

    移植touchgfx之后stm32不运行程序怎么解决?

    画了一个ui,烧写到单片机之后,软件复位和硬件复位了不运行LED亮,然后进入debug一直是卡着的,找遍了全网都没有看到有类似的问题。各位救救孩子undefined,已经卡了好几天了,不知道怎么办了。
    发表于 06-06 07:43

    为什么无法运行程序“make”(在目录“C:\\?

    FX2LP Build,得到了 14:26:46 **** 为项目 Fx2Test 构建配置调试 **** 全部制作 无法运行程序“make”(在目录“C
    发表于 05-15 08:26

    S32G399A调用Mcu_PerformReset()接口执行功能复位复位后使用Mcu_GetResetReason()读取不到了,为什么?

    MCU_NO_REST_REASON,请问是什么原因呢? 而且直接上电读取的复位源也是MCU_NO_REST_REASON,而不是MCU_P
    发表于 04-04 07:57

    stm32g030j6m6串口如何烧录程序,NRST引脚能否在作为输入IO使用时不复位

    ; 2.使用SWD下载,NRST引脚必须作为输入,但外部输入低电平时,MCU复位。 问:串口如何烧录程序,NRST引脚能否在作为输入IO使用时不复位
    发表于 03-10 07:35

    用stsw-link004这个软件配合仿真器写程序后,直接运行程序程序运行不正常是什么原因?

    用stsw-link004这个软件配合仿真器写程序后,直接运行程序程序运行不正常,必须对电路板进行完全重新上电,程序才能正常
    发表于 03-07 07:00

    中车时代电气助力宁波地铁8号线全线试运行

    近日,一声清脆的汽笛划破宁静的晨曦。宁波地铁8号线6列电客车在完成派班、自动唤醒以及套图等一系列准备工序后,以FAM模式依次平稳地从停车场驶出,正式拉开了宁波地铁8号线全线试运行的序幕。
    的头像 发表于 01-21 13:31 1570次阅读

    是否可以用msp430f5529的开发板直接进行程序调试

    1.ldc1000的Vio是否可以接5v的电压,如果接了,会影响芯片的使用或者损坏芯片吗? 2.是否可以用msp430f5529的开发板直接进行程序调试? 3.附件中的文档讲得是LDC1000
    发表于 01-13 06:07