본문 바로가기
실습/리눅스 커널

인터럽트 (Interrupt) 처리

by 써드아이 2021. 2. 8.

[블로그 통합으로 이전해 온 자료] - 2008. 4. 28. 22:49

 

 

* 등록 / 해제

- int request_irq( irq, handler, flags, name, dev_id );
- free_irq( irq, dev_id );

unsigned int irq
irqreturn_t (*handler)( int, void *, strct pt_regs * )
unsigned long flags
const char *name
void *dev_id

- 인터럽트를 공유하는 경우는 디바이스의 open에서 등록하고 close에서
해제하는 것이 바람직하나 임베디드 환경에서는 대게 인터럽트를 전용으로
사용하기 때문에 디바이스의 등록 시점에서 할당하고 디바이스의 해제에서
인터럽트를 해제하는 것이 바람직할 것이다.

- 핸들러에게 인자를 넘기는 것은 주로 void *dev_id 매개 변수를 사용한다.

- 리턴값으로
IRQ_HANDLED :
IRQ_NONE :

혹은 REQ_RETVAL (handled ) 매크로 사용


* 인터럽트의 활성 / 비 활성

void disable_irq( int irq );
void disable_irq_nosync( int irq )
void enable_irq( int irq );

-  disable_irq() 함수는 핸들러가 종료할 때까지 대기하며
disable_irq_nosync()는 그렇지 않다.

- 공유 인터럽트에서는 사용 불가


void local_irq_save( unsigned long flags );
void local_irq_disable( void );
void local_irq_restore( unsigned long flags );
void local_irq_enable( void );

- 커널 2.6에서는 cli(), sti() 함수는 지원하지 않는다.

'실습 > 리눅스 커널' 카테고리의 다른 글

DMA 처리  (0) 2021.02.08
Memory Mapping  (0) 2021.02.08
커널 타이머, 태스크릿, 작업큐  (0) 2021.02.08
드라이버 코드의 실행 지연  (0) 2021.02.08
커널에서 Blocking I/O  (0) 2021.02.08