"SWO"의 두 판 사이의 차이

TRACE32
이동: 둘러보기, 검색
 
(같은 사용자에 의한 2개의 중간 편집이 숨겨짐)
1번째 줄: 1번째 줄:
 
<h2><strong style="font-size: 14px;"><span style="font-size: large;">Serial Wire Output 란</span></strong></h2>
 
<h2><strong style="font-size: 14px;"><span style="font-size: large;">Serial Wire Output 란</span></strong></h2>
 
<p><span style="font-size: small;">CoreSight 기반한 chip 에서 2pin debug 통신 프로토콜인 Serial Wire Debug 를 지원할 경우, Serial Wire Output 을 이용하여 1pin trace를 받을 수 있습니다. Serial Wire Debug 신호는 Serial Wire Clock(SWCLK), Serial Wire Data I/O(SWDIO) 이며, JTAG 신호에서 TCK와 TMS 신호 사용합니다.</span></p>
 
<p><span style="font-size: small;">CoreSight 기반한 chip 에서 2pin debug 통신 프로토콜인 Serial Wire Debug 를 지원할 경우, Serial Wire Output 을 이용하여 1pin trace를 받을 수 있습니다. Serial Wire Debug 신호는 Serial Wire Clock(SWCLK), Serial Wire Data I/O(SWDIO) 이며, JTAG 신호에서 TCK와 TMS 신호 사용합니다.</span></p>
<p>&nbsp; &nbsp; &nbsp;<img src="/data/wiki/2015-05-29/1432873330.png" alt="" /></p>
+
<p>&nbsp; &nbsp; &nbsp;<img alt="" style="width: 298px; height: 335px;" src="/data/wiki/2015-05-29/1432873330.png" width="345" height="384" /></p>
 
<p><span style="font-size: small;">총 3pin으로 ITM data를 받아볼 수 있으며 Pin 설정은 10pin일 경우 아래와 같은 pin map을 가질 수 있습니다.</span></p>
 
<p><span style="font-size: small;">총 3pin으로 ITM data를 받아볼 수 있으며 Pin 설정은 10pin일 경우 아래와 같은 pin map을 가질 수 있습니다.</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<img src="/data/wiki/2015-05-29/1432873336.png" alt="" /></p>
+
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<img alt="" style="width: 226px; height: 187px;" src="/data/wiki/2015-05-29/1432873336.png" width="233" height="202" /></p>
 +
<p>&nbsp;</p>
 
<h2><strong><span style="font-size: large;">Compiler 적용 방법 (for Cortex-M)</span></strong></h2>
 
<h2><strong><span style="font-size: large;">Compiler 적용 방법 (for Cortex-M)</span></strong></h2>
 
<p><strong><span style="font-size: large;"><br /></span></strong></p>
 
<p><strong><span style="font-size: large;"><br /></span></strong></p>
9번째 줄: 10번째 줄:
 
<p><span style="font-size: small;">IAR Compiler에서는 SWO Library 제공</span></p>
 
<p><span style="font-size: small;">IAR Compiler에서는 SWO Library 제공</span></p>
 
<p><span style="font-size: small;">Option 적용으로 SWO output 가능</span></p>
 
<p><span style="font-size: small;">Option 적용으로 SWO output 가능</span></p>
<p>&nbsp; &nbsp;<img src="/data/wiki/2015-05-29/1432873361.png" alt="" /></p>
+
<p>&nbsp; &nbsp;<img alt="" style="width: 457px; height: 361px;" src="/data/wiki/2015-05-29/1432873361.png" width="722" height="633" /></p>
 
<p>&nbsp;</p>
 
<p>&nbsp;</p>
 
<p><span style="font-size: small;">2)&nbsp;&nbsp;&nbsp; Keil uVision</span></p>
 
<p><span style="font-size: small;">2)&nbsp;&nbsp;&nbsp; Keil uVision</span></p>
 
<p><span style="font-size: small;">SWO trace를 위한 Retargeting 코드가 적용되어야, SWO output 가능</span></p>
 
<p><span style="font-size: small;">SWO trace를 위한 Retargeting 코드가 적용되어야, SWO output 가능</span></p>
&nbsp;
+
&nbsp;    
 
<table border="1" cellspacing="0" cellpadding="0">
 
<table border="1" cellspacing="0" cellpadding="0">
 
<tbody>
 
<tbody>
 
<tr>
 
<tr>
 
<td width="714" valign="top">
 
