你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于STM32的不复位调试的经验分享

[复制链接]
STMCU小助手 发布时间:2024-2-29 16:27
01前言% j  Z$ j. v" B
在产品开发时,经常会碰到在测试过程中或设备出厂后才发现程序异常,但当重新对设备仿真调试时却复现不出现场的问题,或者只能通过保存的日志信息艰难分析代码运行到了何处而导致的异常。 . e7 J- k1 K) ]; Y5 z- B+ y4 g

. ~( h. w! f/ G3 s+ @0 ~遇到这种场景,也并非无路可循。原则上只要我们通过仿真器调试时,做到代码不被重新下载覆盖,MCU 不被复位,就可能保留当前程序运行的状态,让 Bug 无处藏身。
# c& T; D5 f7 M# S: p3 J0 G( D
* r9 L% ?% S" V
  l6 C5 K) J# u/ A4 M
02实现方法' e7 A" i  B1 w3 [3 L. `
首先,我们将编译完成的工程烧录到 MCU,保证 MCU 中所运行的代码与要仿真的工程代码一致,这样从 MCU 获取的程序位置才能与调试符号信息一致。
" @' u# C0 B8 P- A7 h) C6 Z- o$ H, Z9 K+ G
不同的编译器可以通过不同的方法进行设置,但其目的和最终能达到的效果是一致的。我们就对常用的 MDK、IAR、STM32CubeIDE 三种不同编译器分别进行设置,使 MCU 在不复位的状态下继续调试。
# H; p0 h: P7 @  j! }" J
% |. `7 [% t! C! }03MDK
) D. E. l# a4 u$ u5 |' W4 z1. 新建一个.ini 文件,在文件中写入以下内容:LOAD %L INCREMENTAL,并加载到Initialization File,同时取消 Load Application at Startup 的选项。8 `: V; q2 W8 H% M; ]+ u  e- ]

4 c7 _5 c! l0 Y0 _

! Q* Q" ^, H9 H9 s1 Y% ^# s  b 微信图片_20240229162337.png - t  e" Y- h' a

+ {7 J' E4 q4 S4 l# @# u
- u) n& ^; c+ r: r+ z
微信图片_20240229162333.jpg
9 p# A8 ^& p4 z1 l4 S1 i, c, f' H+ D4 ~( a. E5 J7 M: r
这个脚本的目的是加载编译生成的.axf 文件到 MDK 中,该文件包含 bin 代码和调试相关的各种符号信息,以定位我们的 C 源码。
. g, y6 m3 ?0 Y0 d" s. S3 Z( E& Q9 |
, u% ^/ e1 U; u
关于其语法说明,可参考 MDK 的 uVision User’s Guide。* f# u- K% y' j+ H

