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

    文章

    16848

    浏览量

    349787
  • 仿真
    +关注

    关注

    50

    文章

    4015

    浏览量

    133311

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

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

收藏 人收藏

    评论

    相关推荐

    变频器调试的前期准备和试运行

    一、前期准备 1. 确定调试目标 在开始调试之前,首先需要明确调试的目标。这包括确定所需的输出频率范围、电压范围、额定电流等关键参数。这些参数将直接影响变频器的设定和后续的
    的头像 发表于 09-09 15:28 294次阅读

    广西柳州的思必驰智能制造基地正式投入试运行

    近日,随着一台台智能智造设备的陆续进厂和调试完成,位于广西柳州的思必驰智能制造基地正式投入试运行
    的头像 发表于 05-29 10:32 403次阅读

    请问stm8l101p3u为什么进入halt之后看门狗不复位

    在网上查了半天,很多人都是说halt之后不想让看门狗运行却停不下来,为什么到了我这我想halt之后看门狗继续运行它反而不复位了呢?? 看门狗的代码 RST_ClearFlag
    发表于 05-13 07:01

    用Keil上下载按钮下载执行程序直接断电执行程序,有什么不一样?

    在连接上J-Link或者ST-Link的时候,可以直接在Keil上点击下面的按钮下载程序并执行程序(当然要勾选下载复位后自动执行) 想问的是,这样下载
    发表于 05-06 06:43

    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 2235次阅读
    <b class='flag-5'>MCU</b><b class='flag-5'>复位</b>RAM会保持吗,如何实现<b class='flag-5'>复位</b>时变量数据保持

    MCU不复位调试的小技巧

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

    如何排查GD32 MCU复位是由哪个复位源导致的?

    上期为大家讲解了GD32 MCU复位包括电源复位和系统复位,其中系统复位还包括独立看门狗复位、内
    的头像 发表于 02-03 09:46 1615次阅读
    如何排查GD32 <b class='flag-5'>MCU</b><b class='flag-5'>复位</b>是由哪个<b class='flag-5'>复位</b>源导致的?

    GD32 MCU电源复位和系统复位有什么区别

    GD32 MCU复位分为电源复位和系统复位,电源复位又称为冷复位,相较于系统
    的头像 发表于 02-02 09:37 1378次阅读
    GD32 <b class='flag-5'>MCU</b>电源<b class='flag-5'>复位</b>和系统<b class='flag-5'>复位</b>有什么区别

    不复位MCU继续调试的方法

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

    GD32 MCU进入低功耗模式导致无法再进行程序下载怎么办?

    很多朋友在调试GD32 MCU的低功耗模式时会遇到一个问题:程序中让MCU进入了Sleep、Deepsleep或者Standby模式,之后MCU
    的头像 发表于 01-12 09:41 3107次阅读
    GD32 <b class='flag-5'>MCU</b>进入低功耗模式导致无法再进<b class='flag-5'>行程序</b>下载怎么办?

    idea如何多次运行程序

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

    运行Python程序的几种常见方法

    方法: 使用Python解释器 Python解释器是运行Python程序的基本工具。在命令行中输入 python 命令,即可启动解释器。然后输入程序代码,按回车即可执行。这种方法适用于简单的
    的头像 发表于 11-28 15:32 2270次阅读

    python怎么运行程序

    Python是一种广泛使用的编程语言,它的简易和可读性使得它成为初学者和专业开发人员的首选。在运行Python程序之前,您需要安装Python解释器,然后按照以下步骤进行操作。 步骤1:安装
    的头像 发表于 11-24 09:25 2455次阅读