<td width="714" valign="top">
<p><span style="font-size: small;">#define ITM_Port8(n)&nbsp;&nbsp;&nbsp; (*((volatile unsigned char  *)(0xE0000000+4*n)))</span></p>
+
<p><span style="font-size: small;">&nbsp;#define ITM_Port8(n)&nbsp;&nbsp;&nbsp; (*((volatile unsigned char  *)(0xE0000000+4*n)))</span></p>
<p><span style="font-size: small;">#define ITM_Port16(n)&nbsp;&nbsp; (*((volatile unsigned  short*)(0xE0000000+4*n)))</span></p>
+
<p><span style="font-size: small;">&nbsp;#define ITM_Port16(n)&nbsp;&nbsp; (*((volatile unsigned  short*)(0xE0000000+4*n)))</span></p>
<p><span style="font-size: small;">#define ITM_Port32(n)&nbsp; &nbsp;(*((volatile unsigned long  *)(0xE0000000+4*n)))</span></p>
+
<p><span style="font-size: small;">&nbsp;#define ITM_Port32(n)&nbsp; &nbsp;(*((volatile unsigned long  *)(0xE0000000+4*n)))</span></p>
<p><span style="font-size: small;">#define DEMCR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (*((volatile unsigned long  *)(0xE000EDFC)))</span></p>
+
<p><span style="font-size: small;">&nbsp;#define DEMCR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (*((volatile unsigned long  *)(0xE000EDFC)))</span></p>
<p><span style="font-size: small;">#define TRCENA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x01000000</span></p>
+
<p><span style="font-size: small;">&nbsp;#define TRCENA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x01000000</span></p>
<p><span style="font-size: small;">/* USER CODE BEGIN PV */</span></p>
+
<p><span style="font-size: small;">&nbsp;/* USER CODE BEGIN PV */</span></p>
<p><span style="font-size: small;">struct __FILE { int handle; /*  Add whatever needed */ };</span></p>
+
<p><span style="font-size: small;">&nbsp;struct __FILE { int handle; /*  Add whatever needed */ };</span></p>
<p><span style="font-size: small;">FILE __stdout;</span></p>
+
<p><span style="font-size: small;">&nbsp;FILE __stdout;</span></p>
<p><span style="font-size: small;">FILE __stdin;</span></p>
+
<p><span style="font-size: small;">&nbsp;FILE __stdin;</span></p>
<p><span style="font-size: small;">int fputc(int ch, FILE *f) {</span></p>
+
<p><span style="font-size: small;">&nbsp;int fputc(int ch, FILE *f) {</span></p>
<p><span style="font-size: small;">&nbsp;   if (DEMCR &amp; TRCENA) {</span></p>
+
<p><span style="font-size: small;">&nbsp; &nbsp; &nbsp;if (DEMCR &amp; TRCENA) {</span></p>
<p><span style="font-size: small;">&nbsp;&nbsp;&nbsp; while (ITM_Port32(0) == 0);</span></p>
+
<p><span style="font-size: small;">&nbsp; &nbsp; &nbsp;while (ITM_Port32(0) == 0);</span></p>
<p><span style="font-size: small;">&nbsp;&nbsp;&nbsp; //ITM_Port32(0) = ch;</span></p>
+
<p><span style="font-size: small;">&nbsp; &nbsp; &nbsp;//ITM_Port32(0) = ch;</span></p>
<p><span style="font-size: small;">ITM_Port8(0)  = ch;</span></p>
+
<p><span style="font-size: small;">&nbsp; &nbsp; ITM_Port8(0)  = ch;</span></p>
<p><span style="font-size: small;">&nbsp;   }</span></p>
+
<p><span style="font-size: small;">&nbsp; &nbsp; &nbsp;}</span></p>
<p><span style="font-size: small;">&nbsp;   return(ch);</span></p>
+
<p><span style="font-size: small;">&nbsp; &nbsp; &nbsp;return(ch);</span></p>
<p><span style="font-size: small;">}</span></p>
+
<p><span style="font-size: small;">&nbsp;}</span></p>
 
</td>
 
</td>
 
</tr>
 
</tr>
44번째 줄: 45번째 줄:
 
<h3><strong><span style="font-size: small;">1)&nbsp;&nbsp;&nbsp; TRACE32 Combiprobe cable</span></strong></h3>
 
<h3><strong><span style="font-size: small;">1)&nbsp;&nbsp;&nbsp; TRACE32 Combiprobe cable</span></strong></h3>
 
<p><span style="font-size: small;">-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SWO 1pin trace를 받기 위해서는 TRACE32 Combiprobe cable이 필요합니다. &nbsp;</span></p>
 
