[테크월드=정환용 기자] ITM 이벤트 로그(Event Log)의 기능은 C-SPY 디버거 환경에서 코어텍스(Cortex)의 ITM 통신 채널을 이용해 응용프로그램의 동작 중에 사용자가 지정한 이벤트를 아주 빠르게 출력하고 기록하는 기능이다. C-SPY의 ITM 이벤트 로그 기능을 사용하기 위해 미리 정의돼 있는 매크로들을 응용프로그램의 코드 중 사용자가 원하는 위치에 삽입하게 된다.

C-SPY 환경에서 응용프로그램을 실행시킨 후, 동작 중 지정한 위치의 매크로 코드가 수행되면 기록을 남기게 된다. 기록을 남길 때 변수 또는 레지스터의 값을 같이 남길 수 있으며, 기록으로 남기는 값은 8, 16, 32비트의 포맷으로 기록할 수 있다. 또한, 기록되는 위치에서의 PC(Program Counter) 값을 같이 기록할 수 있어, 로그를 남긴 코드의 위치를 쉽게 파악할 수 있다.

ITM 이벤트 로그 기능은 응용프로그램 수행 중 특정 위치에서의 사용자 지정의 값을 확인하고 이를 기록할 수 있다. 이는 응용프로그램의 자세한 동작 확인이나 특정 변수 값의 변화 추이 확인 등 다양한 방법으로 활용된다. 이베트 로그 기능을 활용하면 디버깅에 필요한 다양한 정보를 얻어 좀 더 쉽고 빠른 디버깅을 할 수 있다.

 

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

 

#include <arm_itm.h>

void func(void)
{
ITM_EVENT8_WITH_PC(1,25);
// ITM1번 채널을 이용하여 PC와 숫자 25출력

ITM_EVENT32_WITH_PC(2, __get_PSP());
// ITM1번 채널을 이용하여 PC와 스텍포인터 출력
}

 

이와 같이 arm_itm.h에 정의된 매크로를 사용자 지정 특정 위치에 코드를 넣으면 된다.

이벤트 로그는 ITM 통신 채널 중 1~4번 채널을 이용한다. 이벤트 로그를 사용하기 위한 매크로들은 다음과 같다.

ITM_EVENT8(channel, value)
- 특정 ITM 채널을 이용해 8비트의 값 기록

ITM_EVENT16(channel, value)
- 특정 ITM 채널을 이용해 16비트의 값 기록

ITM_EVENT32(channel, value)
- 특정 ITM 채널을 이용해 32비트의 값 기록
ITM_EVENT8_WITH_PC(channel, value)
- 특정 ITM 채널을 이용해 PC값과 함께 8비트의 값 기록

ITM_EVENT16_WITH_PC(channel, value)
- 특정 ITM 채널을 이용해 PC값과 함께 16비트의 값 기록

ITM_EVENT32_WITH_PC(channel, value)
- 특정 ITM 채널을 이용해 PC값과 함께 32비트의 값 기록

 

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

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

[그림 1] 디버거 설정 예시

ITM 이벤트 로그 동작
디버거 장비의 설정을 마친 후 C-SPY 디버거 환경으로 진입한다. C-SPY에서 응용프로그램의 코드를 실행시키며 Event Log, Event Log Summary, Timline 창을 활용해 다양한 이벤트 로그 기능을 활용할 수 있다.

 

이벤트 로그 윈도우
C-SPY에서 코드의 수행 중 이벤트 로그 사용 코드가 수행되면, 이벤트 로그 창에 사용자 지정의 로그가 남게 된다. C-SPY로 진입 후 ‘Debugger’ 장비 메뉴에서 ‘Event Log’를 선택하면 이벤트 로그 창이 나타난다. 예를 들어 I-jet 장비가 연결된 경우, C-SPY 진입 후 I-jet/JTAGjet 메뉴 하단의 ‘Event Log’를 선택하면 다음의 그림과 같은 이벤트 로그 창이 나타난다. Event Log 창 안에서 마우스 오른쪽 버튼을 클릭하고 나타나는 컨텍스트 메뉴의 ‘Enable’를 선택해 이벤트 로그 기능을 활성화시킨다.

[그림 2] 이벤트 로그 기능 활성화

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

[그림 3] 로그가 남아 있는 이벤트 로그 창

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

[그림 4] ‘save to file’로 경로를 지정해 이벤트 로그 파일을 텍스트 파일로 저장한다.

텍스트 파일로 저장된 이벤트 로그 정보를 엑셀과 같은 스프레드시트로 열어보면 좀 더 쉽게 이벤트 로그의 내용을 확인할 수 있다.

[그림 5] 텍스트로 저장된 이벤트 로그 정보는 스프레드시트로 쉽게 확인할 수 있다.

 

