C-SPY에서 인터럽트 서비스 루틴의 논리를 테스트하고 대상 시스템에서 인터럽트 처리를 디버그하는 데 도움이 되는 방법에 대해 설명한다.

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

 

인터럽트 시뮬레이션은 하드웨어와 같은 동작을 한다. 즉, 인터럽트의 실행은 글로벌 인터럽트 활성화 비트의 상태에 따라 실행된다. maskable 인터럽트의 실행은 개개의 인터럽트 활성화 비트 상태에 따라 달라진다. 다양한 장치에 대해 이러한 작업을 수행하려면 인터럽트 시스템은 사용 가능한 각 인터럽트에 대한 자세한 정보를 가져야 한다.

 

인터럽트 소개

인터럽트 로깅과 인터럽트 시뮬레이션에 대해 소개한다.

1. 인터럽트 로깅

인터럽트 로깅은 인터럽트 이벤트에 대한 포괄적인 정보를 제공한다. 어떤 인터럽트를 빠르게 하기 위해 세밀한 조절이 가능하도록 한다. 그리고 인터럽트의 시작과 종료를 기록할 수 있다.

인터럽트 로그 창에 표시되는 로그와 요약 내용은 인터럽트 로그 요약 창에서 사용할 수 있다. 타임라인 윈도우에서 인터럽트 그래프는 응용프로그램이 실행하는 동안 인터럽트 이벤트의 그래픽 뷰를 제공한다.

※ 인터럽트 로깅(interrupt logging)에 대한 요구 사항

인터럽트 로깅을 사용하려면 다음이 필요하다.

- I-jet 또는 JTAGjet 디버그 프로브 그리고 디버그 프로브와 타겟 보드 간의  SWD 인터페이스
- J-LINK 또는 J-Trace 디버그 프로브 그리고 디버그 프로브와 타겟 보드 간의 SWD 인터페이스
- ST-LINK 디버그 프로브 그리고 디버그 프로브와 타겟 보드 간의 SWD 인터페이스
- 인터럽트 로그 창, 인터럽트 로그 요약 윈도우, 또는 타임라인 윈도우에서 인터럽트 로깅 활성화

인터럽트 로깅은 C-SPY 시뮬레이터에서 지원된다.

2. 인터럽트 시뮬레이션 시스템

인터럽트를 시뮬레이션하면, 인터럽트 서비스 루틴의 논리를 하드웨어를 사용하기 전에 대상 시스템에 대한 인터럽트 처리를 테스트하고 디버깅할 수 있다.

C-SPY 매크로 중단점과 함께 시뮬레이션 인터럽트를 사용하는 경우, 예를 들어, 인터럽트 구동 주변 장치의 복잡한 시뮬레이션을 작성할 수 있다. C-SPY 시뮬레이터는 디버깅하는 동안 인터럽트의 실행을 시뮬레이션할 수 있는 인터럽트 시뮬레이션 시스템을 포함하고 있다. 하드웨어 인터럽트 시스템과 유사하게 인터럽트 시뮬레이션 시스템을 구성할 수 있다.

인터럽트 시스템은 다음과 같은 기능이 있다.

- ARM 코어에 대한 인터럽트 시뮬레이션 지원
- 사이클 카운터를 기반으로 단일 또는 정기적인 인터럽트
- 다양한 장치에 대한 미리 정의된 인터럽트
- 보류 시간, 확률, 그리고 타이밍 변화에 대한 구성
- 타이밍 문제를 찾는 상태 정보
- 대화 상자 또는 C-SPY 시스템 매크로를 사용하여 인터럽트를 구성 할 수 있으며, 인터랙티브와 자동화 인터페이스를 제공한다. 또한 즉시 인터럽트를 강제할 수 있다.
- 지속적으로 각 정의된 인터럽트에 대한 이벤트를 표시하는 로그 윈도우
- 현재 인터럽트 활동을 보여주는 상태 윈도우

그림 1.
시뮬레이션 인터럽트 구성





 

3. 인터럽트 특성

시뮬레이션 인터럽트는 타깃 하드웨어에서 실제 인터럽트와 유사하도록 만들기 위해 각각의 인터럽트를 세밀히 조정할 수 있다. 첫 번째 활성화 시간, 반복 간격, 보류 시간, 차이, 그리고 확률을 지정할 수 있다(그림 1).

인터럽트 시뮬레이션 시스템은 시뮬레이터에서 인터럽트가 발생되는 때를 결정하는 클럭으로 사이클 카운터를 사용한다. 사이클 카운터에 기반한 최초의 활성 시간(first activation time)을 지정해야 한다.

C-SPY는 사이클 카운터가 지정된 활성화 시간이 경과될 때 인터럽트를 생성한다.