<p><span style="font-size: small;">-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SWO 1pin trace를 받기 위해서는 TRACE32 Combiprobe cable이 필요합니다. &nbsp;</span></p>
<p>&nbsp; &nbsp; &nbsp;<img src="/data/wiki/2015-05-29/1432873392.png" alt="" /></p>
+
<p>&nbsp; &nbsp; &nbsp;<img alt="" src="/data/wiki/2015-05-29/1432873392.png" /></p>
 
<h3><strong><span style="font-size: small;">2)&nbsp;&nbsp;&nbsp; Serial Wire Debug Port (SWDP) Powerview 설정 명령어</span></strong></h3>
 
<h3><strong><span style="font-size: small;">2)&nbsp;&nbsp;&nbsp; Serial Wire Debug Port (SWDP) Powerview 설정 명령어</span></strong></h3>
 
<p><strong><span style="font-size: small;"><br /></span></strong></p>
 
<p><strong><span style="font-size: small;"><br /></span></strong></p>
 
<p>&nbsp;<span style="font-size: small;">①&nbsp;&nbsp;&nbsp; &nbsp;SWDP 통신 연결 설정</span></p>
 
<p>&nbsp;<span style="font-size: small;">①&nbsp;&nbsp;&nbsp; &nbsp;SWDP 통신 연결 설정</span></p>
<table border="1" cellspacing="0" cellpadding="0">
+
<p><span style="color: #3366ff; font-size: small;"><strong>SYStem.CONFIG SWDP ON</strong></span></p>
<tbody>
+
<p><span style="color: #3366ff; font-size: small;"><strong>SYStem.Up</strong></span></p>
<tr>
+
<p><span style="font-size: small;"><br /></span></p>
<td width="730" valign="top">
+
<p><span style="font-size: small;">&nbsp;②&nbsp;&nbsp;&nbsp; TPIU pin을 Serial Wire Viewer mode의 ITM trace를 위한 ETM off설정</span></p>
<p><span style="font-size: small;"><strong>SYStem.CONFIG SWDP ON</strong></span></p>
+
<p><span style="font-size: small;"><span style="color: #3366ff;"><strong>ETM.OFF</strong></span><br /></span></p>
<p><span style="font-size: small;"><strong>SYStem.Up</strong></span></p>
+
<p>&nbsp;</p>
</td>
+
</tr>
+
</tbody>
+
</table>
+
&nbsp;
+
<p><span style="font-size: small;">②&nbsp;&nbsp;&nbsp; TPIU pin을 Serial Wire Viewer mode의 ITM trace를 위한 ETM off설정</span></p>
+
<table border="1" cellspacing="0" cellpadding="0">
+
<tbody>
+
<tr>
+
<td width="730" valign="top">
+
<p><span style="font-size: small;"><strong>ETM.OFF</strong></span></p>
+
</td>
+
</tr>
+
</tbody>
+
</table>
+
&nbsp; &nbsp;
+
 
<p><span style="font-size: small;">③&nbsp;&nbsp;&nbsp; &nbsp;Port size와 ITM 설정,</span></p>
 
<p><span style="font-size: small;">③&nbsp;&nbsp;&nbsp; &nbsp;Port size와 ITM 설정,</span></p>
 
<p><span style="font-size: small;">&nbsp;비동기적인 Serial Wire Output 신호는 CPU frequency에 받음에 따라 bit rate를 조정 가능</span></p>
 
<p><span style="font-size: small;">&nbsp;비동기적인 Serial Wire Output 신호는 CPU frequency에 받음에 따라 bit rate를 조정 가능</span></p>
<p><span style="font-size: small;">&agrave; NRZ/2 는 CPU frequency를 둘로 나눌 경우</span></p>
+
<p><span style="font-size: small;">NRZ/2 는 CPU frequency를 둘로 나눌 경우</span></p>
<table border="1" cellspacing="0" cellpadding="0">
+
<p><span style="font-size: small; color: #3366ff;"><strong>ITM.PortSize SWV</strong></span></p>
<tbody>
+
<p><span style="font-size: small; color: #3366ff;"><strong>ITM.PortMode &lt;format&gt;</strong></span></p>
<tr>
+
<p>&nbsp;</p>
<td width="730" valign="top">
+
<p>&nbsp;</p>
<p><span style="font-size: small;"><strong>ITM.PortSize SWV</strong></span></p>
+
<p><span style="font-size: small;"><strong>ITM.PortMode &lt;format&gt;</strong></span></p>
+
</td>
+
</tr>
+
</tbody>
+
</table>
+
&nbsp;
+
 
