"SemiHosting 과 그 활용"의 두 판 사이의 차이
(같은 사용자에 의한 6개의 중간 편집이 숨겨짐) | |||
2번째 줄: | 2번째 줄: | ||
<p><span style="font-size: large;"><strong> </strong></span><span style="font-size: small;">본 자료는 타겟에서 수행되는 코드 중 I/O에 관련되는 코드를 캡쳐해서 I/O를 타겟에서 수행하는 것이 아니라 TRACE32 SW(Powerview) 내 에서 수행하게 하는 Semihosting 기능에 대한 가이드 문서입니다.</span></p> | <p><span style="font-size: large;"><strong> </strong></span><span style="font-size: small;">본 자료는 타겟에서 수행되는 코드 중 I/O에 관련되는 코드를 캡쳐해서 I/O를 타겟에서 수행하는 것이 아니라 TRACE32 SW(Powerview) 내 에서 수행하게 하는 Semihosting 기능에 대한 가이드 문서입니다.</span></p> | ||
<p><span style="font-size: small;"> 즉, Printf나 Scanf와 같이 ANCI C의 라이브러리 함수를 일반적으로 시리얼을 이용해서 하지만 이것을 TRACE32 Terminal 창을 통해서 수행하게 할 수 있습니다. 시리얼을 초기화 하기 전이나 혹은 시리얼을 사용할 수 있는 상황이더라도 추가로 시리얼 케이블을 연결하거나 시리얼 터미널을 이용하지 않고 디버거 내에서 I/O를 수행할 수 있습니다.</span></p> | <p><span style="font-size: small;"> 즉, Printf나 Scanf와 같이 ANCI C의 라이브러리 함수를 일반적으로 시리얼을 이용해서 하지만 이것을 TRACE32 Terminal 창을 통해서 수행하게 할 수 있습니다. 시리얼을 초기화 하기 전이나 혹은 시리얼을 사용할 수 있는 상황이더라도 추가로 시리얼 케이블을 연결하거나 시리얼 터미널을 이용하지 않고 디버거 내에서 I/O를 수행할 수 있습니다.</span></p> | ||
− | <p><img src="/data/wiki/2015-05-29/1432872205.png" | + | <p><img alt="" style="width: 979px; height: 486px;" src="/data/wiki/2015-05-29/1432872205.png" width="1407" height="772" /></p> |
+ | <p> </p> | ||
<h2><strong><span style="font-size: large;">Semihosting Mechanism (SWI)</span></strong></h2> | <h2><strong><span style="font-size: large;">Semihosting Mechanism (SWI)</span></strong></h2> | ||
<p><span style="font-size: small;">ARM 및 Thumb SVC 명령어에는 응용 프로그램 코드에서 사용되는 SVC 번호가 인코딩되어 있는 필드가 있어 시스템 SVC 처리기가 이 번호를 디코딩 가능합니다.</span></p> | <p><span style="font-size: small;">ARM 및 Thumb SVC 명령어에는 응용 프로그램 코드에서 사용되는 SVC 번호가 인코딩되어 있는 필드가 있어 시스템 SVC 처리기가 이 번호를 디코딩 가능합니다.</span></p> | ||
11번째 줄: | 12번째 줄: | ||
<p><span style="font-size: small;">(이 동작은 ARM 또는 타사의 일부 디버거에서만 가능)</span></p> | <p><span style="font-size: small;">(이 동작은 ARM 또는 타사의 일부 디버거에서만 가능)</span></p> | ||
<p><span style="font-size: small;"><strong>BKPT 0xAB</strong> : ARMv6-M 및 ARMv7-M (Thumb 상태만 해당)</span></p> | <p><span style="font-size: small;"><strong>BKPT 0xAB</strong> : ARMv6-M 및 ARMv7-M (Thumb 상태만 해당)</span></p> | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
<p> </p> | <p> </p> | ||
− | <p>< | + | <p><span style="font-size: small;">* R0로 전달되는 사용 가능한 세미호스팅 작업번호 할당</span></p> |
− | <p><span style=" | + | <p><span style="font-size: small;"><strong>* SYS_WRITE</strong> (0x05) : 현재 파일 위치에서 지정된 파일에 버퍼의 내용 쓸 경우</span></p> |
− | <p><span style=" | + | <p><span style="font-size: small;">n SYS_SEEK 사용 (명시적)</span></p> |
− | <p><span style=" | + | <p><span style="font-size: small;">n 이전 SYS_READ 또는 SYS_WRITE 요청의 1바이트 위 (암시적)</span></p> |
− | <p>< | + | <p><span style="font-size: small;">n printf 함수 수행시 SYS_WRITE 내에 bkpt #0xAB 수행</span></p> |
+ | <p><span style="font-size: small;"><strong>T32 Terminal </strong><strong>내에서 WRITE일 경우 print하고 넘어감 (</strong>R0에 0x5가 넘겨질 경우)</span></p> | ||
+ | <p><span style="font-size: small;"><strong><br /></strong></span></p> | ||
+ | <p><span style="font-size: small;">* <strong>SYS_READ</strong> (0x06) : 버퍼로 파일 내용을 읽을 경우</span></p> | ||
+ | <p><span style="font-size: small;">n SYS_SEEK 사용 (명시적)</span></p> | ||
+ | <p><span style="font-size: small;">n 이전 SYS_READ 또는 SYS_WRITE 요청의 1바이트 위 (암시적)</span></p> | ||
+ | <p><span style="font-size: small;">n Scanf 함수 수행시 SYS_READ 내에 bkpt #0xAB 수행으로 ARMSWI 방식 처리</span></p> | ||
+ | <p><span style="font-size: small;"><strong>T32 Semihosting</strong><strong>수행시 READ일 경우 “stopped for terminal” 로 멈춰있음 </strong>(R0에 0x6가 넘겨질 경우)</span></p> | ||
+ | <p><span style="font-size: small;"><strong><strong><br /></strong></strong></span></p> | ||
+ | <p><span style="font-size: small;"><strong>* SYS_SEEK (0x0A)</strong> : 파일 시작부터 지정된 오프셋을 사용하여 파일에서 지정된 위치 검색</span></p> | ||
+ | <p><span style="font-size: small;">파일은 바이트 배열로 가정되고 오프셋은 바이트 단위로 제공</span></p> | ||
+ | <p><img alt="" style="width: 945px; height: 719px;" src="/data/wiki/2015-05-29/1432872622.png" width="989" height="708" /></p> | ||
<p> </p> | <p> </p> | ||
− | + | <p> </p> | |
− | + | <h2><span style="font-size: large;"><strong style="font-size: large;">Compiler 적용 방법 (for Cortex-M)</strong></span></h2> | |
− | <p> | + | |
− | <h2><span style="font-size: large;"><strong>Compiler 적용 방법 (for Cortex-M)</strong></span></h2> | + | |
<p><span style="font-size: small;">1) IAR EWARM</span></p> | <p><span style="font-size: small;">1) IAR EWARM</span></p> | ||
<p><span style="font-size: small;">- IAR Compiler에서는 Semihosting Library 제공</span></p> | <p><span style="font-size: small;">- IAR Compiler에서는 Semihosting Library 제공</span></p> | ||
<p><span style="font-size: small;">- Option 적용으로 Semihosting interface 가능</span></p> | <p><span style="font-size: small;">- Option 적용으로 Semihosting interface 가능</span></p> | ||
− | <p> <img src="/data/wiki/2015-05-29/1432871673.png" | + | <p> <img alt="" style="width: 429px; height: 406px;" src="/data/wiki/2015-05-29/1432871673.png" width="601" height="511" /></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;">Retargeting 코드가 적용되지 않을 경우, Semihosting Library 제공</span></p> | <p><span style="font-size: small;">Retargeting 코드가 적용되지 않을 경우, Semihosting Library 제공</span></p> | ||
44번째 줄: | 43번째 줄: | ||
<h2><strong><span style="font-size: large;">TRACE32 를 이용한 Semihosting 방법</span></strong></h2> | <h2><strong><span style="font-size: large;">TRACE32 를 이용한 Semihosting 방법</span></strong></h2> | ||
<p><span style="font-size: small;">TRACE32를 이용하여 Semihosting 실행할 경우, TRACE32 내의 Terminal 창을 이용하여 printf 로그를 남기고 scanf 문자를 받는 것을 실행할 수 있습니다. Semihosting 방법에 따라 Terminal Method 설정이 필요합니다. </span></p> | <p><span style="font-size: small;">TRACE32를 이용하여 Semihosting 실행할 경우, TRACE32 내의 Terminal 창을 이용하여 printf 로그를 남기고 scanf 문자를 받는 것을 실행할 수 있습니다. Semihosting 방법에 따라 Terminal Method 설정이 필요합니다. </span></p> | ||
− | <p><span style="font-size: small;"><strong>TERM.METHOD <mode></strong></span></p> | + | <p><span style="font-size: small; color: #3366ff;"><strong>TERM.METHOD <mode></strong></span></p> |
− | <p><span style="font-size: small;"><strong>TERM.GATE</strong></span></p> | + | <p><span style="font-size: small; color: #3366ff;"><strong>TERM.GATE</strong></span></p> |
<p><span style="font-size: small;"><strong><br /></strong></span></p> | <p><span style="font-size: small;"><strong><br /></strong></span></p> | ||
<h3><strong><span style="font-size: small;">SVC (SWI) Emulation Mode</span></strong></h3> | <h3><strong><span style="font-size: small;">SVC (SWI) Emulation Mode</span></strong></h3> | ||
53번째 줄: | 52번째 줄: | ||
<p><span style="font-size: small;">③ SVC exception call 에 Link Register R14 주소에 application을 위치하고 재실행</span></p> | <p><span style="font-size: small;">③ SVC exception call 에 Link Register R14 주소에 application을 위치하고 재실행</span></p> | ||
<p><span style="font-size: small;">④ SVC parameter는 0x123456<strong> </strong></span></p> | <p><span style="font-size: small;">④ SVC parameter는 0x123456<strong> </strong></span></p> | ||
− | <p> <img src="/data/wiki/2015-05-29/1432871687.png" | + | <p> <img alt="" style="width: 599px; height: 369px;" src="/data/wiki/2015-05-29/1432871687.png" width="623" height="399" /></p> |
<p><span style="font-size: small;">** Script 작성 예</span></p> | <p><span style="font-size: small;">** Script 작성 예</span></p> | ||
− | <p><span style="font-size: small;"><img src="/data/wiki/2015-05-29/1432871910.png | + | <p><span style="font-size: small;"><img alt="" src="/data/wiki/2015-05-29/1432871910.png" /><br /></span></p> |
− | <p><span style="font-size: small;"><strong>TrOnchip.Set SWI ON</strong>.</span></p> | + | <p><span style="font-size: small; color: #3366ff;"><strong>TrOnchip.Set SWI ON</strong>.</span></p> |
− | <p><span style="font-size: small;"><strong>TERM.METHOD ARMSWI [<address>]</strong></span></p> | + | <p><span style="font-size: small; color: #3366ff;"><strong>TERM.METHOD ARMSWI [<address>]</strong></span></p> |
− | <p><span style="font-size: small;"><strong>TERM.GATE</strong></span></p> | + | <p><span style="font-size: small; color: #3366ff;"><strong>TERM.GATE</strong></span></p> |
− | <p> <img src="/data/wiki/2015-05-29/1432871753.png" | + | <p> <img alt="" style="width: 902px; height: 455px;" src="/data/wiki/2015-05-29/1432871753.png" width="1157" height="556" /> </p> |
<p> </p> | <p> </p> | ||
<h3><strong><span style="font-size: small;">DCC Communication Mode (DCC = Debug Communication Channel)</span></strong></h3> | <h3><strong><span style="font-size: small;">DCC Communication Mode (DCC = Debug Communication Channel)</span></strong></h3> | ||
65번째 줄: | 64번째 줄: | ||
<p><span style="font-size: small;">JTAG interface에 기반한 DCC를 이용, Target application은 stop하지 않고 처리</span></p> | <p><span style="font-size: small;">JTAG interface에 기반한 DCC를 이용, Target application은 stop하지 않고 처리</span></p> | ||
<p><span style="font-size: small;">semihosting exception handler는 application에 링크되어 있어야 함</span></p> | <p><span style="font-size: small;">semihosting exception handler는 application에 링크되어 있어야 함</span></p> | ||
− | <p><span style="font-size: small;"> | + | <p><span style="font-size: small; color: #3366ff;"> <strong>TERM.METHOD DCC3 </strong></span></p> |
− | <p><span style="font-size: small;"> | + | <p><span style="font-size: small; color: #3366ff;"> <strong>TERM.GATE</strong></span></p> |
<p><span style="font-size: small;"><strong><br /></strong></span></p> | <p><span style="font-size: small;"><strong><br /></strong></span></p> | ||
− | <p> <img src="/data/wiki/2015-05-29/1432871765.png" | + | <p> <img alt="" style="width: 564px; height: 371px;" src="/data/wiki/2015-05-29/1432871765.png" width="622" height="400" /></p> |
<p><span style="font-size: small;">* script 작성 예시</span></p> | <p><span style="font-size: small;">* script 작성 예시</span></p> | ||
− | <p><span style="font-size: small;"><img src="/data/wiki/2015-05-29/1432871779.png" | + | <p><span style="font-size: small;"><img alt="" src="/data/wiki/2015-05-29/1432871779.png" /></span></p> |
+ | <p><span style="font-size: small;"><br /></span></p> | ||
<p><span style="font-size: small;">ARM compatible semihosting handler</span></p> | <p><span style="font-size: small;">ARM compatible semihosting handler</span></p> | ||
<p><span style="font-size: small;">à t32swi.c, t32helper_x.c</span></p> | <p><span style="font-size: small;">à t32swi.c, t32helper_x.c</span></p> | ||
− | <p><span style="font-size: small;">demo/arm/etc/semihosting_arm_dcc 경로 확인가능</span></p> | + | <p><span style="font-size: small;">T32경로 : demo/arm/etc/semihosting_arm_dcc 경로 확인가능</span></p> |
− | <p> <img src="/data/wiki/2015-05-29/1432871807.png" | + | <p><span style="font-size: small;"><br /></span></p> |
+ | <p> <img alt="" style="width: 889px; height: 584px;" src="/data/wiki/2015-05-29/1432871807.png" width="973" height="609" /></p> | ||
| | ||
<p> </p> | <p> </p> | ||
− | <p><img src="/data/wiki/2015-05-29/1432871821.png" | + | <p><img alt="" style="width: 564px; height: 374px;" src="/data/wiki/2015-05-29/1432871821.png" width="616" height="403" /></p> |
<p><span style="font-size: small;">* script 작성예시</span></p> | <p><span style="font-size: small;">* script 작성예시</span></p> | ||
− | <p><span style="font-size: small;"><img src="/data/wiki/2015-05-29/1432871826.png" | + | <p><span style="font-size: small;"><img alt="" src="/data/wiki/2015-05-29/1432871826.png" /></span></p> |
+ | <p><span style="font-size: small;"><br /></span></p> | ||
<p><span style="font-size: small;">SWI handler (t32swi.c) is not required</span></p> | <p><span style="font-size: small;">SWI handler (t32swi.c) is not required</span></p> | ||
<p><span style="font-size: small;">DCC에 direct로 요청을 보냄</span></p> | <p><span style="font-size: small;">DCC에 direct로 요청을 보냄</span></p> | ||
− | |||
<p><span style="font-size: small;">T32 경로 : demo\arm\etc\semihosting_trace32_dcc 참고</span></p> | <p><span style="font-size: small;">T32 경로 : demo\arm\etc\semihosting_trace32_dcc 참고</span></p> | ||
<p><span style="font-size: small;"><br /></span></p> | <p><span style="font-size: small;"><br /></span></p> | ||
88번째 줄: | 89번째 줄: | ||
<p><span style="font-size: small;">- Cortex-M계열은 DCC를 지원하지 않는다. 따라서 특정 RAM 영역을 할당하여 I/O로 활용</span></p> | <p><span style="font-size: small;">- Cortex-M계열은 DCC를 지원하지 않는다. 따라서 특정 RAM 영역을 할당하여 I/O로 활용</span></p> | ||
<p><span style="font-size: small;">- 타겟을 멈추지 않고 SWI없이 실행할 경우</span></p> | <p><span style="font-size: small;">- 타겟을 멈추지 않고 SWI없이 실행할 경우</span></p> | ||
− | <p> <img src="/data/wiki/2015-05-29/1432871842.png" | + | <p> <img alt="" style="width: 688px; height: 51px;" src="/data/wiki/2015-05-29/1432871842.png" width="810" height="97" /></p> |
<p><span style="font-size: small;">* script 작성예시</span></p> | <p><span style="font-size: small;">* script 작성예시</span></p> | ||
− | <p> <img src="/data/wiki/2015-05-29/1432871847.png | + | <p> <img alt="" src="/data/wiki/2015-05-29/1432871847.png" /></p> |
− | <p><span style="font-size: small;"><strong>TERM.METHOD SingleE <output> <input></strong></span></p> | + | <p><span style="font-size: small; color: #3366ff;"><strong>TERM.METHOD SingleE <output> <input></strong></span></p> |
− | <p><span style="font-size: small;"><strong>TERM.METHOD BufferE <output> <input></strong></span></p> | + | <p><span style="font-size: small; color: #3366ff;"><strong>TERM.METHOD BufferE <output> <input></strong></span></p> |
| |
2015년 5월 29일 (금) 13:56 기준 최신판
목차
Overview
본 자료는 타겟에서 수행되는 코드 중 I/O에 관련되는 코드를 캡쳐해서 I/O를 타겟에서 수행하는 것이 아니라 TRACE32 SW(Powerview) 내 에서 수행하게 하는 Semihosting 기능에 대한 가이드 문서입니다.
즉, Printf나 Scanf와 같이 ANCI C의 라이브러리 함수를 일반적으로 시리얼을 이용해서 하지만 이것을 TRACE32 Terminal 창을 통해서 수행하게 할 수 있습니다. 시리얼을 초기화 하기 전이나 혹은 시리얼을 사용할 수 있는 상황이더라도 추가로 시리얼 케이블을 연결하거나 시리얼 터미널을 이용하지 않고 디버거 내에서 I/O를 수행할 수 있습니다.
Semihosting Mechanism (SWI)
ARM 및 Thumb SVC 명령어에는 응용 프로그램 코드에서 사용되는 SVC 번호가 인코딩되어 있는 필드가 있어 시스템 SVC 처리기가 이 번호를 디코딩 가능합니다.
* Semihosting interface를 위한 명령어
SVC 0x123456 : 모든 아키텍처에 대해 ARM 상태인 경우
SVC 0xAB : ARMv6-M 및 ARMv7-M을 제외한 ARM 상태 및 Thumb 상태인 경우.
(이 동작은 ARM 또는 타사의 일부 디버거에서만 가능)
BKPT 0xAB : ARMv6-M 및 ARMv7-M (Thumb 상태만 해당)
* R0로 전달되는 사용 가능한 세미호스팅 작업번호 할당
* SYS_WRITE (0x05) : 현재 파일 위치에서 지정된 파일에 버퍼의 내용 쓸 경우
n SYS_SEEK 사용 (명시적)
n 이전 SYS_READ 또는 SYS_WRITE 요청의 1바이트 위 (암시적)
n printf 함수 수행시 SYS_WRITE 내에 bkpt #0xAB 수행
T32 Terminal 내에서 WRITE일 경우 print하고 넘어감 (R0에 0x5가 넘겨질 경우)
* SYS_READ (0x06) : 버퍼로 파일 내용을 읽을 경우
n SYS_SEEK 사용 (명시적)
n 이전 SYS_READ 또는 SYS_WRITE 요청의 1바이트 위 (암시적)
n Scanf 함수 수행시 SYS_READ 내에 bkpt #0xAB 수행으로 ARMSWI 방식 처리
T32 Semihosting수행시 READ일 경우 “stopped for terminal” 로 멈춰있음 (R0에 0x6가 넘겨질 경우)
* SYS_SEEK (0x0A) : 파일 시작부터 지정된 오프셋을 사용하여 파일에서 지정된 위치 검색
파일은 바이트 배열로 가정되고 오프셋은 바이트 단위로 제공
Compiler 적용 방법 (for Cortex-M)
1) IAR EWARM
- IAR Compiler에서는 Semihosting Library 제공
- Option 적용으로 Semihosting interface 가능
2) Keil uVision
Retargeting 코드가 적용되지 않을 경우, Semihosting Library 제공
Option 적용없이 기본적으로 사용 가능
TRACE32 를 이용한 Semihosting 방법
TRACE32를 이용하여 Semihosting 실행할 경우, TRACE32 내의 Terminal 창을 이용하여 printf 로그를 남기고 scanf 문자를 받는 것을 실행할 수 있습니다. Semihosting 방법에 따라 Terminal Method 설정이 필요합니다.
TERM.METHOD <mode>
TERM.GATE
SVC (SWI) Emulation Mode
* SVC mode 동작 순서
① SVC exception에 설정된 breakpoint는 application을 멈춤
② stop되어 있는 동안 디버거는 요청사항 처리, host와 통신
③ SVC exception call 에 Link Register R14 주소에 application을 위치하고 재실행
④ SVC parameter는 0x123456
** Script 작성 예
TrOnchip.Set SWI ON.
TERM.METHOD ARMSWI [<address>]
TERM.GATE
DCC Communication Mode (DCC = Debug Communication Channel)
Semihosting exception handler는 SVC(SWI) exception 처리
JTAG interface에 기반한 DCC를 이용, Target application은 stop하지 않고 처리
semihosting exception handler는 application에 링크되어 있어야 함
TERM.METHOD DCC3
TERM.GATE
* script 작성 예시
ARM compatible semihosting handler
à t32swi.c, t32helper_x.c
T32경로 : demo/arm/etc/semihosting_arm_dcc 경로 확인가능
* script 작성예시
SWI handler (t32swi.c) is not required
DCC에 direct로 요청을 보냄
T32 경로 : demo\arm\etc\semihosting_trace32_dcc 참고
Memory based interface for Cortex-M
- Cortex-M계열은 DCC를 지원하지 않는다. 따라서 특정 RAM 영역을 할당하여 I/O로 활용
- 타겟을 멈추지 않고 SWI없이 실행할 경우
* script 작성예시
TERM.METHOD SingleE <output> <input>
TERM.METHOD BufferE <output> <input>