오늘 정리하는 부분은 이전의 swi 핸들러작성에 이어 IRQ핸들러를 OS타이머를 구현해 보며 작성하는 것이다.
여기서 os 타이머의 필요성은 이해했고, OS타이머를 만들기위해 인터럽트를 이용할 것인데 이러한 인터럽트는 이전의 소프트웨어적인 인터럽트와는 달라서 외부 인터럽트이다. 따라서 IRQ 또는 FIQ로 처리하는데, 본 운영체제에서는 IRQ만들 사용하기 때문에 IRQ exception 으로 타이머를 구현할 것이다.
따라서 먼저 인터럽트를 이용해야 하기 때문에 인터럽트에 대한 처리가 어떻게 이루어 지는지 인터럽트 컨트롤러 계층에 대해 알아야 한다.
pxa255의 인터럽트 컨트롤러 블록 다이어그램은 데이터시트를 보면 나와있고
각 레지스터들의 기능들에 대해 알아보겠다. 데이터시트를 옆에 두고 보면 이해가 된다.
ICLR : level 레지스터 즉, 인터럽트가 IRQ인지 FIQ인지 결정한다. 22개의 레지스터중 해당비트가 0이면 IRQ, 1이면 FIQ이다.
ICCR: control 레지스터 . 마지막 한 비트만 설정가능한데 이는 DIM 비트로서 disable idle mode라는 뜻이다.
이 부분을 이해하려면 ICCR[DIM]=0 & idle mode='1' 부분을 잘 봐야한다. 얼핏보면 헷갈린다. 해석하면 ICCR[dim]비트가 0이면 참, 1이면 거짓이고 idle mode는 1이면 참, 0이면 거짓이다. 가운데 & 연산자는 알다시피 둘다 참일때만 참인값을 내보낸다.다시말해서 ICCR[DIM]=0 & idle mode='1' 일때만 1이라는 참의 값을 낸다는 것이다. 하지만 포인트는 우리는 ICCR[DIM]비트를 0또는1로 컨트롤 하는 목적으로 써야한다는 것이다. 이해를 돕기위해 idle mode는 알아서 바뀐다고 생각하고 (idle 일때도 있고 아닐때도 있으니까 알아서 바뀌게 내버려둬...) idle mode 를 무시할지 말아야할 지만 결정하면 되는 것이다. 왜? ? ? 왜냐하면 ICCR의 목적은 idle mode의 변화로 인해 ICMR이 제 기능을 하도록 지켜주는 것이다.
즉, idle mode가 0 이든 1이든 신경쓰지 않고 ICMR에 셋팅된 인터럽트만 받겠다고 하면(ICMR을 최고로 존중해주겠다고하면)ICCR[dim]을 1로 셋팅하면된다. 그리고 idle mode = 0일때에만(ICMR을 반 만 지켜주는....) ICMR에 셋팅된 인터럽트를 받고 싶으면 ICCR[dim]을 0으로 셋팅하면된다. 하지만 이때는 idle mode=1일때 ICMR을 무시하고 아무 인터럽트 발생시에도 다 통과시킨다 는 점을 기억하자
적어놓으니 이해가 잘된다ㅎ
ICMR: mask 레지스터, 통과시키고 싶은 인터럽트를 1로 셋팅한다. 22개의 비트중 각 비트마다 특정 인터럽트가 바인딩되어있 다
ICPR: pending 레지스터 . 인터럽트 발생시 무조건 기록한다. ICMR처럼 비트마다 특정 인터럽트가 바인딩 되어 있다.
ICIP: IRQ 로 발생한 특정 인터럽트 비트를 기록
ICFP:FIQ 로 발생한 특정 인터럽트 비트를 기록
인터럽트번호별 할당된 내용.
이를 바탕으로 정리해보자.
그러니까, 처음으로 인터럽트가 감지되면 해당 인터럽트를 ICPR에 무조건 기록한다. 그리고 이렇게 인터럽트가 감지되었을때, ICCR[DIM]=0 & idle mode = 1 이거나 ICMR의 해당 비트가 셋팅되어 있으면 다음단계로 이동 , ICLR에 의해 해당비트가 0이면IRQ, 1이면 FIQ인지 결정하게 되고, IRQ면 ICIP, FIQ이면 ICFP에 기록한 후 인터럽트가 프로세서로 전달하게 된다.
그럼 여기서 내가 프로그래밍 해줘야 될게 무엇이냐?...
ICLR에서 IRQ인지 FIQ인지 해당비트를 셋팅해주고,
ICMR에서도 허용할 인터럽트비트를 활성화 시킨다.
ICCR[DIM]을 1로 셋팅한다. 그래야 우리가 원하는 ICMR에 허용된 비트만 받아들이게된다.
'OS > navilnux' 카테고리의 다른 글
PXA255의 OS타이머 레지스터 계층 (0) | 2010.09.25 |
---|---|
exception handler 소스 분석! (0) | 2010.09.15 |
ARM 에서 소프트웨어 인터럽트(Software interrupt)발생시 ISR 과정 이해하기! (0) | 2010.09.14 |
임베디드개발 보드의 LED 활용! (0) | 2010.09.14 |
2. 개발환경 테스트 에러발생 (0) | 2010.09.11 |