배너
닫기

테크노트

배너

디버깅 정보 출력하기

URL복사
[#강추 웨비나] 제조 산업을 위한 클라우드 활용 웨비나 시리즈 Autodesk 올인원 제조솔루션 Fusion 활용하기 - 1편: Fusion 소개 및 모델링 활용하기 (7/10)

[첨단 헬로티]


디버깅 중 데이터 값을 외부로 출력하기 위해 가장 일반적으로 많이 사용되는 방법은 UART를 이용해 데이터를 출력하고 외부에서 모니터링 하는 방법이다. 하지만 UART를 활용한 방법은 많은 리소스를 사용하며 디버깅을 포함한 코드실행 시간에 민감한 애플리케이션에는 적용시키기에 매우 어렵다. 이러한 문제점을 보완할 수 있는 다양한 방법을 설명하겠다. 


UART 활용 vs printf


일반적인 디버깅 정보 출력으로 UART를 가장 많이 사용한다. UART를 사용하게되면 MCU의 UART 기능, 통신 핀 등의 하드웨어와 제어를 위한 라이브러리/드라이버 코드 수행 등이 필요하다. 또 외부로 정보를 보낸 후 PC와 통신 연결을 위해 UART to USB 등의 컨버터를 사용한다[그림 1]. PC와 연결 이후에는 PC의 Terminal 프로그램으로 출력되는 정보를 모니터링하고 기록한다. 


그림 1. 


이처럼 UART를 사용하는 경우 많은 리소스들이 사용되고 통신 속도 또한 제한적이다. 이러한 단점을 보완할 수 있는 방법으로 첫번째, printf를 활용하는 방법이다. C/C++ runtime library에 포함돼 있는 printf를 IAR 임베디드 워크벤치(AR Embedded Workbench)의 C-SPY에서 디버깅 통신으로 활용할 수 있다. 우선 프로젝트 옵션에서 printf, scnaf등을 활용할 수 있게 지원된다. 


General Option > Library Configuration > Library low-level interface implementation [그림 2]


그림 2.

 

해당 옵션을 Semihosted로 설정하는 경우, printf, scnaf 등의 입출력함수를 JTAG, SWD 등의 디버깅 통신 인터페이스를 이용하도록 코드를 수정하여 사용하게 된다[그림 3]. 구체적으로는 __read( ), __write( ) 함수를 일반적인 코드가 아닌 C-SPY에서 디버깅 인터페이스 통신이 가능하도록 코드를 수정해 프로젝트에 적용한다. 또한 stdout/stderr(출력정보)의 경우 SWD 연결의 SWO 핀을 사용하게 되면 좀 더 빠르게 정보를 출력할 수 있다. 


 

그림 3.


또한, printf / scanf 의 함수에 대한 라이브러리 설정이 가능하다. 한글 등의 멀티바이트 출력, 스트링 출력 등은 printf, scanf 함수의 사용에 따라 설정할 수 있는 옵션을 제공한다. 또한 디버깅 프로브 장비의 성능에 따라 통신 오류율이 높은 경우 버퍼를 사용할 수 있는 옵션도 제공한다. 참고로 버퍼를 사용하는 경우 출력속도가 늦어질 수 있다.

General Option > Library Options 1 [그림 4]

 

그림 4.


설정이 완료된 후 C-SPY 디버거의 Termianl I/O창으로 정보 출력을 확인할 수 있다. 이러한 경우 UART 하드웨어와 추가 핀, 하드웨어 제어를 위한 코드 PC용 프로그램 사용 등의 많은 리소스를 절약할 수 있다. 속도 또한 UART 보다 빠르게 디버깅 정보를 출력받을 수 있다. 출력/입력을 할 수 있는 창은 C-SPY 디버거에서 View > Terminal I/O 이다[그림 5].

 

그림 5.


JTAG/SWD 디버깅 인터페이스를 사용해 printf 출력을 표시한다. 입력의 경우와 scanf 를 사용하는 경우에는 Teminal I/O 창의 Input 란을 사용한다.


printf 로 출력되는 정보를 파일로 저장하는 경우에는 Debug > Logging > Set Terminal I/O Log File… 을 사용한다[그림 6]. 


그림 6.

 

ITM Event Log 활용하기


ITM Event Log의 기능은 C-SPY 디버거 환경에서 Cortex CoreSight의 ITM 통신 채널을 이용해 응용 프로그램의 동작 중에 사용자가 지정한 이벤트를 아주 빠르게 출력하고 기록하는 기능이다. Cortex-M 3/4/7을 사용한다면 해당 기능을 이용할 수 있다. 하드웨어 로직을 이용하면 printf 와 같이 출력을 위한 코드가 최소화된다. 따라서 애플리케이션 코드 수행에 영향을 가장 최소화해 디버깅 정보를 출력할 수 있다.


ITM Event Log 사용 코드 추가


응용 프로그램의 소스 코드 중에서 사용자가 지정한 특정 위치에 출력되는 이벤트를 만들기 위해 arm_itm.h(armincc 경로에 위치)에서 미리 정의된 매크로를 추가하게 된다. 


다음은 코드 내 매크로 추가의 예다.



앞의 예와 같이 arm_itm.h에 정의된 매크로를 사용자 지정 특정 위치에 코드를 넣으면 된다. Event Log는 ITM 통신 채널 중 1~4번 채널을 이용한다. Event Log를 사용하기 위한 매크로는 다음과 같다.



Event Log 기능을 지원 가능한 디버거 장비는 I-jet, I-Jet Trace, J-link, J-Trace, JTAGjet, JTAGjet Trace 장비가 있다. 디버거 장비와 타깃 보드와의 연결 인터페이스는 SWD 연결로 돼 있어야 하며 반드시 SWO까지 연결이 돼 있어야 Event Log 기능을 사용할 수 있다. Event Log 의 정보는 SWO를 이용해 ITM 정보를 전달 받는다.


[그림 7]은 I-jet 디버거 장비를 이용해 Event Log 기능 사용을 위한 디버거 설정의 예다. I-jet과 타깃 MCU는 SWD+SWO으로 연결 후 디버깅 통신 인터페이스를 SWD로 설정한다.


그림 7.

 

Event Log Window


C-SPY에서 코드의 수행 중 Event Log 사용 코드가 수행되면 Event Log 창에 사용자 지정의 로그가 남게 된다. C-SPY로 진입 후 Debugger 장비 메뉴에서 Event Log를 선택하면 Event Log 창이 나타난다. 예를 들어 I-jet 장비가 연결된 경우 C-SPY 진입 후 I-jet/JTAGjet 메뉴 하단의 Event Log를 선택하면 [그림 8]과 같은 Event Log 창이 나타난다. 


Event Log 창이 나타나면 Event Log 창 안에서 마우스 오른쪽 버튼을 클릭하고 나타나는 Context 메뉴의 Enable를 선택해 Event Log 기능을 활성화시킨다. 


Enable을 선택하면 Event Log의 기능이 활성화되고, 응용프로그램 실행 중 ITM Event Log 기능 사용의 코드를 만나 수행하면 Event Log 창에 해당 로그가 남게된다. Event Log 창에서 사용자가 특정 위치에 넣은 ITM Event Log를 사용하기 위한 코드 위치의 수행 시간, 프로그램 카운터, 지정한 변수의 값을 확인하실 수 있다[그림 9].


그림 9.

 

ITM 1~4 포트를 활용해 기록되는 값을 Hexadecimal 또는 Decimal 타입으로 변경 출력할 수 있으며 각각의 로그의 시간 정보 또는 사이클 정보로 변경해 기록을 볼 수 있다. 또한, Event Log 창에 기록된 정보를 텍스트 파일 형태로 출력물을 만들 수 있다. Event Log 창에서 마우스 오른쪽 버튼을 클릭 후 나타나는 Context 메뉴 중 Save to File … 을 선택하면 파일로 저장된 Event Log가 위치할 경로를 지정하게 된다. 경로를 지정하면 해당 경로에 텍스트 파일로 Event Log 가 저장된다[그림 10].


그림 10. 


텍스트 파일로 저장된 Event Log 정보를 엑셀과 같은 Spread Sheet로 열어보면 좀 더 쉽게 Event Log의 내용을 쉽게 확인할 수 있다.

 

그림 11.


맺음말


디버깅 중 데이터 값을 모니터링하고 파일로 기록하는 여러 방법이 있다. 어떠한 방법은 출력의 시간이 오래 걸려 데이터를 저장 및 관리에 유리할 수 있다. 다른 방법은 출력의 속도가 매우 빨라 애플리케이션 동작에 영향을 주지 않을 수 있으나 데이터 저장 관리가 불편할 수 있다. 여러 방법 중 현재 개발 중인 애플리케이션에 가장 적합한 방법을 찾아 사용하기를 권한다.


글 : 이현도 IAR 시스템즈(IAR Systems) 기술지원팀 과장 (Hyun-Do.Lee@iar.com)










배너









주요파트너/추천기업