不复位MCU继续调试的方法

01前言
在产品开发时,经常会碰到在测试过程中或设备出厂后才发现程序异常,但当重新对设备仿真调试时却复现不出现场的问题,或者只通过保存的日志信息艰难分析代码运行到了何处而导致的异常。 
遇到这种场景,也并非无路可循。原则上只要我们通过仿真器调试时,做到代码不被重新下载覆盖,mcu 不被复位,就可能保留当前程序运行的状态,让 bug 无处藏身。
02实现方法
首先,我们将编译完成的工程烧录到 mcu,保证 mcu 中所运行的代码与要仿真的工程代码一致,这样从 mcu 获取的程序位置才能与调试符号信息一致。 
不同的编译器可以通过不同的方法进行设置,但其目的和最终能达到的效果是一致的。我们就对常用的 mdk、iar、stm32cubeide 三种不同编译器分别进行设置,使 mcu 在不复位的状态下继续调试。
03mdk
1. 新建一个.ini 文件,在文件中写入以下内容:load %l incremental,并加载到initialization file,同时取消 load application at startup 的选项。
这个脚本的目的是加载编译生成的.axf 文件到 mdk 中,该文件包含 bin 代码和调试相关的各种符号信息,以定位我们的 c 源码。 
关于其语法说明,可参考 mdk 的 uvision user’s guide。
2. 去掉 reset after connect 选项
3. 去掉 update target before debugging
4. 完成上述配置后,就可以在 mcu 不复位的情况下,像正常调试一样加断点调试了。
04iar
使用 iar 时,无需额外设置,直接使用其自带的功能“attach to running target”即可实现。
05stm32cubeide
在 stm32cubeide 中,配置比较灵活,可以复制一个 debug 的配置,并在这个基础上进行修改。
1. 配置 debugger->reset behaviour type 为 none
2. 在 debugger->misc 中取消 verify flash download 选项
3. 在 startup->load image and symbols 中编辑下载代码时的操做方式。并取消download 选项
4. 在 debug 时,用上述配置完的调试配置,即可同样实现不复位的调试
06总结
利用上述不复位 mcu 继续调试的方法,能够保全现场的运行状态,重新接上仿真器即可对程序进行断点调试、单步执行等操作。对查找 bug,发现并定位问题点,尤其对不易复现的偶发性故障十分有用。但是当 rdp level≠0 时,因为已经开启了读保护,所以无法通过上述方法调试。


美联航首架波音787-10梦想飞机正式投入商业运行
富士康内迁过快遭遇新难题 后续管理问题凸显
PowerVR GPU采用PVR3C三重压缩技术来解决问题
ruby到底前景怎么样_ruby前景分析
赛普拉斯TrueTouch单层传感器助力龙旗智能手机触摸屏
不复位MCU继续调试的方法
八代酷睿核显的尴尬,核显遭遇研发瓶颈
基于HBS的分布式智能照明及安防系统的研制
SoC功耗是一个关键的差异化功能
模组化手机玩真的,Lattice、TI名列其中
迎接工业互联网的龙卷风暴,软通动力绘制了一张转型地图
橄榄石型LiFePO4简介
直流动态电阻该如何区别?LED限流电阻阻值如何确定?
ITO玻璃技术之SiO2阻挡膜层规格
边缘计算在智能制造中的解决方案
什么是四层PCB?四层PCB的主要优势
紫米双口qc3.0车充拆解 高性价比爆款车充
为何传统家电还未入局扫地机市场,小米、360纷纷出征?
一体化微气象传感器技术参数
重磅!云听荣获2021年度全国广播电视媒体融合先导单位称号