01前言 在产品开发时,经常会碰到在测试过程中或设备出厂后才发现程序异常,但当重新对设备仿真调试时却复现不出现场的问题,或者只能通过保存的日志信息艰难分析代码运行到了何处而导致的异常。 遇到这种场景,也并非无路可循。原则上只要我们通过仿真器调试时,做到代码不被重新下载覆盖,MCU 不被复位,就可能保留当前程序运行的状态,让 Bug 无处藏身。# D6 K- O- ~) Z/ Q1 J2 D/ ^ 02实现方法 r. R& I7 S" j 首先,我们将编译完成的工程烧录到 MCU,保证 MCU 中所运行的代码与要仿真的工程代码一致,这样从 MCU 获取的程序位置才能与调试符号信息一致。 - E3 V" M" y& O1 D 不同的编译器可以通过不同的方法进行设置,但其目的和最终能达到的效果是一致的。我们就对常用的 MDK、IAR、STM32CubeIDE 三种不同编译器分别进行设置,使 MCU 在不复位的状态下继续调试。 2 S8 K, m! o5 u' T 03MDK 1. 新建一个.ini 文件,在文件中写入以下内容:LOAD %L INCREMENTAL,并加载到Initialization File,同时取消 Load Application at Startup 的选项。 0 r, ?% d) H% G8 n. K+ ~8 a$ o 2 I$ T& v( B5 I7 n . E# e, H- a6 g* ~' X4 k* ] 这个脚本的目的是加载编译生成的.axf 文件到 MDK 中,该文件包含 bin 代码和调试相关的各种符号信息,以定位我们的 C 源码。 - n# q$ [! H+ u+ u : I- P. S6 B* j/ K 关于其语法说明,可参考 MDK 的 uVision User’s Guide。% r Q8 B' I$ w7 j) S# C $ l! \* q% S3 F7 T) x 8 v0 U8 Z1 n+ w* @ % I9 _8 Y8 |+ U1 _ 2. 去掉 Reset after Connect 选项1 E) P& M ^2 s7 {$ z- [0 ` p 3 E: f4 [- t" o 3. 去掉 Update Target before Debugging. H+ p% a* x! b' R8 Q7 i, m+ ] % T6 X/ \$ S8 L# ? 4. 完成上述配置后,就可以在 MCU 不复位的情况下,像正常调试一样加断点调试了。 5 H4 L" H- o+ ?$ {( \) X 04IAR2 R l) ~2 w7 a5 `2 b0 w" v8 m/ U 使用 IAR 时,无需额外设置,直接使用其自带的功能“Attach to Running Target”即可实现。 05STM32CubeIDE 在 STM32CubeIDE 中,配置比较灵活,可以复制一个 Debug 的配置,并在这个基础上进行修改。 5 D8 ?" d. j! a' s 2 J; o& D# ~* b w0 v" W y 1. 配置 Debugger->Reset behaviour Type 为 None 2. 在 Debugger->Misc 中取消 Verify flash download 选项 9 P/ Y8 P0 F8 X& S ?" `9 N0 B 3. 在 Startup->Load Image and Symbols 中编辑下载代码时的操作方式。并取消Download 选项 & {# Z7 u+ u% n / B) i# ]1 H! B, v+ r 6 U' ?1 \0 Y, b0 b, U 4. 在 Debug 时,用上述配置好的调试配置,即可同样实现不复位的调试" W1 `+ G' @ f7 o& A8 W / o" p+ T0 Z2 k$ V0 _ + |5 D3 S/ u' B/ W/ j$ X* H 06总结/ G! n6 o5 [/ u- }; P 利用上述不复位 MCU 继续调试的方法,能够保全现场的运行状态,重新接上仿真器即可对程序进行断点调试、单步执行等操作。对查找 Bug,发现并定位问题点,尤其对不易复现的偶发性故障十分有用。但是当 RDP Level≠0 时,因为已经开启了读保护,所以无法通过上述方法调试 * `9 w: `& Y4 |( S1 J$ V$ y3 T5 f 转载自: STM32单片机* c/ } p3 o& t+ _- k" D+ p2 U 如有侵权请联系删除' Z! u# t p+ r3 ? 6 l% x: [8 }0 F. G1 |+ M |
好资料,学习~~~
值得收藏