타겟보드를 이용하여 디바이스 드라이버를 배워보자!(7)



안녕하세요 이우영 입니다.


저번시간에는 문자 디바이스 드라이버를 만들어 보았습니다.


오늘 부터는 인터럽트에 대해서 알아 보도록 하겠습니다.


1. 인터럽트란?



컴퓨터 작동 중에 예기치 않은 문제가 발생한 경우라도 업무 처리가 계속될 수 있도록 하는 컴퓨터 운영체계의 한 기능.


백과사전에 간단하게 설명이 되어있습니다 ㅎㅎ.


위 링크를 타고 가시면 그림과 깉이 자세한 설명이 있습니다.

인터럽트에도 나누어 보면 하드웨어 인터럽트와 소프트웨어 인터럽트가 있습니다.

그중 우리는 하드웨어 인터럽트를 만들어 보도록 하겠습니다.

2. 인터럽트 사용법



인터럽트를 사용하기위해서는 운영체제에 인터럽트를 사용하겠다고 등록을 해주어야 합니다.

(반대로 안쓸 경우에는 해제해야겠죠?)


커널 2.6 에서 인터럽트를 등록하는 함수는 다음과 같습니다.


 int requst_irq ( unsigned int irq, irqreturb_t (*handler)(int, void *, struct pt_regs *), 

                         unsigned long frags, const char *device, void * dev_id );


위와 같이 인자 값이 5개 필요합니다.


irq        - 인터럽트 번호입니다.( 밑에서 자세하게 설명하겠습니다.)

handler - 인터럽트가 발생 했을 경우 동작하는 함수를 등록해줍니다.

frags    - 중첩 인터럽트를 허용하는 것과 빠른 인터럽트 같은 속성을 지정합니다.

device  - 인터럽트에 대한 소유자를 표시합니다. 보통 디바이스 드라이버 이름을 적어줍니다.

dev_id  - 중첩 인터럽트를 허용했을 경우 구분인자로 사용하기도 하고, 

             인터럽트 서비스 함수가 참조하는 데이터 주소를 지정 합니다.


인터럽트를 해제하는 함수는 다음과 같습니다.


 void free_irq ( unsigned int irq, void * dev_id ); 


해제는 2개의 인자값만 넘겨주면 됩니다.


handler 함수를 만들때는 함수의 형태를 지켜 주셔야 합니다.  커널 2.6은 다음과 같이 만드러 주셔야 합니다.


 irqreturn_t int_interrupt(int irq, void *dev_id, struct pt_regs *regs)

{

return IRQ_HANDLED;


꼭 irqreturn_t를 반환하는 형태로 만들어서 함수가 종료하기 전에 IRQ_HANDLED을 반환해 주어야 합니다.


인터럽트를 등록하기 위해서 필요한 함수들을 알아 보았습니다. 


그럼 ez-s3c6410 보드에서 어떤 인터럽트를 등록해주어야 할지 보도록 하겠습니다.


3. 어떤 인터럽트를 사용할까?



인터럽트는 하드웨어 마다 고유의 번호를 가지고 있습니다. 아까 위에서 인자값중 irq가 있었습니다.


여기에는 이 고유 값을 등록해주는 것입니다.


인터럽트를 사용하기 전에 알아 두어야 할게 조금 있습니다.


s3c6410의 회로도나 데이터시트를 봐야하고 GPIO에대해서도 알고 있어야 합니다.


이런것들은 다음시간에 이어서 알아보도록 하겠습니다. ㅎㅎ


그럼 다음시간에 만나요~


빠른만남을 원하시면 http://ms-osek.org/ 여기로 찾아오세요~