이번 글에서는 IAR Embedded Workbench for ARM(이하 EWARM)에서 ETM (Embedded Trace Macrocell) 을 이용하여 지원하는 다양한 C-SPY 디버깅 기능에 대해 살펴 보겠습니다. 그리고 디버그 프로브는 I-Jet Trace 장비를 이용하여 설명 드리도록 하겠습니다.

[그림 1] MIPI-20 Connector

<그림 1>은 MIP-20 Connector 로 JTAG/SWD 인터페이스를 함께 구성하여 선택적으로 사용할 수 있는 구조이며, ETM Trace 연결을 위한 핀(TRACECLK, TRACEDATA)들이 설정되어 있습니다. 만일 트레이스(trace) 장비를 타겟보드와 연결하려면 MIPI-20 connector를 사용해야 합니다. Trace 정보를 수집하는 방식에 대해 살펴 보겠습니다.

ETM (Embedded Trace Macrocell)

디버그 프로브에 별도의 트레이스 버퍼를 가지고 있어 ETM 인터페이스를 통해 트레이스 정보를 이 버퍼에 저장하는 방식입니다.(big buffer) 4~32 비트 데이터 버스를 가지며 CPUCLK or CPUCLK/2 클럭을 사용합니다. 고속의 신호들이기 때문에 보드 디자인 시 각 신호의 품질을 만족시켜야 정상 동작합니다. 디버그 프로브 장치명에 Trace라는 문구가 일반적으로 포함됩니다. 예) I-jet Trace

ETB (Embedded Trace Buffer)

칩 전용의 트레이스 버퍼를 가지고 있습니다(small buffer). 별도의 신호 핀이 필요하지 않으며 트레이스 프로브도 필요하지 않습니다.

MTB (Micro Trace Buffer)

칩에서 설정 가능한 트레이스 버퍼이며, 어플리케이션에서 공유할 수 있습니다.(small buffer) 별도의 신호 핀이 필요하지 않으며, 트레이스 프로브도 필요하지 않습니다. Cortex-M0+ core 에서만 사용이 가능합니다.

[그림 2] ARM Cortex-M Trace System

ETM Trace

ETM Trace 윈도우는 C-SPY 실행 상태에서 I-Jet/JTAGjet 메뉴 > ETM Trace를 선택하면 윈도우가 <그림 3>과 같이 열립니다. 맨 좌측의 Enable 버튼을 클릭하여 Trace 동작을 활성화합니다. 타겟 보드의 어플리케이션을 실행시키고 멈추게 되면 실행되었던 명령어의 이력을 확인할 수 있습니다.

[그림 3] ETM Trace 윈도우

ETM Function Trace

ETM Function Trace 윈도우는 C-SPY 실행 상태에서 I-Jet/JTAGjet 메뉴의 Function Trace를 선택하면 윈도우가 <그림 4>와 같이 열립니다. 앞서 살펴본 ETM Trace 윈도우와 비슷한 버튼들을 확인할 수 있으며 Enable 버튼을 클릭하여 활성화된 상태에서만 윈도우에 정보가 표시됩니다. ETM Function Trace 윈도우에서는 함수의 Call 정보를 확인할 수 있어 잘못된 코드가 어디로부터 호출되었는지에 대한 상황을 쉽게 파악할 수 있습니다.

[그림 4] ETM Function Trace
[그림 5] 타임라인 윈도우의 Call Stack

Timeline - Call Stack

Timeline 윈도우는 정보를 그래픽화하여 표현하는 창으로 Trace 장비를 이용하면 Call Stack정보를 확인할 수 있습니다. 어느 함수에서 호출이 이루어졌는지에 대해 트리 구조 방식으로 계층적 분석이 용이하여 쉽게 코드의 실행에 대한 흐름을 파악할 수 있습니다.

RTOS를 포함하고 있는 어플리케이션에서 <그림 5>에서 볼 수 있 듯이 세마포어(semaphore)에 대한 pending, posting 처리에 대한 함수 호출에 대한 흐름의 정보를 확인 할 수 있습니다. 참고로 printf()문의 경우 putchar()와 __write() 함수가 호출되는 것을 확인 할 수 있으며 이 함수의 코드를 USART로 출력하게 작성하면 USART 포트로 출력이 됩니다.

Trace Breakpoint

Trace에 대한 정보는 실행이 멈추었을 때 표시됩니다. 일반적인 코드 또는 데이터 브레이크 포인터는 실행을 멈추게 할 수는 있습니다. 그러나 trace를 시작해야 하는 시점에 대한 정보가 없어 필요하지 않는 방대한 정보를 수집하게 되거나 실행이 멈추면서 trace 기능도 함께 중단되어 trace 정보를 더 이상 수집할 수 없게 됩니다.

