임베디드 스터디 - 인터럽트 서비스
임베디드 스터디 - 인터럽트 서비스
request_irq() / free_irq()
- 드라이버가 커널에 인터럽트 핸들러를 등록/해제하는 함수
1
2
3
4
5
6
7
// module_init()에서 호출
request_irq(irq_num, handler, flags, "uart_driver", dev);
// │ │ │
// IRQ 번호 핸들러 함수 동작 플래그
// module_exit()에서 호출
free_irq(irq_num, dev);
free_irq()를 호출하지 않으면 모듈 언로드 후 IRQ 발생 시 댕글링 포인터 → 커널 패닉
ISR 작성 규칙
- ISR(Interrupt Service Routine)은 인터럽트 컨텍스트에서 실행됨
- ISR이 실행되는 동안 같은 CPU의 다른 인터럽트가 지연됨
ISR 안에서 절대 금지
1
2
3
4
5
6
① sleep / blocking 함수 사용 금지
→ mutex, msleep, wait_queue 등 사용 불가
→ 메모리 할당 시 반드시 GFP_ATOMIC 사용
② 무거운 연산 금지
→ 데이터 파싱, 프로토콜 처리 등은 하반부로 위임
상하반부 분리 (Top/Bottom Half)
1
2
3
4
5
6
인터럽트 발생
↓
상반부 (ISR) — 최소한의 작업만
: 레지스터 읽기, 플래그 저장
↓
하반부 — 무거운 작업 위임
하반부 메커니즘 선택 기준
1
2
3
후처리에 sleep이 필요한가?
├── NO → tasklet (인터럽트 컨텍스트, GFP_ATOMIC만 사용 가능)
└── YES → work_queue (커널 스레드, blocking 작업 가능)
| 실행 컨텍스트 | sleep 가능 | 적합한 작업 | |
|---|---|---|---|
tasklet | 인터럽트 컨텍스트 | ❌ | 빠른 데이터 복사 |
work_queue | 커널 스레드 | ✅ | 파일 I/O, kmalloc |
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.