<p><span style="font-size: small;">④&nbsp;&nbsp;&nbsp; &nbsp;bit rate를 고정적으로 설정할 경우 (Autofocus나 TraceClock 설정 중 가능)</span></p>
 
<p><span style="font-size: small;">④&nbsp;&nbsp;&nbsp; &nbsp;bit rate를 고정적으로 설정할 경우 (Autofocus나 TraceClock 설정 중 가능)</span></p>
<table border="1" cellspacing="0" cellpadding="0">
+
<p><span style="font-size: small;"><span style="color: #3366ff;"><strong>CAnalyzer.TraceCLOCK &lt;frequency&gt;</strong></span><br /></span></p>
<tbody>
+
<p>&nbsp;</p>
<tr>
+
<td width="730" valign="top">
+
<p><span style="font-size: small;"><strong>CAnalyzer.TraceCLOCK   &lt;frequency&gt;</strong></span></p>
+
</td>
+
</tr>
+
</tbody>
+
</table>
+
&nbsp;
+
 
<p><span style="font-size: small;">⑤&nbsp;&nbsp;&nbsp; &nbsp;자동으로 최적의 clock 을 찾는 Autofoucs 기능을 사용할 경우</span></p>
 
<p><span style="font-size: small;">⑤&nbsp;&nbsp;&nbsp; &nbsp;자동으로 최적의 clock 을 찾는 Autofoucs 기능을 사용할 경우</span></p>
 
<p><span style="font-size: small;">(Autofocus나 TraceClock 설정 중 가능)</span></p>
 
<p><span style="font-size: small;">(Autofocus나 TraceClock 설정 중 가능)</span></p>
<table border="1" cellspacing="0" cellpadding="0">
+
<p><span style="font-size: small; color: #3366ff;"><strong>CAnalyzer.AutoFocus</strong></span></p>
<tbody>
+
<p><span style="font-size: small;"><strong><br /></strong></span></p>
<tr>
+
<td width="730" valign="top">
+
<p><span style="font-size: small;"><strong>CAnalyzer.AutoFocus</strong></span></p>
+
</td>
+
</tr>
+
</tbody>
+
</table>
+
&nbsp; &nbsp;
+
 
<h3><strong><span style="font-size: small;">3)&nbsp;&nbsp;&nbsp; Printf를 SWO 1pin으로 trace 받을 경우 예시</span></strong></h3>
 
<h3><strong><span style="font-size: small;">3)&nbsp;&nbsp;&nbsp; Printf를 SWO 1pin으로 trace 받을 경우 예시</span></strong></h3>
 
<p><span style="font-size: small;">printf를 SWO 1pin trace를 이용하여 해당 printf 코드에 해당하는 data를 받아 볼 수 있습니다. &nbsp;</span></p>
 
<p><span style="font-size: small;">printf를 SWO 1pin trace를 이용하여 해당 printf 코드에 해당하는 data를 받아 볼 수 있습니다. &nbsp;</span></p>
<table border="1" cellspacing="0" cellpadding="0">
+
<p><span style="font-size: small;"><br /></span></p>
<tbody>
+
<p><span style="font-size: small;"><strong>SYStem.CONFIG.SWDP ON</strong></span></p>
<tr>
+
<td width="736" valign="top">
+
<p><span style="font-size: small;"><strong>SYStem.CONFIG.SWDP   ON</strong></span></p>
+
 
<p><span style="font-size: small;"><strong>SYStem.Up</strong></span></p>
 
<p><span style="font-size: small;"><strong>SYStem.Up</strong></span></p>
 
<p><span style="font-size: small;"><strong>&nbsp;</strong></span></p>
 
<p><span style="font-size: small;"><strong>&nbsp;</strong></span></p>
<p><span style="font-size: small;"><strong>ITM.PortMode   NRZ</strong></span></p>
+
<p><span style="font-size: small;"><strong>ITM.PortMode NRZ</strong></span></p>
<p><span style="font-size: small;"><strong>ITM.PortSize   SWV</strong></span></p>
+
<p><span style="font-size: small;"><strong>ITM.PortSize SWV</strong></span></p>
 
<p><span style="font-size: small;"><strong>CAnalyzer.Init</strong></span></p>
 
<p><span style="font-size: small;"><strong>CAnalyzer.Init</strong></span></p>
 
<p><span style="font-size: small;"><strong>CAnalyzer.AutoFocus</strong></span></p>
 
