강좌 & 팁
안녕하세요~ 이우영 입니다.
연휴는 잘 보내셨나요? 그럼 오늘도 열심히 해보겠습니다.
오늘은 인털럽트를 금지하고 해제하는법에 대해서 알아 보도록 하겠습니다.
1. 복습!
인터럽트 등록하는거 기억 나시나요?
혹시나해서 다시 한번 간단하게 언급하고 지나가겠습니다.
인터럽트 등록 함수는 아래와 같았고,
int requst_irq ( unsigned int irq, irqreturb_t (*handler)(int, void *, struct pt_regs *), unsigned long frags, const char *device, void * dev_id ); |
인터럽트 해제하는 함수는 아래와 같습니다.
void free_irq ( unsigned int irq, void * dev_id ); |
요것만 가지고 기억이 나실지 모르겠습니다 ㅎㅎㅎ
(한번 해보신 분이라면 금방 기억나실겁니다 안나시는 분들은 반성하세요!!)
2. 함수 및 사용법!
그럼 인터럽트를 금지하고 해제하는 함수에 대해서 알아 보도록 하겠습니다.
▪
local_irq_disable(void) : 프로세서의 인터럽트 처리를 금지
▪ local_irq_enable(void) : 프로세서의 인터럽트 처리를 허가
▪ local_save_flags(unsigned long frags) : 현재의 프로세스의 상태를 저장
▪ local_irq_restore(unsigned long frags) : 저장된 프로세스의 상태를 복구
위와 같이 함수들이 있고 위 함수들을 사용하기 위해서는 <asm/system.h>를 포함 해야 합니다.
(더 많지만 기본적인것만 적어 보았습니다 ㅎㅎ)
인터럽트가 금지되어야 하는 곳에서 local_irq_disable를 호출하여 인터럽트 발생을 막고
(이중인터럽트, 임계영역 등의 문제때문에 사용합니다.)
금시영역이 끝나면 local_irq_enable를 호출하여 인터럽트 발생을 허가 합니다.
위 함수를 쓰면 간단하지만 커널같이 여러 함수들이 복합적으로 인터럽트를 금지해야 하거나 할 경우
위와 같은 방법은 오류를 범하기 쉽습니다.
그래서 대부분의 사용자들은 다음과 같은 방법을 많이 사용 하고 있습니다.
unsigned long frags;
local_save_flags(frags);
local_irq_disable( );
// 인터럽트 호출에서 보호해야하는 루틴
local_irq_restore(frags);
별로 다르진 않죠?
(많이 다른가요? ㅎㅎ 자세한건 다음시간에)
오늘은 간단하게 함수들을 소개했습니다.
다음 시간에는 arm에서 어떻게 저 함수들을 구현했는지 조금더 자세하게 알아 보도록 하겠습니다.
그럼 다음시간에 만나요~
빠른만남을 원하시면 http://ms-osek.org/ 여기로 찾아오세요~