& {  a; C% s  \& f. d8 C
. c9 X% V# {' L
微信图片_20240229162329.jpg
- b% T9 c' Y& {$ W4 s2 E
  l6 ?. u; F2 m0 a1 a9 f( X" |; G. I

3 I! s; i& a' _9 I1 j2. 去掉 Reset after Connect 选项
3 f# m# d& N: ~
! v1 d7 l9 y+ a7 B! x
- h% j2 C, b5 |  Y6 w
微信图片_20240229162325.jpg 6 B+ z# _: F( O) [6 L" V
0 \7 F1 O$ I" k. `" z$ ?

, m, i2 [; h" N* I' x& W  q6 Y3. 去掉 Update Target before Debugging
  Q, g' B% P3 w5 n# l; p0 b) I; N5 l6 o8 O

# k- N8 o# {" [+ v0 c 微信图片_20240229162322.jpg
! X4 j( o" Z$ V  p
" S3 B$ h, ~6 J5 e) K9 `2 ]8 I

& ~# I' n$ j0 K9 j2 a* V) Z4. 完成上述配置后,就可以在 MCU 不复位的情况下,像正常调试一样加断点调试了。+ i9 J; }) o; w

/ A+ |/ K  P) M( g0 d. Z0 h8 x, ~& I3 _
; i3 _3 E% i' ~
04IAR
* C7 d& E5 M/ N* d$ l使用 IAR 时,无需额外设置,直接使用其自带的功能“Attach to Running Target”即可实现。
1 L8 Y2 V, m5 R$ Z+ ~* U; F& v! J" q) h1 E
. n' r* S" @4 \- |/ {2 I
微信图片_20240229162319.jpg
+ B* t( m5 R$ y3 @6 T) G0 F4 K( V+ Z/ P/ z$ j7 ]

  J4 b% j1 i9 ~5 }% N# s05STM32CubeIDE
; C& x: E8 f1 U" j" C' m% \/ y在 STM32CubeIDE 中,配置比较灵活,可以复制一个 Debug 的配置,并在这个基础上进行修改。/ M' x* H/ [- p/ _& C+ |7 R# E
& X9 t; _2 g# j7 W( M4 w

) k/ w! J0 h/ H- e; { 微信图片_20240229162316.jpg
* D& G7 V6 _& R" \6 b8 p0 \) C" d( q) L5 O6 u# y
; }4 Z7 [+ b% k8 m& o
( N& a* l4 C- {2 h7 ^2 _
1. 配置 Debugger->Reset behaviour Type 为 None" @3 W1 ^' [& g! l  Q# }$ {$ a

# P6 _1 d- i! s
9 x9 T. m! Z: y) y" l$ B' k
微信图片_20240229162312.jpg
( r0 a+ S5 Q! M! Z& q& Z% F$ v' B  T- u6 w; v& T) [
2. 在 Debugger->Misc 中取消 Verify flash download 选项
% s/ c$ z, i  X+ T2 q$ {9 m  y
+ G, Q2 R  }% q0 Y$ {

& ?  K$ {9 G7 d& u" g' b 微信图片_20240229162309.jpg
  x* f% a, c4 k' I; j, Q
! d5 _) Q2 l: ~3. 在 Startup->Load Image and Symbols 中编辑下载代码时的操作方式。并取消Download 选项- f( t# B! g, |/ U
- O3 `5 A& E' _" I, F/ a" a
  \* [" I" x. W' y# O6 s
微信图片_20240229162306.jpg
& V% \* M, y3 F, H
$ o3 L4 o8 H. i/ P) L7 H! M 微信图片_20240229162303.jpg
7 \. E. ]4 t9 X) e% S1 W+ n; m8 ?8 c* W# D8 j% a  Y; @) o3 [: k
" N; Y4 f8 i- u- _/ x: l, T1 I
4. 在 Debug 时,用上述配置好的调试配置,即可同样实现不复位的调试; {/ j8 v5 |% c  }1 Z
  ~* T7 {9 L7 Q  F4 \
& ?0 m: b; Q' W9 {* [
微信图片_20240229162259.jpg ' b- K, I% ]! \/ J

* A# Z* U3 R" `
7 s4 Q7 R) C0 L

3 I8 l8 N' f7 _9 j' K) r06总结
# K. ?! c0 m: k" c$ {利用上述不复位 MCU 继续调试的方法,能够保全现场的运行状态,重新接上仿真器即可对程序进行断点调试、单步执行等操作。对查找 Bug,发现并定位问题点,尤其对不易复现的偶发性故障十分有用。但是当 RDP Level≠0 时,因为已经开启了读保护,所以无法通过上述方法调试
$ u; N7 t! i2 H! j1 w* q+ R; _* a3 \1 {1 a5 l
1 Y$ L* g: q+ W' [! ^8 c# `
转载自: STM32单片机
0 D) Q0 E/ m4 h8 v: v
& f5 X$ B5 T& b0 m4 W如有侵权请联系删除- v  a  G% v$ X& o. g* E) g

& n  F5 s% }7 W) P8 V+ [, o/ H; B. |$ L) x% U
1 收藏 1 评论2 发布时间:2024-2-29 16:27

举报

2个回答
xu@xupt 回答时间:2024-3-1 16:58:42

好资料,学习~~~

xu@xupt 回答时间:2024-3-3 12:31:18

值得收藏

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版