"SWO"의 두 판 사이의 차이
(같은 사용자에 의한 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> <img src="/data/wiki/2015-05-29/1432873330.png" | + | <p> <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> <img src="/data/wiki/2015-05-29/1432873336.png" | + | <p> <img alt="" style="width: 226px; height: 187px;" src="/data/wiki/2015-05-29/1432873336.png" width="233" height="202" /></p> |
+ | <p> </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> <img src="/data/wiki/2015-05-29/1432873361.png" | + | <p> <img alt="" style="width: 457px; height: 361px;" src="/data/wiki/2015-05-29/1432873361.png" width="722" height="633" /></p> |
<p> </p> | <p> </p> | ||
<p><span style="font-size: small;">2) Keil uVision</span></p> | <p><span style="font-size: small;">2) 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> | ||
− | | + | |
<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) (*((volatile unsigned char *)(0xE0000000+4*n)))</span></p> | + | <p><span style="font-size: small;"> #define ITM_Port8(n) (*((volatile unsigned char *)(0xE0000000+4*n)))</span></p> |
− | <p><span style="font-size: small;">#define ITM_Port16(n) (*((volatile unsigned short*)(0xE0000000+4*n)))</span></p> | + | <p><span style="font-size: small;"> #define ITM_Port16(n) (*((volatile unsigned short*)(0xE0000000+4*n)))</span></p> |
− | <p><span style="font-size: small;">#define ITM_Port32(n) (*((volatile unsigned long *)(0xE0000000+4*n)))</span></p> | + | <p><span style="font-size: small;"> #define ITM_Port32(n) (*((volatile unsigned long *)(0xE0000000+4*n)))</span></p> |
− | <p><span style="font-size: small;">#define DEMCR (*((volatile unsigned long *)(0xE000EDFC)))</span></p> | + | <p><span style="font-size: small;"> #define DEMCR (*((volatile unsigned long *)(0xE000EDFC)))</span></p> |
− | <p><span style="font-size: small;">#define TRCENA 0x01000000</span></p> | + | <p><span style="font-size: small;"> #define TRCENA 0x01000000</span></p> |
− | <p><span style="font-size: small;">/* USER CODE BEGIN PV */</span></p> | + | <p><span style="font-size: small;"> /* 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;"> 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;"> FILE __stdout;</span></p> |
− | <p><span style="font-size: small;">FILE __stdin;</span></p> | + | <p><span style="font-size: small;"> FILE __stdin;</span></p> |
− | <p><span style="font-size: small;">int fputc(int ch, FILE *f) {</span></p> | + | <p><span style="font-size: small;"> int fputc(int ch, FILE *f) {</span></p> |
− | <p><span style="font-size: small;"> | + | <p><span style="font-size: small;"> if (DEMCR & TRCENA) {</span></p> |
− | <p><span style="font-size: small;"> while (ITM_Port32(0) == 0);</span></p> | + | <p><span style="font-size: small;"> while (ITM_Port32(0) == 0);</span></p> |
− | <p><span style="font-size: small;"> //ITM_Port32(0) = ch;</span></p> | + | <p><span style="font-size: small;"> //ITM_Port32(0) = ch;</span></p> |
− | <p><span style="font-size: small;">ITM_Port8(0) = ch;</span></p> | + | <p><span style="font-size: small;"> ITM_Port8(0) = ch;</span></p> |
− | <p><span style="font-size: small;"> | + | <p><span style="font-size: small;"> }</span></p> |
− | <p><span style="font-size: small;"> | + | <p><span style="font-size: small;"> return(ch);</span></p> |
− | <p><span style="font-size: small;">}</span></p> | + | <p><span style="font-size: small;"> }</span></p> |
</td> | </td> | ||
</tr> | </tr> | ||
44번째 줄: | 45번째 줄: | ||
<h3><strong><span style="font-size: small;">1) TRACE32 Combiprobe cable</span></strong></h3> | <h3><strong><span style="font-size: small;">1) TRACE32 Combiprobe cable</span></strong></h3> | ||
<p><span style="font-size: small;">- SWO 1pin trace를 받기 위해서는 TRACE32 Combiprobe cable이 필요합니다. </span></p> | <p><span style="font-size: small;">- SWO 1pin trace를 받기 위해서는 TRACE32 Combiprobe cable이 필요합니다. </span></p> | ||
− | <p> <img src="/data/wiki/2015-05-29/1432873392.png | + | <p> <img alt="" src="/data/wiki/2015-05-29/1432873392.png" /></p> |
<h3><strong><span style="font-size: small;">2) Serial Wire Debug Port (SWDP) Powerview 설정 명령어</span></strong></h3> | <h3><strong><span style="font-size: small;">2) 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> <span style="font-size: small;">① SWDP 통신 연결 설정</span></p> | <p> <span style="font-size: small;">① SWDP 통신 연결 설정</span></p> | ||
− | + | <p><span style="color: #3366ff; font-size: small;"><strong>SYStem.CONFIG SWDP ON</strong></span></p> | |
− | + | <p><span style="color: #3366ff; font-size: small;"><strong>SYStem.Up</strong></span></p> | |
− | + | <p><span style="font-size: small;"><br /></span></p> | |
− | + | <p><span style="font-size: small;"> ② 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> </p> |
− | < | + | |
− | </ | + | |
− | </ | + | |
− | </ | + | |
− | + | ||
− | <p><span style="font-size: small;">② TPIU pin을 Serial Wire Viewer mode의 ITM trace를 위한 ETM off설정</span></p | + | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | <p><span style="font-size: small;"><strong>ETM.OFF</strong></span></ | + | |
− | </ | + | |
− | </ | + | |
− | < | + | |
− | </ | + | |
− | + | ||
<p><span style="font-size: small;">③ Port size와 ITM 설정,</span></p> | <p><span style="font-size: small;">③ Port size와 ITM 설정,</span></p> | ||
<p><span style="font-size: small;"> 비동기적인 Serial Wire Output 신호는 CPU frequency에 받음에 따라 bit rate를 조정 가능</span></p> | <p><span style="font-size: small;"> 비동기적인 Serial Wire Output 신호는 CPU frequency에 받음에 따라 bit rate를 조정 가능</span></p> | ||
− | <p><span style="font-size: small;"> | + | <p><span style="font-size: small;">NRZ/2 는 CPU frequency를 둘로 나눌 경우</span></p> |
− | + | <p><span style="font-size: small; color: #3366ff;"><strong>ITM.PortSize SWV</strong></span></p> | |
− | + | <p><span style="font-size: small; color: #3366ff;"><strong>ITM.PortMode <format></strong></span></p> | |
− | + | <p> </p> | |
− | + | <p> </p> | |
− | <p><span style="font-size: small;"><strong>ITM.PortSize SWV</strong></span></p> | + | |
− | <p><span style="font-size: small;"><strong>ITM.PortMode <format></strong></span></p> | + | |
− | < | + | |
− | </ | + | |
− | < | + | |
− | </ | + | |
− | + | ||
<p><span style="font-size: small;">④ bit rate를 고정적으로 설정할 경우 (Autofocus나 TraceClock 설정 중 가능)</span></p> | <p><span style="font-size: small;">④ bit rate를 고정적으로 설정할 경우 (Autofocus나 TraceClock 설정 중 가능)</span></p> | ||
− | + | <p><span style="font-size: small;"><span style="color: #3366ff;"><strong>CAnalyzer.TraceCLOCK <frequency></strong></span><br /></span></p> | |
− | + | <p> </p> | |
− | + | ||
− | + | ||
− | <p><span style="font-size: small;"><strong>CAnalyzer.TraceCLOCK | + | |
− | </ | + | |
− | </ | + | |
− | < | + | |
− | </ | + | |
− | + | ||
<p><span style="font-size: small;">⑤ 자동으로 최적의 clock 을 찾는 Autofoucs 기능을 사용할 경우</span></p> | <p><span style="font-size: small;">⑤ 자동으로 최적의 clock 을 찾는 Autofoucs 기능을 사용할 경우</span></p> | ||
<p><span style="font-size: small;">(Autofocus나 TraceClock 설정 중 가능)</span></p> | <p><span style="font-size: small;">(Autofocus나 TraceClock 설정 중 가능)</span></p> | ||
− | + | <p><span style="font-size: small; color: #3366ff;"><strong>CAnalyzer.AutoFocus</strong></span></p> | |
− | + | <p><span style="font-size: small;"><strong><br /></strong></span></p> | |
− | + | ||
− | + | ||
− | <p><span style="font-size: small;"><strong>CAnalyzer.AutoFocus</strong></span></p> | + | |
− | </ | + | |
− | </ | + | |
− | </ | + | |
− | </ | + | |
− | + | ||
<h3><strong><span style="font-size: small;">3) Printf를 SWO 1pin으로 trace 받을 경우 예시</span></strong></h3> | <h3><strong><span style="font-size: small;">3) Printf를 SWO 1pin으로 trace 받을 경우 예시</span></strong></h3> | ||
<p><span style="font-size: small;">printf를 SWO 1pin trace를 이용하여 해당 printf 코드에 해당하는 data를 받아 볼 수 있습니다. </span></p> | <p><span style="font-size: small;">printf를 SWO 1pin trace를 이용하여 해당 printf 코드에 해당하는 data를 받아 볼 수 있습니다. </span></p> | ||
− | < | + | <p><span style="font-size: small;"><br /></span></p> |
− | < | + | <p><span style="font-size: small;"><strong>SYStem.CONFIG.SWDP ON</strong></span></p> |
− | < | + | |
− | < | + | |
− | <p><span style="font-size: small;"><strong>SYStem.CONFIG.SWDP | + | |
<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> </strong></span></p> | <p><span style="font-size: small;"><strong> </strong></span></p> | ||
− | <p><span style="font-size: small;"><strong>ITM.PortMode | + | <p><span style="font-size: small;"><strong>ITM.PortMode NRZ</strong></span></p> |
− | <p><span style="font-size: small;"><strong>ITM.PortSize | + | <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> | ||
− | |||
− | |||
− | |||
− | |||
<p> </p> | <p> </p> | ||
+ | <p><img alt="" style="width: 915px; height: 569px;" src="/data/wiki/2015-05-29/1432873420.png" width="1092" height="691" /></p> | ||
<p> </p> | <p> </p> | ||
− | + | <p><span style="font-size: small;">문자열 형태로 printf를 TRACE32 Terminal 창을 통해 받는 것은 구현 중이며, 현재는 dll파일을 이용하여 해당 data log를 문자열 형태로 확인이 가능합니다. </span></p> | |
− | <p><span style="font-size: small;">문자열 형태로 printf를 받는 것은 | + |
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를 문자열 형태로 확인이 가능합니다.