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

    文章

    19116

    浏览量

    403521
  • 仿真
    +关注

    关注

    55

    文章

    4534

    浏览量

    138652

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

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

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    使用 VS Code 和 cortex-debug 调试运行 Zephyr OS 的 MR-CANHUBK3,是否有可供下载的 SVD 文件?

    我们想使用 VSCode 和 cortex-debug 调试运行 Zephyr OS 的 MR-CANHUBK3。需要一个 SVD 文件才能查看寄存器值。 是否有可供下载的 SVD 文件?
    发表于 04-20 11:45

    变频器带载调试步骤

    )。下面的步骤是一个通用的调试流程,你在实际操作中可以作为参考。 带载调试核心步骤 安全连接与低速启动 连接负载 :将电机与负载的联轴器可靠连接,确保所有机械安装牢固。 点动试运行 :先在极低频率(如2-5Hz)下点动电机
    的头像 发表于 03-12 12:04 248次阅读
    变频器带载<b class='flag-5'>调试</b>步骤

    如何用外部复位电路对MCU系列芯片进行复位

    怎么样用外部复位电路对MCU系列芯片进行复位
    发表于 01-12 09:05

    CW32在不同复位方式对应的复位范围

    上电复位 / 掉电复位(POR/BOR) 整个 MCU 引脚输入复位(NRST) 整个 MCU(除 RTC 外) IWDT/WW
    发表于 12-22 09:44

    如何给Gokit3烧录程序(MCU+FlyMcu版)

    在本文中,我们将详细讲解如何为机智云的Gokit3MCU模式进行程序烧录,特别是针对FlyMcu版本的应用。本次烧录采用了串口方式,这是给MCU烧录程序的常用方法之一。借助FlyMcu
    的头像 发表于 12-17 18:46 576次阅读
    如何给Gokit3烧录<b class='flag-5'>程序</b>(<b class='flag-5'>MCU</b>+FlyMcu版)

    机智云Gokit3开发篇:ST-Link烧录MCU程序操作详解

    本文主要介绍如何为机智云Gokit3的MCU模式进行程序烧录(ST-Link版)。由于Gokit3底板采用的是STM32芯片,针对ST的MCU,推荐使用以下两种烧录方式。首先,使用ST-Link
    的头像 发表于 12-17 18:46 650次阅读
    机智云Gokit3开发篇:ST-Link烧录<b class='flag-5'>MCU</b><b class='flag-5'>程序</b>操作详解

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

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

    按下复位键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