SW 개발

winCE / 기초사항 / 인터럽트 기초개념 / ISR , IST, interruptDone()

. . . 2010. 1. 14. 01:56
반응형

Xeno's Study Blog (http://XenoStudy.tistory.com)
- 글쓴이 : xeno
- 출처 : 나 , MSDN , 참고게시물=>http://cafe.naver.com/wincepro/1346
- 기타사항 : 이 게시물은 제가 개념을 정리하기 위해서 포스팅을 한 자료입니다. 혹시 잘못된 사항이나 오류사항이 있을수가 있습니다. 혹시 아시는분은 리플달아주시면 감사하겠습니다. 참 무서운 얘기지만.. 이렇게 공개적인 블로그에 그냥 추측성인 글을 올리는것이 불안하네요;; 혹시 지나가다 이 내용에 틀린 사항이나 수정해야 할 사항이 있다면 리플달아주시면 감사하겠습니다. 그리고 계속 공부하다가 제가 틀린 사항이 발견되면 이 포스팅은 계속 업데이트 될예정입니다.

인터럽트 발생시...InterruptDone() 의 역할..

어떤 인터럽트 발생시 cpu 내부적으로는 pendding 관련 레지스터를 세팅하게 된다.
pendding 레지스터를 검사하고, 해당인터럽트가 떠있다는것을 알게된다. (드라이버 내에서 pendding 레지스터를 검사하는 루틴이 있을것이다.)

그럼 IST / ISR 부분에서 해당 인터럽을 처리하고, 할일을 모두 했다는 것을 표시하기 위해 pennding 래지스터를 꺼야하한다. 하지만 그것을 깜박할경우는 인터럽트는 한번만 들어왔음에도 인터럽트가 계속 들어온걸로 오동작을 할수가있는것이다.

winCE의 경우 이 IST 에서 인터럽트를 모두 처리했다는 신호를 커널로 날려줘야 한다.
이역할을 하는 함수가 InterruptDone() 이다.

커널은 InterruptDone() 이 호출되면... OEMInterruptDone() 을 호출하게 되고 이곳에서.. 해당 인터럽트의 레지스터를 조작함으로서 인터럽트를 완료하는 방식으로 처리한다. (아직 확실하게는 모르겠음 ㅡㅡ;)

winCE 에서 ISR / IST...

winCE에서는 리눅스와는 약간? 틀리게.. isr 과 ist 라는것이 따로존재 한다.

ISR 은 말그대로 인터럽트 서비스 루틴
IST 는 말그대로 인터럽트 서비스 쓰래드..

winCE는 OS적으로 두개의 레이어가 나뉘된다.

간단히 설명하자면...
ISR은 커널에서 해주는 인터럽트 처리부분이고..
IST는 디바이스드라이버 or 어플리 부분에서 처리하는 부분이다.

그럼 우리가 코딩하게될..(물론 winCE를 포팅한다면 ISR도 코딩해야하겠지요?) IST부분의 간단한 코딩의 흐름도를 살펴봅시다.

이벤트를 처리하고 싶은 DD or APP 에서는..

  1. CreateEvent() 로 이벤트 객채를 생성
  2. 해당 이벤트를 InterruptInitialize() 를 이용하여 커널의 ISR 를 호출한다.
    이때, 커널은 InterruptInitialize() 에서 받은 인터럽트 번호와 이벤트 객채를 갖고 작업을 시작한다. 무슨작업이냐 하면... 해당 인터럽트가 떴을때... InterruptInitialize() 에서 인자로 받은 이벤트 객채를 signaled 로  세팅해버리는 역할을 하는듯 하다.(아직 확실히는 모르겠지만 저는 개념상 이렇게 이해했음 ㅡㅡ;)
  3. 그담 DD or APP 는 쓰래드를 생성한다.
  4. 쓰래드에서는 WaitForSingleObject() 를 이용해 이벤트를 기다리게 한다.
    ...
  5. ===== 이벤트 발생까지 대기하게 됩니다.=====
    ...
  6. 이벤트 발생시~~~ 커널 ISR 은 InterruptInitialize() 로 받은 이벤트 오브젝트를 signaled 로 바꾼다!! 그럼 WaitForSingleObject() 는 block 상태가 풀리면서 루틴을 실행하게 된다.
  7. 해당 쓰래드는 원하는 루틴을 모두 처리한후 InterruptDone() 을 호출하여 커널에게 인터럽트처를 끝냈으니 레지스터세팅 및 커널 세팅을 다시 인터럽트 받을 수 있게 준비하라~~ 라고 알려준다.

그럼 아주 간단한 IST 의 구조를 살펴보면 ..

while(1){
     WaitForSingleObject 로 인터럽트를 기다리고
      - 인터럽트 처리- 값 출력
     interruptDone
}

반응형