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
    +关注

    关注

    146

    文章

    16002

    浏览量

    343479
  • 仿真
    +关注

    关注

    50

    文章

    3872

    浏览量

    132143

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

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

收藏 人收藏

    评论

    相关推荐

    STM32H750如何使用IAR调试运行在外部SDRAM的程序?

    (.mac file)脚本,在程序下载前,运行脚本初始化外部SDRAM,然后直接下载程序到外部SDRAM。 然后就要像在内存中调试代码一样
    发表于 04-01 07:40

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

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

    MCU复位RAM会保持吗,如何实现复位时变量数据保持

    在使用MCU时,通常大家默认MCU复位时RAM会被复位清零,那实际MCU复位时RAM是什么状态?
    的头像 发表于 03-01 09:32 541次阅读
    <b class='flag-5'>MCU</b><b class='flag-5'>复位</b>RAM会保持吗,如何实现<b class='flag-5'>复位</b>时变量数据保持

    MCU不复位调试的小技巧

    场景,也并非无路可循。原则上只要我们通过仿真器调试时,做到代码不被重新下载覆盖,MCU 不被复位,就可能保留当前程序运行的状态,让 Bug
    发表于 02-26 11:30 178次阅读
    <b class='flag-5'>MCU</b><b class='flag-5'>不复位</b><b class='flag-5'>调试</b>的小技巧

    不复位MCU继续调试的方法

    在产品开发时,经常会碰到在测试过程中或设备出厂后才发现程序异常,但当重新对设备仿真调试时却复现不出现场的问题,或者只通过保存的日志信息艰难分析代码运行到了何处而导致的异常。
    的头像 发表于 01-26 09:25 329次阅读
    <b class='flag-5'>不复位</b><b class='flag-5'>MCU</b>继续<b class='flag-5'>调试</b>的方法

    idea如何多次运行程序

    在计算机编程的世界中,我们通常需要多次运行程序来测试其性能、调试错误或者进行大规模的数据处理。但是有些编程初学者可能会困惑于如何多次运行程序的问题。本文将会详细介绍如何多次运行程序的不
    的头像 发表于 12-06 14:59 588次阅读

    STM8上电不复位自动运行程序是什么情况?

    必须要手动按复位才会执行,这是什么情况
    发表于 10-24 08:13

    IAR调试中不同复位类型的介绍

    IAR调试中不同复位类型的介绍在IAR 环境下调试有不同的复位类型,其中一些只复位内核不复位
    发表于 10-19 07:54

    对步进电机控制运行,在停止的时候会直接导致MCU复位的原因?

    为什么会在电机停止运行的时候导致MCU复位
    发表于 10-12 07:14

    如何在Keil uVision3 IDE中基于ARM开发板调试运行程序

    本应用笔记介绍如何在Keil uVision3 IDE中基于ARM的开发板上调试运行程序。 与更传统的JTAG协议转换器(如多ICE)不同,本文重点介绍了使用带有JTAG编程加密狗的H-JTAG
    发表于 08-29 06:21

    变频器投入运行调试步骤

    通常按照变频器空载试运行、变频器带电机空载运行和带负荷调试运行三个步骤来完成,下面对这三个步骤详细介绍。
    发表于 08-18 09:20 578次阅读

    KEIL调试STM32在运行在打断点位置后芯片复位是什么原因导致的

    如题,在用Keil仿真时,在断点满足的地方,芯片复位,有可能是什么原因导致的呢?现象是这样:我运行程序,在某个条件中设下断点,然后等外面条件成立后,按理说程序会停在断点位置,但是实际上芯片被
    发表于 08-07 06:25

    用KEIL调试新唐51单片机的时候,在调试运行时点击停止运行后,源文件栏出现反汇编文件如何解决?

    我用KEIL调试新唐51单片机的时候,在调试运行时点击停止运行后,源文件栏出现反汇编文件,指针也指向了反汇编文件,有没有人知道怎么解决?
    发表于 06-15 06:55

    MPC5748G LCEVB为什么不能直接在Flash中烧录运行程序

    执行。 不知道是不是我的项目设置有问题导致我不能直接在Flash中烧录运行程序。 或者,是否有一个我可以测试的示例允许我将程序刻录到闪存中并在电源循环后继续使用它? 我已经尝试在 MPC5748G SDK 示例项目中
    发表于 05-24 08:47

    如何使用官方例程调试运行新电机,需要修改哪些参数?

    您好,如何使用官方例程调试运行新电机,需要修改哪些参数
    发表于 05-17 07:08