일반적으로 코드의 실행 시간을 측정하기 위해 하나의 GPIO출력 포트에 High, Low 신호를 통해 오실로스코프로 시간을 측정 합니다. 하지만 Cortex-M3 또는 M4 디바이스를 사용하는 경우 계측 장비 없이 IAR Embedded Workbench(이하 EWARM)에서 지원되는 기능을 이용하면 실행 시간을 측정할 수 있습니다.

Cortex-M 디바이스는 Coresight라는 디버그 모듈이 있어 SWD 인터페이스와 SWO를 지원합니다.  SWO포트는 디버깅을 위한 1 Pin의 출력용 포트입니다. 이 SWO를 통해 실행 코드의 위치(PC), 시간정보등의 자료를 수신할 수 있으며 시리얼 포트 대신에 디버깅을 위한 정보를 전달 할 수 도 있습니다.

EWARM에서 지원되는 기능들을 이용하여 실행 시간을 측정하는 방법에 대해 살펴 보겠습니다.
- Data Log
- Event Log
- Cycle Counter

 

1. Data Log를 이용한 실행 시간 측정
Data log  윈도우는  해당 데이터를 엑세스하는 경우 코드의 위치(PC)와 시간정보 그리고 데이터 값의 정보를 표시합니다. 이 기능을 이용하여 데이터를 엑세스한 시간차로 실행 시간을 알 수 있습니다.

 

사용 방법은 먼저 전역 변수를 선언합니다. 예를 들어 volatile unsigned int mmm; 와 같이 선언 합니다. 그리고 시간을 측정하고자 하는 코드의 시작 위치에 mmm = 0; 코드를 추가하고, 마지막 위치에 mmm = 1; 을 추가합니다.   

측정 방법은 mmm을 선택하고 나서 마우스 오른쪽 버튼을 클릭하고 Set Data Log Breakpoint for ‘mmm’을 선택합니다. View메뉴에서 Breakpoints 윈도우를 열고 설정한 브레이크포인트를 선택합니다.

그런 다음 마우스 오른쪽버튼을 클릭하여 문맥(context) 메뉴를 열고 Edit메뉴를 선택합니다. 그러면 다음과 같이 Edit Breakpoint 윈도우가 열리고 엑세스 타입을 Write로 지정 할 수 있습니다.

Download and Debug버튼을 클릭하여 C-SPY 디버거를 실행합니다. 디버그 프로브 I-jet을 사용 하는 경우 I-jet/JTAGjet메뉴가 있습니다. 이 프로브 메뉴에서 Data Log를 열고 Data Log 윈도우에 커서를 위치시킨 후 마우스 오른쪽 버튼을 클릭 후 Enable를 선택하여 윈도우를 활성화합니다. 

Go 버튼을 클릭하여 프로그램을 실행하면 해당 데이터를 엑세스할 때마다 시간, PC, 데이터 값, 주소 정보를 표시합니다. 표시되는 시간 값의 차를 이용하여 실행 시간을 측정할 수 있습니다. 

 
 
 


해당 Data Log 자료가 필요없는 경우 윈도우를 닫기 전에 Enable한 상태를 다시 한 번 선택해 비활성화해야 더 이상 해당 디버깅 정보가 송출되지 않습니다. 동작이 되지 않는 경우 다음 사항을 확인 하십시오. 사용하고 있는 디버그 프로브의 Data Log기능 지원 여부를 확인하시기 바랍니다.

 

또한 I-jet/JTAGjet메뉴 > SWO Configuration을 선택하여 실제로 동작 중인 MCU 클럭을 기입해야 합니다. 그리고 프로젝트 옵션에서 I-jet/JTAGjet 카테고리에서 SWD 인터페이스를 확인 하십시오. 


2. EvenLog를 이용한 실행 측정
응용 프로그램의 소스 코드 중에서 사용자가 지정한 특정 위치에 출력되는 이벤트를 만들기 위하여 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 기능을 사용할 수 있습니다. I-jet 디버거 장비를 이용하여 Event Log 기능사용을 위한 디버거 설정은 앞에서 언급된 <그림. 5>를 참조하십시오.

디버거 장비의 설정을 마친 후 C-SPY 디버거 환경으로 진입합니다. C-SPY로 진입 후 Debugger probe 메뉴에서 Event Log를 선택하시면 Event Log 창이 나타납니다. 예를 들어 I-jet 장비가 연결된 경우 C-SPY 진입 후 I-jet/JTAGjet 메뉴의 Event Log를 선택하면 다음의 그림과 같은 Event Log 창이 나타납니다. 

 

