
![]() 9 i( l8 f; }! P# F! X 本文描述了如何配置和使用SW接口来获取各种调试信息。, e9 Q5 `: X W* E, h7 a& ~ 一、目标调试阶段的配置 1.调试器的选择 " A) y1 t+ M9 E, s 选择μVision->Debug ->Options for Target –>Debug,并选择ULINK Cortex Debugger调试器。+ Z& C6 I( u+ P* [" U( m7 J ![]() 2.调试目标初始化文件( y3 d' G4 {: t* d 6 C) x3 R n( Q8 U 按照路径\Keil\ARM\Startup\ST,将文件STM32DBG.ini拷贝到工程文件夹中。选择μVision->Debug -> Options for Target –>Debug,同时在Initialization File选项中选择该文件。 ![]() - g& A: c7 O! A+ c# E" r1 S- k 3.Cortex-M 目标设备调试驱动配置 # j8 N+ B6 r d" z 选择Options for Target – Debug – Settings,设置SWJ,端口选择SW。 ![]() 4.Trace功能的配置- X: n/ D8 C3 X" m$ x C( W Trace功能包括:Core Clock, Trace Port 以及定义TraceEvents 等。) s* k3 K0 Q$ W1 j ![]() 二、实时跟踪 9 i- O6 M3 \+ Z' A& g6 Q2 T; H z 1.μVision的状态栏信息 " K% n) |2 H4 a5 w+ ~ 在μVision的状态栏中显示了实时跟踪的状态信息。; g3 R# o, d- a% Y" E/ ~" ]3 a `. s; x ![]() 2.实时跟踪窗口 ) @9 T2 A, E& I8 E$ b9 |- e' | 调试时选择Peripherals – Trace。" o6 a$ V2 q1 C% b3 N: k6 {5 q" x ![]() 1)Trace Records窗口; X/ w5 W8 ]) h0 w" b 该窗口显示了所有被捕获的跟踪记录,每一个跟踪记录都包含了详细的信息。可以选择Peripherals - Trace – Records来查看。1 p K3 v; C. [ ![]() 2)Exception Trace 窗口6 K1 ^1 U6 ]8 ]) \5 i# x 该窗口显示了异常和中断的统计信息,这些信息是基于Trace Records中所捕获的跟踪记录的。可以选择Peripherals - Trace - Exceptions来查看。 ![]() + M6 ?( A+ v; S' Z 3)Event Counters窗口 + W; S G* R1 a+ X- H& a2 H* _7 l 这个窗口显示了特殊事件计数器的值,计数值是基于Trace Records中所捕获的跟踪记录的。 # a5 `' L6 ]( b6 k Z# K ![]() ( W9 W% L" L% O 3.ITM Viewer窗口 " M2 r! P/ V I7 u! G4 V 可以通过ITM的激励端口0在ITM Viewer窗口上输出ASCII 或 Hex格式的数据,目前只有ITM 端口0可以在ITM Viewer窗口显示。要使用ITM Viewer窗口来显示调试跟踪的输出信息,需要进行以下的操作。 # b+ Y' l; W# j; [4 q l 在源代码中添加ITM激励端口寄存器的定义。 7 p8 N: K' X7 _" w% Z6 H/ k #define ITM_Port8(n) (*((volatile unsigned char *)(0xE0000000+4*n))) #define ITM_Port16(n) (*((volatile unsigned short*)(0xE0000000+4*n)))8 ^3 Q) O6 ~9 D! q #define ITM_Port32(n) (*((volatile unsigned long *)(0xE0000000+4*n))) #define DEMCR (*((volatile unsigned long *)(0xE000EDFC))) #define TRCENA 0x01000000 H! G5 e0 ^7 \7 F2 p- c5 W l 在源代码中添加fputc函数,它向ITM的激励端口0寄存器写数据。如果有了fputc函数,则可以用printf函数做为调试输出。ITM的激励端口0与ITM Viewer窗口固定连接。 struct __FILE { int handle; /* Add whatever you need here */ }; FILE __stdout; FILE __stdin; int fputc(int ch, FILE *f) { if (DEMCR & TRCENA) { while (ITM_Port32(0) == 0); ITM_Port8(0) = ch;0 D! S- @) R: _" c6 Z1 Q/ d; F }- H) J" E7 c' F return(ch);, P. d0 j7 ]& s6 p* A }$ j: A3 h" e% e) [2 j l 在源代码中添加printf函数来显示调试跟踪信息。 printf("Serial Wire Output Debug Trace message"); l 在Cortex-M Target Driver Setup窗口中使能ITM激励端口0 ![]() / R# |$ e. a9 x3 | i7 Z0 [/ G l 在目标调试期,打开ITM Viewer窗口 # s% Y( P. ^+ R* B 选择μVision-> View -> Serial Window -> ITM Viewer8 k3 m* s ^8 \2 d ![]() 2 {) c9 P0 E! l4 k. y. t# ?, i 完成这些步骤以后,可以在目标调试期通过ITM Viewer窗口查看到调试跟踪信息,例如显示AD转换的结果。" U+ I5 x. W, ~8 f( W T6 v ![]() # x4 _5 G6 r) i3 j$ J' ? ITM Viewer的功能类似串口打印调试信息,使用ITM更简单,而且不需要串口以及相关驱动程序。* x1 E" K; `' c+ b. w2 n 4.Logic Analyzer 窗口6 j; L5 _1 h; `! f$ ^ 1 R2 S' c) ?& Y4 Z- f2 Z7 T: \3 T4 h 在调试的时候,可以通过逻辑分析器观测至多4个变量值的变化。执行以下步骤来使用逻辑分析器。 : ^! _6 [3 |% s · 在Cortex-M Target Driver Setup窗口使能Timestamps并选择合适的Prescaler值。 ![]() 要想在逻辑分析器的窗口中观测到精确的时间值,必须使能Timestamps。2 F1 F4 ^! [$ x/ C/ ?4 P · 添加准备观测的变量到逻辑分析器中 · 在调试过程中观测变量值的变化" z2 k& e5 V7 b5 f( D ![]() ) d G/ H% B' }# ^7 N! A) o 5.RTX Kernel Event Viewer 窗口" P M+ ^' R5 u# ]5 A4 W 当运行RTX系统时,RTX Kernel Event Viewer 窗口中显示了任务的切换过程,任务切换信息通过专门的ITM激励端口31来传输。. A" U# R3 C$ ?( l( I$ m8 I) d& }4 ? 执行以下步骤来使能RTX Kernel Event Viewer。. y9 _9 ?2 M. {9 s' }3 k7 m. [2 u · 在Cortex-M Target Driver Setup窗口使能ITM 激励端口31/ v( L; s8 U: |9 x, H: x7 {( J ![]() 0 f; p. ^6 b, m/ l& P" m: b0 { · 选择Trace Enable,设置正确的Core Clock。) |+ ~9 P0 U" w0 C2 I0 o# T ![]() · 核查Timestamps为enabled.$ k: e. v+ W( W$ r: |* ~ ![]() · 在目标调试过程中打开RTX Kernel窗口 选择Peripherals -> RTX Kernel ![]() 5 m8 Y. i! S% `& @, R · 在RTX内核窗口选择Event Viewer标签 ' p: s+ S7 h# x4 z4 Y ![]() 6 ?: X: b7 [$ s( x 在窗口中更新了每个任务转换过程。选择in或者out按钮放大或缩小窗口。点击all按钮可以显示所有事件记录。 9 s: g+ @5 S: U$ n: W 出处:小野狼 |
回复:使用RealView MDK进行SW调试和实时跟踪
RE:使用RealView MDK进行SW调试和实时跟踪
RE:使用RealView MDK进行SW调试和实时跟踪