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

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

3天内不再提示

不复位MCU继续调试的方法

STM32单片机 来源:STM32单片机 2024-01-26 09:25 次阅读

01前言

产品开发时,经常会碰到在测试过程中或设备出厂后才发现程序异常,但当重新对设备仿真调试时却复现不出现场的问题,或者只通过保存的日志信息艰难分析代码运行到了何处而导致的异常。

遇到这种场景,也并非无路可循。原则上只要我们通过仿真器调试时,做到代码不被重新下载覆盖,MCU 不被复位,就可能保留当前程序运行的状态,让 Bug 无处藏身。

02实现方法

首先,我们将编译完成的工程烧录到 MCU,保证 MCU 中所运行的代码与要仿真的工程代码一致,这样从 MCU 获取的程序位置才能与调试符号信息一致。

不同的编译器可以通过不同的方法进行设置,但其目的和最终能达到的效果是一致的。我们就对常用的 MDK、IAR、STM32CubeIDE 三种不同编译器分别进行设置,使 MCU 在不复位的状态下继续调试。

03MDK

1. 新建一个.ini 文件,在文件中写入以下内容:LOAD %L INCREMENTAL,并加载到Initialization File,同时取消 Load Application at Startup 的选项。

8bd718d0-bb67-11ee-8b88-92fbcf53809c.jpg

8bec1ce4-bb67-11ee-8b88-92fbcf53809c.jpg

这个脚本的目的是加载编译生成的.axf 文件到 MDK 中,该文件包含 bin 代码和调试相关的各种符号信息,以定位我们的 C 源码。

关于其语法说明,可参考 MDK 的 uVision User’s Guide。

8bf3991a-bb67-11ee-8b88-92fbcf53809c.jpg

2. 去掉 Reset after Connect 选项

8bfee34c-bb67-11ee-8b88-92fbcf53809c.jpg

3. 去掉 Update Target before Debugging

8c0a0902-bb67-11ee-8b88-92fbcf53809c.jpg

4. 完成上述配置后,就可以在 MCU 不复位的情况下,像正常调试一样加断点调试了。

04IAR

使用 IAR 时,无需额外设置,直接使用其自带的功能“Attach to Running Target”即可实现。

8c1d226c-bb67-11ee-8b88-92fbcf53809c.jpg

05STM32CubeIDE

在 STM32CubeIDE 中,配置比较灵活,可以复制一个 Debug 的配置,并在这个基础上进行修改。

8c302984-bb67-11ee-8b88-92fbcf53809c.jpg

1. 配置 Debugger->Reset behaviour Type 为 None

8c3b3130-bb67-11ee-8b88-92fbcf53809c.jpg

2. 在 Debugger->Misc 中取消 Verify flash download 选项

8c4ff7aa-bb67-11ee-8b88-92fbcf53809c.jpg

3. 在 Startup->Load Image and Symbols 中编辑下载代码时的操做方式。并取消Download 选项

8c5ab96a-bb67-11ee-8b88-92fbcf53809c.jpg

8c6e6ae6-bb67-11ee-8b88-92fbcf53809c.jpg

4. 在 Debug 时,用上述配置完的调试配置,即可同样实现不复位的调试

8c7ec260-bb67-11ee-8b88-92fbcf53809c.jpg

06总结

利用上述不复位 MCU 继续调试的方法,能够保全现场的运行状态,重新接上仿真器即可对程序进行断点调试、单步执行等操作。对查找 Bug,发现并定位问题点,尤其对不易复现的偶发性故障十分有用。但是当 RDP Level≠0 时,因为已经开启了读保护,所以无法通过上述方法调试。

审核编辑:汤梓红

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

    关注

    146

    文章

    16018

    浏览量

    343636
  • 调试
    +关注

    关注

    7

    文章

    527

    浏览量

    33625
  • 编译器
    +关注

    关注

    1

    文章

    1577

    浏览量

    48617
  • 烧录
    +关注

    关注

    8

    文章

    221

    浏览量

    35191

原文标题:实战经验 | 调试小技巧之不复位调试