Event Log 창이 나타나면 Event Log 창 안에서 마우스 오른쪽 버튼을 클릭하고 나타나는 문맥 메뉴의 Enable를 선택하여 Event Log 기능을 활성화시킵니다. 프로그램을 실행시키면 ITM Event Log 코드, 즉 ITM_EVENT32_WITH_PC(1, 100); 와 같은 코드를 실행할 때 로그를 작성하게 됩니다.

 

그리고 Event Log Summary 윈도우에서는 ITM 데이터의 송신 시간에 대한 평균 인터벌 값의 시간 정보도 확인할 수 있습니다.


3. Cycle Counter를 이용한 실행 시간 측정
CYCLECOUNTER를 보기 위해 가장 쉬운 방법은 레지스터 화면에서 확인하는 것입니다. 메뉴에서 View > Register를 선택하면 레지스터 화면이 표시됩니다. 이 때 Register 윈도우에서 CPU Registers를 선택하면 CYCLECOUNTER가 표시됩니다. 

이와 함께 CCTIMER1, CCTIMER2, CCSTEP라는 레지스터도 표시되어 있습니다. 프로그램을 단계별로 실행해 나가면 CYCLECOUNTER, CCTIMER1, CCTIMER2 값이 CCSTEP 값만큼 가산되어 가는 것을 알 수 있습니다. 가장 간단한 시간 측정 방법은 실행하고 멈춘 후 이 값을 읽는 것입니다.

CYCLECOUNTER 값은 지속적으로 추가되기 때문에 소스 코드의 한 지점에서 다른 한 지점까지의 경과 시간을 계산하려면 이전 값을 기억하여 새 값에서 뺄셈을 해야 하므로 번거로운 작업입니다.

 

이 경우에는 측정을 시작하는 지점과 측정 종료 지점에 브레이크를 넣습니다. 측정을 시작하는 중단점에 브레이크가 걸렸을 때, CCTIMER1 값을 0으로 설정 한 후 프로그램을 실행시켜 측정을 종료하는 점에 CCTIMER1 값을 읽으면 경과 시간을 그대로 얻을 수 있습니다.

이렇게 CCTIMER1과 CCTIMER2 처럼 사용자가 사용할 수 있는 카운터가 있기 때문에 두 가지를 측정 할 수 있습니다. <그림 10> 참조.

CYCLECOUNTER, CCTIMER 이외에 EWARM의 좋은 기능 중 하나 인 C-SPY 매크로를 조합 해 사용하면 방금 수동으로 했던 작업을 자동화 할 수 있습니다. 이번에는 두 매크로를 준비했습니다. 파일 이름을 aa.mac으로 내용을 저장하십시오. 

 

Clear_TIMER1는 CCTIMER1를 0으로 설정하고 확인을 위해 디버그 로그 재설정 메시지를 출력합니다. Dump는 CYCLECOUNTER과 CCTIMER1의 값을 디버그 로그에 기록합니다. 여기서 __message 디버그 로그에 메시지를 출력하는 매크로 함수입니다. 자세한 내용은 디버깅 설명서를 참조하시기 바랍니다. 또한 C-SPY 매크로 CCTIMER1에 액세스하려면 #CCTIMER1 처럼 #을 붙여 기재해야 합니다.

 

프로젝트 옵션에서 Debugger 카테고리의 Setup 탭에서 작성한 매크로를 <그림 12>와 같이 등록합니다. 참고로 $PROJ_DIR$는 프로젝트 파일(.ewp)이 있는 폴더 위치입니다.

 

실행 코드를 타겟 보드에 다운로드하고 디버그 모드로 진입합니다. 먼저 시작과 종료 위치에 중단점(breakpoint)을 설정합니다. 소스 코드 편집기의 왼쪽 여백을 클릭하여 중단점을 설정하면 됩니다.

 

방금 전 작성한 2개의 매크로를 중단점에 설정합니다. 메뉴에서 View > Breakpoints를 선택하면 중단점 윈도우가 열립니다. 

 

프로그램을 실행 시키면 중단점 위치에서 코드가 실행될 때 마다 매크로가 동작하여 메시지를 표시합니다. 시간 계산은 100MHz로 동작되는 MCU에서 440397 Cycle counter이면
440397 / 100000000 = 0.00440397(sec) 입니다.

 

4. 맺음말
어느 정도의 타이밍마다 특정 함수를 호출하는가와 같은 실행 시간을 측정하는 방법에 대해 살펴 보았습니다. EWARM과 Cortex-M 디바이스를 사용하며, SWO 기능을 사용할 수 있다면 편리하고 쉽게 실행 시간 정보를 확인할 수 있습니다. 감사합니다.

 

 

고성용 이사 / IAR 시스템즈
Sung-Yong.Ko@iar.com

 

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