인터럽트를 처리하는 도중에 인터럽트가 발생하지 못하게 하는 방법으로는
request_irq() 함수의 flags 매개변수에 SA_INTERRUPT를 포함시킨다.
일반적인 루틴에서 인터럽트 발생을 금지 시키려면
#include <asm/irq.h>
void disable_irq(int irq);
void enable_irq(int irq);
를 이용해서 특정 인터럽트 번호에 대한 금지와 해제를 수행하고
경우에 따라서는 프로세스 전체의 인터럽트를 금지 하고 해제할 필요가 있는데
이런 경우를 위해 커널에서 다음과 같은 함수를 제공한다.
#include <asm/system.h>
kernel 2.4
cli(void); // 프로세스의 인터럽트 처리를 금지
sti(void); // 프로세스의 인터럽트 처리를 허가
save_flags(unsigned long frags); 현재의 프로세스 상태를 저장
restore_flags(unsgined long frags); // 저장된 프로세스의 상태를 복구
kernel 2.6
local_irq_disable(void); // 프로세스의 인터럽트 처리를 금지
local_irq_enable(void); // 프로세스의 인터럽트 처리를 허가
local_save_flags(unsigned long frags); // 현재의 프로세스 상태를 저장
local_irq_restore(unsigned long frags); // 저당된 프로세스의 상태를 복구
가장 보편적인 인터럽트 금지법은
unsigned long frags;
local_save_flags(frags);
local_irq_disable();
//
// 보호해야될 루틴
//
local_restore_flags(frags);
request_irq() 함수의 flags 매개변수에 SA_INTERRUPT를 포함시킨다.
일반적인 루틴에서 인터럽트 발생을 금지 시키려면
#include <asm/irq.h>
void disable_irq(int irq);
void enable_irq(int irq);
를 이용해서 특정 인터럽트 번호에 대한 금지와 해제를 수행하고
경우에 따라서는 프로세스 전체의 인터럽트를 금지 하고 해제할 필요가 있는데
이런 경우를 위해 커널에서 다음과 같은 함수를 제공한다.
#include <asm/system.h>
kernel 2.4
cli(void); // 프로세스의 인터럽트 처리를 금지
sti(void); // 프로세스의 인터럽트 처리를 허가
save_flags(unsigned long frags); 현재의 프로세스 상태를 저장
restore_flags(unsgined long frags); // 저장된 프로세스의 상태를 복구
kernel 2.6
local_irq_disable(void); // 프로세스의 인터럽트 처리를 금지
local_irq_enable(void); // 프로세스의 인터럽트 처리를 허가
local_save_flags(unsigned long frags); // 현재의 프로세스 상태를 저장
local_irq_restore(unsigned long frags); // 저당된 프로세스의 상태를 복구
가장 보편적인 인터럽트 금지법은
unsigned long frags;
local_save_flags(frags);
local_irq_disable();
//
// 보호해야될 루틴
//
local_restore_flags(frags);
'Linux > Device Driver' 카테고리의 다른 글
인터럽트와 난수 발생 처리 (0) | 2013.09.26 |
---|---|
seqlock (0) | 2013.09.26 |
인터럽트 공유 (0) | 2013.09.26 |
인터럽트함수와 디바이스 드라이버간 데이터 공유 (0) | 2013.09.26 |
시간 처리와 커널 타이머 함수 (0) | 2013.09.26 |