2013-08-08 4 views
4

저는 인터럽트 핸들러 내에서 정적 변수를 사용하여 인터럽트 핸들러를 재진입이 아닌 것으로 만듭니다.인터럽트 처리기는 재진입 성이 있어야합니까?

  1. 재진입 불가능한 인터럽트 처리기를 사용해도 되나요?
  2. 하드웨어 인터럽트가 발생하면 이벤트가 일종의 대기열에 들어가고 현재 인터럽트 처리기 호출이 완료 될 때까지 기다리는 지 또는 인터럽트 처리기가 즉시 호출 되나요?

감사

PS. 나는 리눅스를 사용하고있다. 내가 사용하고있는 프로그래밍 언어는 차이가 있다면 C 다.

+0

사용중인 OS는 무엇입니까? 아니면이 베어 메탈입니까? – seanmk

+0

구현 및 iterrupt 모듈이 인터럽트를 처리하는 방법에 따라 다릅니다. 그러나 인터럽트 서비스 루틴에있을 때 더 높은 순서로 인터럽트가 발생하면 다른 인터럽트가 처리 된 다음 ISR로 돌아가서 이전 인터럽트를 실행합니다. 이를'꼬리 고리 '라고 부릅니다. –

+0

@seanmk Linux를 사용하고 있습니다. 이 질문에 추가하겠습니다. – Arash

답변

7

짧은 대답은 인터럽트 서비스 루틴이 본질적으로 재진입이 필요 없다는 것입니다. Reentrancy는 nested interrupts의 경우에만 필요합니다. 사용하는 운영 체제가 nested interrupts을 지원하지 않는 경우, 재 입력에 대해 전혀 걱정할 필요가 없습니다. 그렇다면 중첩 된 인터럽트를 절대받지 않도록 처리중인 인터럽트를 다시 제어 할 수 있습니다.

편집 : 지금은 리눅스를 사용하고 알고, 당신은 도움이 링크를 찾을 수 있습니다 : Can an interrupt handler be preempted by the same interrupt handler?

본질적 질문에 대한 대답은 그것이가 어서 리눅스 마스크 인터럽트가되지 않도록 ISR을 등록 할 때 특정 플래그가 전달되지 않으면 자체 선점합니다.

여기에 관련 견적입니다 : 리눅스에서

인터럽트 핸들러 재진입 할 ​​필요는 없다. 주어진 인터럽트 핸들러가 실행 중일 때, 해당 인터럽트 라인은 이 모든 프로세서에서 마스크되어 같은 라인의 다른 인터럽트가 수신되는 것을 방지합니다. 일반적으로 다른 모든 인터럽트가 활성화되어 이므로 다른 인터럽트는 처리되지만 현재 줄은 항상 입니다. 따라서 동일한 인터럽트 처리기가 중첩 된 인터럽트를 처리하기 위해 동시에 호출되지 않습니다. 이렇게하면 인터럽트 처리기를 크게 단순화 할 수 있습니다. 모든 말을 할 수 없습니다

+0

IRQF_DISABLED (이전 SA_INTERRUPT) 플래그가 Linux 커널에서 2.6.35 버전 이후에 제거되었습니다. 이제 모든 ISR이 실행되어 해당 CPU에 대해 모든 인터럽트가 비활성화됩니다. –

0

는 인터럽트 핸들러하지만 다스 플랫폼에서 나는 기계가 보편적으로 재진입 동작을 방지 그러한 있었던 하드웨어 인터럽트 서비스 루틴에 대한 (ISR)를 작성했습니다.

ISR for 소프트웨어 반면에 인터럽트는 재진입 활동을 감지하고 처리하기 위해 고안되었습니다.

다른 곳에서 언급했듯이 이는 OS/플랫폼에 따라 다를 수 있습니다.