[블로그 통합으로 이전해 온 자료] - 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 |