01前言 在产品开发时,经常会碰到在测试过程中或设备出厂后才发现程序异常,但当重新对设备仿真调试时却复现不出现场的问题,或者只能通过保存的日志信息艰难分析代码运行到了何处而导致的异常。 # E" U/ n7 M, c0 O/ V2 T4 x 遇到这种场景,也并非无路可循。原则上只要我们通过仿真器调试时,做到代码不被重新下载覆盖,MCU 不被复位,就可能保留当前程序运行的状态,让 Bug 无处藏身。 3 _1 k- @% a2 t4 V* a0 c# X6 a 02实现方法 首先,我们将编译完成的工程烧录到 MCU,保证 MCU 中所运行的代码与要仿真的工程代码一致,这样从 MCU 获取的程序位置才能与调试符号信息一致。 3 }2 l Z& U4 ^% [$ B/ a& i% r & b; b1 p$ v i" r7 h8 f$ Z/ m 不同的编译器可以通过不同的方法进行设置,但其目的和最终能达到的效果是一致的。我们就对常用的 MDK、IAR、STM32CubeIDE 三种不同编译器分别进行设置,使 MCU 在不复位的状态下继续调试。 03MDK1 m" Q0 S) V5 S( U5 t1 i$ X 1. 新建一个.ini 文件,在文件中写入以下内容:LOAD %L INCREMENTAL,并加载到Initialization File,同时取消 Load Application at Startup 的选项。 & y4 F0 V% e3 c , z( S1 T+ ~ k$ N/ l 7 B; u& }* n) f# L; n 这个脚本的目的是加载编译生成的.axf 文件到 MDK 中,该文件包含 bin 代码和调试相关的各种符号信息,以定位我们的 C 源码。 4 R# ~' h8 T4 P$ u% b+ o 关于其语法说明,可参考 MDK 的 uVision User’s Guide。 2. 去掉 Reset after Connect 选项8 [& D5 l6 `5 J9 @( @( g" _1 J/ ^ ) a4 W3 y7 h# P0 b3 C6 U8 B ) e+ l- o& E% ?! h2 U 3. 去掉 Update Target before Debugging 1 Z! @& W; s* [' V5 d ) O# N8 H0 g" U3 f- @( T" k : D+ I4 X2 m# f7 W8 e7 J 4. 完成上述配置后,就可以在 MCU 不复位的情况下,像正常调试一样加断点调试了。 & d' D; D( x# ^$ B 2 b+ e& n7 t6 _6 T4 b4 A , ]( O! b5 x$ c4 l& p3 q 04IAR% U9 X/ w, Q/ p 使用 IAR 时,无需额外设置,直接使用其自带的功能“Attach to Running Target”即可实现。 9 V: ~$ `5 @2 _ : l4 ?4 Y/ F3 \ & {% l6 s6 s7 B : }$ h0 K7 b# I0 y, m0 @ 05STM32CubeIDE 在 STM32CubeIDE 中,配置比较灵活,可以复制一个 Debug 的配置,并在这个基础上进行修改。 % I# r1 G/ q: M. Y% o. u8 s- \ 6 T6 w( @. o9 y . ?4 K* Y, t3 Q" G7 b" ] 3 w, p" F6 V8 n$ H % U3 d- l5 `4 c! w9 x6 F" }0 G 1. 配置 Debugger->Reset behaviour Type 为 None6 i. T/ v0 O/ {/ Q8 `/ v5 f ' K8 H4 i( f' k 2. 在 Debugger->Misc 中取消 Verify flash download 选项 P% j3 ^9 ~7 g2 [- f. I, s* I - i# d1 \# R# p 3. 在 Startup->Load Image and Symbols 中编辑下载代码时的操作方式。并取消Download 选项8 l7 M0 D; S" X3 V 4 _7 J7 h- Y5 g3 X( `2 ?2 ]$ z / F% N/ w, Y ^7 m# ]' N* g8 h: _& j7 u * ]; y% h* q4 T$ p 4. 在 Debug 时,用上述配置好的调试配置,即可同样实现不复位的调试 / M$ J/ C ?9 s4 ~ : t. `5 T4 c" o$ q# t . n6 F& L) l" l% s/ M7 {* U4 e 06总结% v7 e% D7 d0 c8 X h- c 利用上述不复位 MCU 继续调试的方法,能够保全现场的运行状态,重新接上仿真器即可对程序进行断点调试、单步执行等操作。对查找 Bug,发现并定位问题点,尤其对不易复现的偶发性故障十分有用。但是当 RDP Level≠0 时,因为已经开启了读保护,所以无法通过上述方法调试' z! O+ ]3 _9 ^! J: J* r & O3 ~: l8 ?( a- m# j 转载自: STM32单片机2 y* @, q2 Z! L! M: ?$ I$ u ( [) r( y6 w2 A0 Q9 @+ }. d 如有侵权请联系删除 6 @ Q8 f4 Q0 n `3 t5 d * y0 D, k! a4 d3 C |
【STM32C0测评】外部中断控制小灯
【STM32C0评测】1、开箱,芯片介绍以及后续的评测计划
基于STM32调试小技巧之不复位调试
基于STM32利用TIMER测量信号周期及占空比的精度经验分享
STM32应用笔记分类汇总 v1.2
获取编译时间作为版本号
【12月学习笔记】 STM32H7B3I-DK在STWin中显示汉字
意法半导体发布远距离无线微控制器,提高智能计量、智能建筑和工业监控的连接能效
基于STM32低功耗模式经验分享
基于STM32 代码及频率测量方法经验分享
好资料,学习~~~
值得收藏