
![]() 本文描述了如何配置和使用SW接口来获取各种调试信息。 . B3 }# r$ x U# ?: I2 a 一、目标调试阶段的配置 2 I0 X1 }. J) V; q 1.调试器的选择 + Z$ x( n# _+ P9 [ 选择μVision->Debug ->Options for Target –>Debug,并选择ULINK Cortex Debugger调试器。6 |9 ^. k! y0 ?+ Y5 h ![]() 0 g; X1 l- W) D+ c" i2 d 2.调试目标初始化文件* r1 Y! \$ e5 s+ ?/ L$ [ 按照路径\Keil\ARM\Startup\ST,将文件STM32DBG.ini拷贝到工程文件夹中。选择μVision->Debug -> Options for Target –>Debug,同时在Initialization File选项中选择该文件。 ![]() 3.Cortex-M 目标设备调试驱动配置 % p& `. F% k6 t, o* H7 m. G 选择Options for Target – Debug – Settings,设置SWJ,端口选择SW。; {. `0 |: r/ z ![]() $ a+ d# r% q; F+ H 4.Trace功能的配置5 O8 N; i1 L6 |6 h- `" W Trace功能包括:Core Clock, Trace Port 以及定义TraceEvents 等。 ![]() , K! u9 V5 _& m1 L& n 二、实时跟踪2 u$ \" S! s. ] ^& E4 X 1.μVision的状态栏信息# B# C, r* o( V2 D, \( h; e 在μVision的状态栏中显示了实时跟踪的状态信息。 ![]() 0 F3 X: j' }/ {# j1 _ | 2.实时跟踪窗口7 k7 x4 c% K( S $ P K" H. A0 Z1 g1 q9 V( m 调试时选择Peripherals – Trace。0 y S. H1 `. p9 g/ _* m4 g* S! V ![]() 1)Trace Records窗口" ?, m% S; p( E% w 4 p* Z m1 H$ k! A Y$ T$ m( U 该窗口显示了所有被捕获的跟踪记录,每一个跟踪记录都包含了详细的信息。可以选择Peripherals - Trace – Records来查看。3 X% R& ~; F. w, d* H! I2 i ![]() 2)Exception Trace 窗口( h9 S4 U; v2 f) ~6 o( t$ I+ ] 7 S" l& U" N8 n8 h 该窗口显示了异常和中断的统计信息,这些信息是基于Trace Records中所捕获的跟踪记录的。可以选择Peripherals - Trace - Exceptions来查看。% R6 Y9 W% b% r8 T7 t9 | ![]() 6 w+ _. u* B* x 3)Event Counters窗口6 N( n7 M# g% P- | ! `9 ^% N; j" j, A' K! ] 这个窗口显示了特殊事件计数器的值,计数值是基于Trace Records中所捕获的跟踪记录的。 ![]() + S# R" X6 {) x- s 3.ITM Viewer窗口6 s! N) J ]( E1 x+ d 可以通过ITM的激励端口0在ITM Viewer窗口上输出ASCII 或 Hex格式的数据,目前只有ITM 端口0可以在ITM Viewer窗口显示。要使用ITM Viewer窗口来显示调试跟踪的输出信息,需要进行以下的操作。 ' j0 S4 Y" y/ K! `( w$ \' f$ N l 在源代码中添加ITM激励端口寄存器的定义。 #define ITM_Port8(n) (*((volatile unsigned char *)(0xE0000000+4*n))) #define ITM_Port16(n) (*((volatile unsigned short*)(0xE0000000+4*n))) #define ITM_Port32(n) (*((volatile unsigned long *)(0xE0000000+4*n)))( K9 y \8 s* d( H. ] #define DEMCR (*((volatile unsigned long *)(0xE000EDFC))) #define TRCENA 0x01000000 l 在源代码中添加fputc函数,它向ITM的激励端口0寄存器写数据。如果有了fputc函数,则可以用printf函数做为调试输出。ITM的激励端口0与ITM Viewer窗口固定连接。0 I- R- g, L; j/ u8 c6 b 2 w. P1 P& ~" b1 X( ?! K; Q struct __FILE { int handle; /* Add whatever you need here */ };9 W5 N, ~- j2 G FILE __stdout; FILE __stdin;7 _8 |- v: B( M6 ^, ?' r7 M0 y2 S$ | int fputc(int ch, FILE *f) { if (DEMCR & TRCENA) { while (ITM_Port32(0) == 0); ITM_Port8(0) = ch;" f2 D' i1 G# p8 t! T% y3 B }& j* `3 D" g* u8 Q4 x1 q5 [ return(ch); }# N& |$ M0 \) \ l 在源代码中添加printf函数来显示调试跟踪信息。 printf("Serial Wire Output Debug Trace message"); l 在Cortex-M Target Driver Setup窗口中使能ITM激励端口0, q. B$ U2 S) e$ M/ K ![]() 5 q2 d2 S8 b& K6 ~. {7 W8 {! k3 m l 在目标调试期,打开ITM Viewer窗口, X* z+ O% k1 |4 T , L% p7 V' G- \% p 选择μVision-> View -> Serial Window -> ITM Viewer- u7 S, U- f* _4 i ![]() 完成这些步骤以后,可以在目标调试期通过ITM Viewer窗口查看到调试跟踪信息,例如显示AD转换的结果。 ![]() ITM Viewer的功能类似串口打印调试信息,使用ITM更简单,而且不需要串口以及相关驱动程序。 6 G$ U; ]$ M( u; `- d; T8 L 4.Logic Analyzer 窗口 4 @1 ]9 o$ g+ \6 Q. y! C; @ 在调试的时候,可以通过逻辑分析器观测至多4个变量值的变化。执行以下步骤来使用逻辑分析器。0 L& z* p5 N& ]( f " j/ u; [ G7 c; r8 t W9 L · 在Cortex-M Target Driver Setup窗口使能Timestamps并选择合适的Prescaler值。- H, ?+ U0 t8 Q9 Z* ?! U ![]() 要想在逻辑分析器的窗口中观测到精确的时间值,必须使能Timestamps。 a; O! E1 L1 y5 g7 k( v/ H : h6 h! O, S. e: y5 h& \ · 添加准备观测的变量到逻辑分析器中3 l/ T% m' Y0 C: A, Z) `+ i5 ~6 e · 在调试过程中观测变量值的变化 ![]() 5.RTX Kernel Event Viewer 窗口 当运行RTX系统时,RTX Kernel Event Viewer 窗口中显示了任务的切换过程,任务切换信息通过专门的ITM激励端口31来传输。 ! F5 O- i8 H% v! u" H 执行以下步骤来使能RTX Kernel Event Viewer。& M% ], q- @2 D · 在Cortex-M Target Driver Setup窗口使能ITM 激励端口31/ l$ W& D3 E5 R$ }7 C. Y$ X ![]() · 选择Trace Enable,设置正确的Core Clock。 ![]() · 核查Timestamps为enabled./ \, z; L) w. l' M9 x ![]() · 在目标调试过程中打开RTX Kernel窗口 6 H9 M9 Y& Z# \2 Y3 {( O 选择Peripherals -> RTX Kernel- o- L- z1 j$ f7 @* u ![]() · 在RTX内核窗口选择Event Viewer标签 - h" H' x8 s+ c8 ] ![]() 在窗口中更新了每个任务转换过程。选择in或者out按钮放大或缩小窗口。点击all按钮可以显示所有事件记录。% G3 s5 }3 e* p- u# } 出处:小野狼 |
回复:使用RealView MDK进行SW调试和实时跟踪
RE:使用RealView MDK进行SW调试和实时跟踪
RE:使用RealView MDK进行SW调试和实时跟踪