이러한 불편 한 점을 보완하기 위해 Trace Start, Trace Stop, Trace Filter에 대한 기능을 추가하였습니다. Trace Start 위치에 있거나 Trace Filter에 의한 트리거가 동작하면 Trace 를 시작합니다. 그리고 trace 중단은 Trace Stop 또는 Trace Filter의 트리거에 의해 처리됩니다.

Trace Start인 경우 설정 방법은 원하는 시작 위치의 소스 코드에 커서를 위치시키고 마우스 오른쪽 버튼을 클릭하여 컨텍스트 메뉴를 호출합니다. 이때 Toggle Breakpoint (Trace Start)를 선택합니다. 그리고 View > Breakpoints를 선택하여 브레이크포인트 윈도우를 열고 해당 브레이크포인트를 선택하고 마우스 오른쪽 버튼을 클릭한 후 Edit 메뉴를 선택합니다. 그러면 <그림 7>과 같이 Trace Start 브레이크포인트에 대한 설정 화면이 생성됩니다. 같은 방식으로 Trace Stop와 Filter 브레이크포인트를 설정할 수 있습니다.

[그림 6] Trace Breakpoint 설정

Function Profiling

Function Profiling은 어플리케이션이 실행하는 동안 가장 많이 CPU를 사용하는 함수를 찾는데 도움이 됩니다. 이러한 함수는 좀 더 빠른 성능을 위해 속도(speed) 위주의 최적화를 적용시켜 실행 코드를 빠르게 생성하거나 보다 효율적인 메모리에 위치시켜 성능을 향상 시킬 수 있습니다.

[그림 7] Trace Start 편집 윈도우

또한 잘못된 호출로 비정상적인 사용 빈도를 보이는 함수에 대해 오류 사항을 확인 할 수 있습니다. Trace (calls)와 Trace (flat)의 두 종류를 지원하는데 Trace (calls)는 전체적인 명령어 추적(instrunction trace) 정보가 모든 함수에 대해 호출(call)과 복귀(return)에 대해 분석한 자료를 표시합니다. 그리고 Trace (flat)은 모든 명령어 추적에서 각각의 명령어 또는 SWO Trace를 통해 수집된 PC샘플에 대해 함수의 호출과 복귀에 상관없이 대응되는 함수 또는 단편적인 코드에 대한 정보를 나타냅니다. <그림 8>과 <그림 9>를 참조하십시오.

[그림 8] Function Profiling - Trace (calls)
[그림 9] Function Profiling - Trace (flat)

Instruction Profiling

앞서 함수 레벨에서의 프로파일 정보를 확인하였습니다. 디스어셈블리 창에서는 명령어 레벨의 프로파일 정보를 확인할 수 있습니다. 디스어셈블리 윈도우에서 마우스 오른쪽 버튼을 클릭하고 Instruction Profiling> Enable, Show를 선택하면 실행되었던 횟수를 <그림 10>과 같이 확인 할 수 있습니다.

[그림 10] Instruction Profiling

Code Coverage at Function Level

함수 단위로 코드의 실행 여부를 확인 할 수 있는 기능이 Code Coverage 입니다. 녹색의 부분이 실행된 코드를 의미하며, 적색 부분이 실행되지 않은 코드를 가리킵니다. 적색 부분의 +를 펼쳐보면 노란색으로 실행되지 않은 코드의 위치를 표시해 주고 있습니다. View > Code Coverage를 선택하여 윈도우를 열 수 있습니다.

[그림 11] 함수 코드 커버리지

Code Coverage at Instruction Level

함수 수준에서 코드의 실행 여부를 확인 할 수 있으며, 또한 명령어 레벨에서도 실행 여부를 확인 할 수 있습니다. 디스어셈블리 윈도우에서 마우스 오른쪽 버튼을 클릭하고 Code Coverage > Enable, Show를 선택하면 실행되었는지에 대한 정보를 <그림 12>와 같이 확인 할 수 있습니다.

[그림 12] 명령어 코드 커버리지

ETM Trace를 이용한 C-SPY 디버그 기능에 대해 살펴 보았습니다. I-jet Trace는 trace 기능 지원으로 I-jet보다 다양한 기능을 지원합니다. 복잡한 코드에서 발생되는 오류를 파악하기 위해서는 앞에 살펴 본 기능들을 활용하여 보다 빠르게 원인을 찾을 수 있기를 바랍니다. 

글 : 고성용 이사 <Sung-Yong.Ko@iar.com>

자료제공 : IAR 시스템즈 <www.iar.com>

이 기사를 공유합니다
저작권자 © 테크월드뉴스 무단전재 및 재배포 금지