文章出处:【微信号:STM32_STM8_MCU,微信公众号:STM32单片机】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    S32K1XX系列MCU复位问题的解决方法

    最近有朋友调试S32K1XX系列的一块控制板,遇到了一个奇怪的问题,就是板子不断复位,无法连接下载器,而且问题找不到,于是我协助他调试了一下,然后最后发现竟然是芯片内部的复位导致的,而
    发表于 08-23 13:03 1058次阅读
    S32K1XX系列<b class='flag-5'>MCU</b><b class='flag-5'>复位</b>问题的解决<b class='flag-5'>方法</b>

    自动复位复位后sp=07H,为什么不复位后直接使sp=30H?

    上课老师讲到自动复位复位后sp=07H,为什么不复位后直接使sp=30H,这样就不用重新定义赋值,英特尔公司当初这样设置目的和原因何在?
    发表于 03-25 22:22

    cc2650 OAD结束后不复位,为什么?

    Device Monitor的OAD功能,看上去可以向cc2650传输OADbin.bin,但OAD结束后,cc2650不复位;3.在1基础上,调试OADTarget工程的CC2640App
    发表于 03-28 16:17

    请问28033有可能出现死机但是不复位的情况吗?

    鄙人做的是开关电源,在最恶劣工况加载时,DSP什么反应都没有,也不复位,系统成了一块砖,我之前的类似工况,DSP都是***扰的复位的,这次怎么不复位也不工作呢?有达人指点一下吗?
    发表于 10-08 16:55

    看门狗导致mcu不停复位的原因

    由于在standby mode,看门狗仍然能继续工作,但是其他时钟都关闭了,没法喂狗,这样会导致mcu不停复位。网上找的方法如下:1. 开启RTC,定期喂狗后再次睡眠。该
    发表于 07-30 07:44

    IDE设置步骤有哪些

    使用场景:当MCU运行时出现Bug,但没有在线调试;此时可以使用该方法,在不复位的情形下捕捉代码当前运行到的位置,继续在线
    发表于 11-01 07:09

    FS6500 MCU复位后有什么方法可以修复SBC复位

    我正在使用 SBC FS6500 芯片。目前,SBC 会在 MCU复位后发生复位(软复位:表示 SBC 无法关闭电源,因为 SBC 为 MCU
    发表于 03-29 06:24

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

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

    IAR退出调试时如何让MCU继续运行?

    RT,每次退出调试要给板子重新上电MCU才运行,如何在退出时继续运行?
    发表于 10-20 06:53

    哪些因素会导致MCU复位

    调试MCU时,经常会遇到复位的情况。要找到复位的原因,我们就需要了解到有哪些因素会导致MCU复位
    的头像 发表于 11-10 16:32 8968次阅读
    哪些因素会导致<b class='flag-5'>MCU</b><b class='flag-5'>复位</b>

    KEIL/MDK中使用JLINK调试器挂载正在运行中的MCU

    使用场景:当MCU运行时出现Bug,但没有在线调试;此时可以使用该方法,在不复位的情形下捕捉代码当前运行到的位置,继续在线
    发表于 10-25 18:36 13次下载
    KEIL/MDK中使用JLINK<b class='flag-5'>调试</b>器挂载正在运行中的<b class='flag-5'>MCU</b>

    初始化mcu程序选用32k_MCU有多少种复位因素

    调试MCU时,经常会遇到复位的情况。要找到复位的原因,我们就需要了解到有哪些因素会导致MCU复位
    发表于 12-05 10:36 6次下载
    初始化<b class='flag-5'>mcu</b>程序选用32k_<b class='flag-5'>MCU</b>有多少种<b class='flag-5'>复位</b>因素

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

    此时此刻有一种调试需求是朋友们非常想要的:一旦程序出了问题,我只需要插上仿真器,目标硬件不会复位,而是与我当前所调试的程序同步,类似于仿真程序的时候的“全速运行”,然而通过添加断点,便可查看程序具体的运行状态,内存等等信息,让b
    的头像 发表于 05-12 15:43 1019次阅读

    MCU不复位调试的小技巧

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

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

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