그러나 인터럽트는 명령어 사이에서만 동작할 수 있다. 이는 명령어가 얼마나 많은 사이클을 취하는지 상관없이 인터럽트가 생성되기 전에 전체 어셈블러 명령어가 실행되어야 한다는 의미다.

인터럽트 생성의 주기성을 정의하기 위해 반복 간격(repeat interval)을 지정할 수 있다. 이는 새로운 인터럽트가 얼마 후에 생성돼야 하는지에 대한 사이클의 양을 정의한다. 반복 간격뿐만 아니라 주기성은 확률과 변화의 두 가지 옵션에 따라 달라진다.

- 확률(probability): 확률은 인터럽트가 기간 안에 발생될 수 있는 가능성, 퍼센트 단위
- 변화(variance): 반복 간격의 비율로 시간 변화의 범위.

이들 옵션은 인터럽트 시뮬레이션을 무작위로 발생할 수 있게 한다. 또한 인터럽트가 처리되지 않은 경우 삭제될 때까지 대기 상태 시간을 설정하는 대기 시간(hold time)을 지정할 수 있다. 보류 시간이 무한(infinite)으로 설정되어 있는 경우, 인터럽트가 인지되거나 제거될 때까지 대기중인 비트(pending bit)가 설정된다.

그림 2.
시뮬레이션 상태(예 1)







그림 3.
시뮬레이션 상태(예 2)






4. 인터럽트 시뮬레이션 상태

인터럽트 시뮬레이션 시스템은 응용 프로그램에서 타이밍 문제가 발생되는 위치에 대해 사용할 수 있는 상태 정보가 포함되어 있다. 인터럽트 상태 창에는 사용 가능한 상태 정보를 제공한다. 인터럽트에 대해 대기(Idle), 유휴(pending), 실행(executing), 일시 중지(suspended) 등의 정보를 표시할 수 있다.

일반적으로 반복적인 인터럽트는 실행 시간보다 더 긴 반복 간격을 지정한다. 이 경우 다른 시간에 상태 정보는 그림 2와 같다.

※ 참고: 인터럽트 활성화 신호는(pending bit로 인식) 인터럽트 핸들러에 의해 인지되는 순간 자동으로 비활성화 된다. 그러나 인터럽트 반복 간격이 실행 시간보다 짧고 인터럽트가 재진입(reentrant or non-maskable)인 경우, 다른 시간에 상태 정보는 그림 3과 같다.

반복 간격보다 실행 시간이 더 긴 경우에는 인터럽트 핸들러를 재작성하고 빠른 처리가 되도록 만들거나, 인터럽트 시뮬레이션 시스템의 반복 간격을 더 길게 지정해야 한다.

5. 인터럽트 시뮬레이션을 위한 C-SPY 시스템 매크로

이미 시뮬레이션 인터럽트의 세부 사항을 정리했을 때 완전히 요구 사항을 충족하도록 하기 위해 매크로는 유용하게 사용된다.

시뮬레이션 인터럽트에 대한 정의가 포함 된 매크로 함수를 작성하는 경우, C-SPY가 시작될 때 자동으로 함수를 실행할 수 있다. 또 다른 장점은 시뮬레이션 인터럽트 정의가 매크로 파일을 사용하는 경우 문서화될 것이며, 여러 엔지니어가 개발 프로젝트에 참여하는 경우 그룹 내에서 매크로 파일을 공유할 수 있다.

C-SPY 시뮬레이터는 인터럽트에 관한 미리 정의된 시스템 매크로를 제공한다. 처음 다섯 매크로의 매개 변수는 인터럽트 대화 상자와 동등한 항목에 해당한다.

__enableInterrupts
__disableInterrupts
__orderInterrupt
__cancelInterrupt
__cancelAllInterrupts
__popSimulatorInterruptExecutingStack

6. 대상-적응 인터럽트 시뮬레이션 시스템

인터럽트 시뮬레이션 시스템은 사용이 편리하다. 그러나 인터럽트 시뮬레이션 시스템을 최대한 활용하는 방법은 사용하는 프로세서에 대한 적용 방법을 알고 있어야 한다.

인터럽트 시뮬레이션은 하드웨어와 같은 동작을 한다. 즉, 인터럽트의 실행은 글로벌 인터럽트 활성화 비트의 상태에 따라 실행된다. maskable 인터럽트의 실행은 개개의 인터럽트 활성화 비트 상태에 따라 달라진다.

다양한 장치에 대해 이러한 작업을 수행하려면 인터럽트 시스템은 사용 가능한 각 인터럽트에 대한 자세한 정보를 가져야 한다. 기본 설정 정보를 제외하고 이런 정보는 장치 설명 파일(device description file)에 제공된다. 기본 설정은 장치 설명 파일을 지정하지 않는 경우 사용된다.

