안녕하세요~ 이우영 입니다.


연휴는 잘 보내셨나요? 그럼 오늘도 열심히 해보겠습니다. 


오늘은 인털럽트를 금지하고 해제하는법에 대해서 알아 보도록 하겠습니다.


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/ 여기로 찾아오세요~