SW 개발

winCE / kernel / 기본개념 / winCE의 인터럽트 처리방식.

. . . 2009. 4. 22. 01:39
반응형

Xeno's Study Blog (http://XenoStudy.tistory.com)
- 글쓴이 : xeno
- 출처 : 나, 월간임베디드, 인터넷어딘가(예전포스팅과 합치는 과정에서 까먹음)
- 기타사항 : 틀린사항은 댓글로 달아주세여~

====================================================================================
                         인터럽트 에 관한 기초 내용..
====================================================================================
WinCE는 두 가지 과정을 통해 인터럽트가 처리된다.

인터럽트 서비스 루틴(ISR Interrupt Service Routine)
커널 안에 로드된 코드의 일부 또는 함수로써, 특정한 IRQ로 할당이 된다. ISR은 하드웨어를 제어하기 위해서 하드웨어 인터럽트 핸들(Handle)을 직접적으로 호출한다. 이로써 ISR은 다음에 나올 IST가 실행되도록 커널에 알리는 역할을 하는 것이다. ISR은 여러 개의 인터럽트 요청에 대해서도 대응한다.

인터럽트 서비스 쓰레드(IST Interrupt Service Thread)
IST는 장치관리자(Device Manager)를 통해 쓰레드 동작되며,
응용프로그램에서 가장 높은 쓰레드로 동작한다.
인터럽트가 사용 가능한 상태에서 인터럽트를 사용하기 위해서는 ISR에 인터럽트 등록을 해야 한다. 외부에서 인터럽트 요청이 들어오면 ISR은 해당 인터럽트가 무엇인지 판단하여, 어떤 인터럽트인지 시스템, 즉 커널에 알려준다. WinCE에서는 OAL이라고 할 수 있으며 이것이 바로 SYSINTR로 시작되는 인터럽트 ID가 되는 것이다. 커널은 인터럽트ID를 가지고 해당하는 IST를 수행하게 되는 것이다. 즉 IST는 하나의 프로세스 또는 드라이버라고 할 수 있다. 커널은 ISR로부터 인터럽트에 대한 정보를 받아들이게 된다.

커널에 제공되는 인터럽트 정보
SYSINTR_NOP     : 커널에 대한 요청이 없다(커널은 아무작업도 수행하지 않는다.)
SYSINTR_RESCHED : 커널은 IST를 다시 스케쥴링하며, 인터럽트는 운영체제의 타임틱에 의해 수행된다.
SYSINTR_XXX     : 커널은 ISR의 인터럽트 소스(함수)가 발생하면, IST가 실행된다.
                           IST가 이벤트를 만들고 실행하게 된다.


====================================================================================
                         인터럽트 처리과정..
====================================================================================

1. Interrupt Initialization

Kernel에서 Platform의 초기화를 담당하는 OEMInit()를 호출하여 Interrupt를 초기화 한다.
OEMInit() 함수에서는 OALIntrInit() 함수를 호출하여 Interrupt 초기화를 시작하고 OALIntrInit() 함수에서 ISR을 등록하고 OALIntrMapInit()와 BSPIntrInit() 함수를 호출하여 Interrupt 초기화를 마무리 한다.

OALIntrMapInit() : Physical Interrupt(IRQ)와 Logical Interrupt(SYSINTR)을 초기화한다.
BSPIntrInit() : Physical Interrupt(IRQ)와 Logical Interrupt(SYSINTR)를 Mapping 시켜준다.

실제 Device Driver에서는 해당 device와 관련된 내용을 초기화 하고 Event를 생성한다음 InterruptInitialize()를 호출하여 SYSINTR와 Event를 mapping 시켜주고 Interrupt를 Enable하고 Event를 받아 수행하는 Thread(IST)를 생성하여 Interrupt를 수행할 준비를 한다. 이때 IST는 WaitForSingleObject로 block되어 있다.

2. Interrupt Handling

실제 Hardware에서 Interrupt가 발생하면 제일 먼저 아는게 Kernel Exception Handler이다.

Kernel의 KernelExceptionHandler()에서는 ISR를 호출하여 어떤 interrupt가 발생했는지를 확인하고 SetEvent()를 호출하여 해당 event를 signal하면 IST에서 event를 받아 적절한 처리를 하고 InterruptDont()을 호출하여 interrupt 처리가 완료되었다는 것을 Kernel에게 알려주어 Interrupt Process를 마친다.

반응형