인터럽트 시스템 사용하기

인터럽트 시뮬레이션과 관련된 다양한 작업을 설명한다.

1. 간단한 인터럽트 시뮬레이션

이 예제는 OKI ML674001에 대한 타이머 인터럽트를 시뮬레이션하는 방법을 보여준다. 그러나 이 절차는 다른 종류의 인터럽트에 대해서도 사용할 수 있다.

※ 인터럽트를 시뮬레이션하고 디버깅하기


표 1.
타이머 인터럽트 설정




 


/* Enables use of extended keywords */
#pragma language=extended
#include
#include
#include
unsigned int ticks = 0;
/* IRQ handler */
__irq __arm void IRQ_Handler(void)
{
/* We use only system timer interrupts, so we do not need
to check the interrupt source. */
ticks += 1;
TMOVFR_bit.OVF = 1; /* Clear system timer overflow flag */
}

int main( void )
{
__enable_interrupt();
/* Timer setup code */
ILC0_bit.ILR0 = 4; /* System timer interrupt priority */
TMRLR_bit.TMRLR = 1E5; /* System timer reload value */
TMEN_bit.TCEN = 1; /* Enable system timer */
while (ticks < 100);
printf("Donen");
}


 

1) 시스템 타이머 인터럽트를 처리하는 IRQ 핸들러 루틴을 포함하는 간단한 응용 프로그램을 가정한다. tick 변수를 증가한다. 메인 함수는 필요한 상태 레지스터를 설정한다. 100 인터럽트가 수행되면 응용 프로그램은 종료한다.
2) 응용 프로그램 소스 코드에 인터럽트 서비스 루틴을 추가하고 프로젝트에 파일을 추가한다.
3) 프로젝트를 빌드하고 시뮬레이터를 시작한다.
4) 인터럽트 설정 대화 상자를 열기 위해  Sim ulator>Interrupt Setup을 선택한다. 인터럽트 시뮬레이션을 활성화하기 위해 Enable inter rupt simulation을 선택하자. 인터럽트 편지 대화 상자를 열기 위해 New를 클릭하자. 타이머 예를 들어, 표 1과 같은 설정을 확인하자. 이후 OK를 클릭한다.
5) 응용 프로그램을 실행한다. 응용 프로그램 소스 코드에서 정상적으로 인터럽트가 사용되면, C-SPY에서 사이클 카운터가 4000을 통과할 때 인터럽트를 생성한다. 그리고 지속적으로 약 2000 사이클 후 인터럽트를 반복한다.
6) 인터럽트 동작을 보려면, 인터럽트 로그 창을 열기 위해 Simulator>Interrupt Log를 선택한다.
7) 인터럽트 로그 창에서 사용할 수 있는 컨텍스트 메뉴에서 로깅을 사용하기 위해 Enable을 선택한다. 프로그램 실행을 재 시작하면, 인터럽트 진입과 종료에 대한 상태 정보가 인터럽트 로그 창에 표시된다.

2. 멀티 테스크 시스템에서 인터럽트를 시뮬레이션

인터럽트 핸들러에서 일반적인 명령어로 복귀하지 않는 방식으로 인터럽트를 사용하는 경우, 예를 들어 테스크 전환 기능의 OS에서 시뮬레이터는 인터럽트가 실행이 완료되었는지를 감지할 수 없다.
인터럽트 시뮬레이션 시스템은 제대로 작동하지만, 인터럽트 설정 대화상자에서 상태 정보가 예상대로 보이지 않을 것이다. 그리고 너무 많은 인터럽트가 동시에 실행되면 경고가 발생될 수 있다.

※ 일반 인터럽트 종료를 시뮬레이션하려면 :

- 인터럽트 함수에서 복귀 명령어에 코드 중단점을 설정한다.
- 중단점에 대한 조건으로__popSimulatorInterruptExecutingStack 매크로를 설정한다. 중단점이 트리거되면 매크로가 실행되고 응용 프로그램은 자동으로 실행된다.

3. 인터럽트 로깅 사용 시작하기