이벤트 로그 서머리 윈도우

사용자 지정 위치에서의 다양한 값을 기록해주는 Event Log 창 외의 C-SPY 동작 중 이벤트 로그 기록의 주요 요약 정보를 확인할 수 있는 ‘Event Log Summary’ 창이 있다. 이벤트 로그 서머리 창은 C-SPY로 진입 후 Debugger 장비 메뉴에서 ‘Event Log Summary’를 선택하면 나타난다. 예를 들어 I-jet 장비가 연결된 경우 C-SPY 진입 후 ‘I-jet/JTAGjet’ 메뉴 하단의 ‘Event Log Summary’를 선택하면, [그림 6]과 같은 이벤트 로그 서머리 창이 나타난다.

이벤트 로그 창과 마찬가지로 Event Log Summary 창 안에서 마우스 오른쪽 버튼을 클릭하고 나타나는 Context 메뉴의 ‘Enable’를 선택해야 이벤트 로그 서머리 기능이 활성화된다.

[그림 6] 이벤트 로그 서머리 기능 활성화

Event Log Summary 창에서 이벤트 로그의 기능이 활성화돼 있는 동안 실시간으로 ITM1~4의 각 채널 별 이벤트 로그 기록 횟수와 출력된 값의 평균, 최대, 최소 값을 확인할 수 있고, 측정 간격의 평균 시간, 최대 간격, 최소 간격도 확인할 수 있다. 또한, 대략의 시간 카운트, 오버플로 카운트, 현재 동작 시간 또는 사이클 수의 정보도 확인할 수 있다.

[그림 7] ITM1~4의 채널 별 이벤트 로그 기록과 각종 정보를 확인할 수 있다.

Event Log Summary 창의 내용도 파일로 저장할 수 있다. Event Log Summary 창에서 마우스 오른쪽 버튼을 클릭하고 나타나는 컨텍스트 메뉴에서 ‘Save to file’을 선택하면 Event Log Summary를 저장할 위치를 지정하게 된다. 경로를 지정하면 해당 경로에 Event Log Summary의 내용이 텍스트 파일로 저장된다.

[그림 8] 이벤트 로그 서머리 내용 역시 텍스트 파일로 저장할 수 있다.

 

타임라인 윈도우
이벤트 로그를 텍스트 형태로 확인하고 기록하는 방법 외에, 시간 경과에 따른 이벤트 기록을 한눈에 확인할 수 있는 타임라인(Timeline) 창에서도 확인할 수 있다. 타임라인 창은 C-SPY로 진입 후 Debugger 장비 메뉴에서 ‘Timeline’을 선택하면 Event Log Summary 창이 나타난다.

예를 들어 I-jet 장비가 연결된 경우 C-SPY 진입 후 ‘I-jet/JTAGjet’ 메뉴 하단의 Timeline를 선택하면 다음과 같은 Timeline 창이 나타난다. 이벤트 로그의 기록을 확인하기 위해 Timeline 창의 Events 레인에서 마우스 오른쪽 버튼을 클릭 후 나타나는 컨텍스트 메뉴 중 Enable 항목을 선택해 Event Log의 표시를 활성화하면 된다.

[그림 9] 타임라인 이벤트 로그 표시 활성화

활성화가 되면 ITM1~4의 포트에 대한 레인이 나타나고, 코드를 실행시키면서 Event Log에 대한 ITM1~4의 포트의 기록을 시간 경과 기준으로 확인할 수 있다.

[그림 10] ITM1~4 포트의 기록 시간 경과 기준 확인

 

맺음말
작성된 코드의 동작 중 디버깅을 위해 여러 방법으로 정보를 출력하고 모니터링한다. 많이 사용되는 방법은 UART 통신을 이용해 디버깅을 정보를 확인하는 방법이다. UART를 사용하는 방법은 디버깅 정보를 출력하기 위해 반드시 별도의 하드웨어가 사용돼야 하며, 이를 제어하기 위한 코드가 추가돼야 한다. 또한, 정보 출력을 위해 하드웨어의 제어코드가 추가 사용됨으로써, 작성된 코드 수행시간이 변경될 수 있다. 반면 코어텍스 코어의 ITM을 이용한 이벤트 로그 기능은 특정 주소에 출력할 값을 쓰는 것만으로 데이터를 외부로 전송하고, 이를 C-SPY에서 확인할 수 있다. 따라서 디버깅과 코드 분석에 매우 효과적으로 사용될 수 있다.

 

작성: IAR Systems 이현도 과장

이 기사를 공유합니다
Tag

키워드

#ITM #이벤트로그 #IAR
저작권자 © 테크월드뉴스 무단전재 및 재배포 금지