<p><span style="font-size: small;"><strong>CAnalyzer.AutoFocus</strong></span></p>
</td>
 
</tr>
 
</tbody>
 
</table>
 
 
<p>&nbsp;</p>
 
<p>&nbsp;</p>
 +
<p><img alt="" style="width: 915px; height: 569px;" src="/data/wiki/2015-05-29/1432873420.png" width="1092" height="691" /></p>
 
<p>&nbsp;</p>
 
<p>&nbsp;</p>
<p><img src="/data/wiki/2015-05-29/1432873420.png" alt="" /></p>
+
<p><span style="font-size: small;">문자열 형태로 printf를 TRACE32 Terminal 창을 통해 받는 것은 구현 중이며, 현재는 dll파일을 이용하여 해당 data log를 문자열 형태로 확인이 가능합니다.&nbsp;</span></p>
<p><span style="font-size: small;">문자열 형태로 printf를 받는 것은 현재 구현 중이며, dll파일을 이용하여 해당 data log를 문자열 형태로 확인이 가능합니다.&nbsp;</span></p>
+

2015년 5월 29일 (금) 14:02 기준 최신판

Serial Wire Output 란

CoreSight 기반한 chip 에서 2pin debug 통신 프로토콜인 Serial Wire Debug 를 지원할 경우, Serial Wire Output 을 이용하여 1pin trace를 받을 수 있습니다. Serial Wire Debug 신호는 Serial Wire Clock(SWCLK), Serial Wire Data I/O(SWDIO) 이며, JTAG 신호에서 TCK와 TMS 신호 사용합니다.

     

총 3pin으로 ITM data를 받아볼 수 있으며 Pin 설정은 10pin일 경우 아래와 같은 pin map을 가질 수 있습니다.

             

 

Compiler 적용 방법 (for Cortex-M)


1)    IAR EWARM

IAR Compiler에서는 SWO Library 제공

Option 적용으로 SWO output 가능

   

 

2)    Keil uVision

SWO trace를 위한 Retargeting 코드가 적용되어야, SWO output 가능

 

 #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)))

 #define DEMCR           (*((volatile unsigned long *)(0xE000EDFC)))

 #define TRCENA          0x01000000

 /* USER CODE BEGIN PV */

 struct __FILE { int handle; /* Add whatever needed */ };

 FILE __stdout;

 FILE __stdin;

 int fputc(int ch, FILE *f) {

     if (DEMCR & TRCENA) {

     while (ITM_Port32(0) == 0);

     //ITM_Port32(0) = ch;

    ITM_Port8(0) = ch;

     }

     return(ch);

 }

 

TRACE32 Serial Wire Debug Out(SWO) 설정 및 예시

 

1)    TRACE32 Combiprobe cable

-      SWO 1pin trace를 받기 위해서는 TRACE32 Combiprobe cable이 필요합니다.  

     

2)    Serial Wire Debug Port (SWDP) Powerview 설정 명령어


 ①     SWDP 통신 연결 설정

SYStem.CONFIG SWDP ON

SYStem.Up


 ②    TPIU pin을 Serial Wire Viewer mode의 ITM trace를 위한 ETM off설정

ETM.OFF

 

③     Port size와 ITM 설정,

 비동기적인 Serial Wire Output 신호는 CPU frequency에 받음에 따라 bit rate를 조정 가능

NRZ/2 는 CPU frequency를 둘로 나눌 경우

ITM.PortSize SWV

ITM.PortMode <format>

 

 

④     bit rate를 고정적으로 설정할 경우 (Autofocus나 TraceClock 설정 중 가능)

CAnalyzer.TraceCLOCK <frequency>

 

⑤     자동으로 최적의 clock 을 찾는 Autofoucs 기능을 사용할 경우

(Autofocus나 TraceClock 설정 중 가능)

CAnalyzer.AutoFocus


3)    Printf를 SWO 1pin으로 trace 받을 경우 예시

printf를 SWO 1pin trace를 이용하여 해당 printf 코드에 해당하는 data를 받아 볼 수 있습니다.  


SYStem.CONFIG.SWDP ON

SYStem.Up

 

ITM.PortMode NRZ

ITM.PortSize SWV

CAnalyzer.Init

CAnalyzer.AutoFocus

 

 

문자열 형태로 printf를 TRACE32 Terminal 창을 통해 받는 것은 구현 중이며, 현재는 dll파일을 이용하여 해당 data log를 문자열 형태로 확인이 가능합니다.