1) 인터럽트 로그 창을 열기 위해 C-SPY driver>Interrupt Log를 선택한다. 인터럽트 로그 요약 창을 열기 위해 C-SPY driver>Interrupt Log Summary를 선택할 수 있고, 타임 라인 창을 열고 인터럽트 그래프를 보기 위해 C-SPY driver>Timeline을 선택할 수 있다.
2) 인터럽트 로그 창에서 컨텍스트 메뉴에서 로그를 사용하기 위해 Enable을 선택한다. SWO 구성 대화 상자에서, 인터럽트 로그가 활성화되어있는 인터럽트 로그 이벤트 영역을 볼 수 있다.
3) 로그 정보를 수집하기 위해 응용 프로그램을 실행한다.
4) 인터럽트 로그 정보를 보려면 인터럽트 로그, 인터럽트 로그요약, 또는 타임 라인 창에서 인터럽트 그래프 중에서 볼 수 있다.
5) 파일에 로그 또는 요약을 저장하려면 윈도우의 컨텍스트 메뉴에서 Save to log file을 선택한다.
6) 인터럽트 로그 창의 컨텍스트 메뉴에서 인터럽트 로깅을 사용하지 않으려면 Enable을 비활성화로 전환한다.

그림 4.
인터럽트 설정 대화 상자



 
 

인터럽트에 대한 참조 정보

1. 인터럽트 설정 대화 상자(Interrupt Setup dialog box)

인터럽트 설정 대화 상자는 Simulator>Interrupt Setup을 선택하여 사용할 수 있다. 이 대화 상자에는 정의된 모든 인터럽트를 나열한다. 인터럽트 시뮬레이션 시스템을 활성화하거나 비활성화할 수 있으며, 개별 인터럽트를 활성화 또는 비활성화할 때도 이 대화 상자를 사용한다.

2. 인터럽트 편집 대화 상자(Edit Interrupt dialog box)

인터럽트 편집 대화 상자는 인터럽트 설정 대화 상자에서 사용할 수 있다.
인터럽트 매개 변수를 대화식으로 조정하기 위해 이 대화 상자를 사용한다. 매개 변수를 추가할 수 있으며 필요에 따라 생성되는 인터럽트를 빠르게 테스트한다.

※ 참고: 비 강제(non-forced) 인터럽트만을 수정하거나 제거할 수 있다.

3. 강제 인터럽트 창(Forced Interrupt window) 

강제 인터럽트 창은 C-SPY 드라이버 메뉴에서 사용할 수 있다. 즉시 인터럽트를 강제로 발생시키려면 그림 6과 같은 창을 사용하자. 인터럽트 논리 및 인터럽트 루틴을 검사할 때 유용하다. 강제 인터럽트에 대한 대기 시간은 무한이며, 인터럽트는 서비스될 때까지 또는 디버그 세션이 재설정될 때까지 존재한다.

인터럽트를 강제하려면 인터럽트 시뮬레이션 시스템을 활성화하거나, 강제 인터럽트 창에 인터럽트를 두 번 클릭하고 컨텍스트 메뉴에서 Force명령을 사용한다.

4. 인터럽트 상태 윈도우(Interrupt Status window) 

인터럽트 상태 창은 C-SPY 드라이버 메뉴에서 사용할 수 있다.
그림 7과 같은 창은 모든 현재 활성화된 인터럽트의 상태를 보여준다. 즉, 실행 중이거나 실행되기 위해 대기하는 인터럽트다.

5. 인터럽트 로그 윈도우(Interrupt Log wind ow) 

인터럽트 로그 창은 C-SPY 드라이버 메뉴에서 사용할 수 있다.
그림 8의 창에 인터럽트의 진입과 종료를 기록한다. C-SPY 시뮬레이터는 또한 내부 상태 변화를 기록한다. 이 정보는 대상 시스템에서 인터럽트 처리를 디버깅하는데 유용하다. 인터럽트 로그 창이 열려있는 경우, 지속적으로 런타임에 업데이트된다.

그림 5.
인터럽트 편집 대화 상자





그림 6.
강제 인터럽트 창






그림 7.
인터럽트 상태 창






그림 8.
인터럽트 로그 윈도우





그림 9.

인터럽트 로그 요약 윈도우



 

※ 참고: 저장 로그 수에 제한이 있다. 이 제한을 초과하면, 버퍼의 시작 부분의 항목이 삭제된다.

6. 인터럽트 로그 요약 윈도우(Interrupt Log Summary window)

인터럽트 로그 요약 창은 C-SPY 드라이버 메뉴에서 사용할 수 있다.
그림 9의 창에는 인터럽트의 진입과 종료 로그에 대한 요약을 표시한다.


회원가입 후 이용바랍니다.
개의 댓글
0 / 400
댓글 정렬
BEST댓글
BEST 댓글 답글과 추천수를 합산하여 자동으로 노출됩니다.
댓글삭제
삭제한 댓글은 다시 복구할 수 없습니다.
그래도 삭제하시겠습니까?
댓글수정
댓글 수정은 작성 후 1분내에만 가능합니다.
/ 400
내 댓글 모음
저작권자 © 테크월드뉴스 무단전재 및 재배포 금지