다음을 통해 공유


인터럽트 동기화 개체

PortCls 시스템 드라이버는 미니포트 드라이버의 이점을 위해 IInterruptSync 인터페이스를 구현합니다. IInterruptSync 는 ISR(인터럽트 서비스 루틴) 목록의 실행을 비 인터럽트 루틴과 동기화하는 인터럽트 동기화 개체를 나타냅니다.

인터럽트 동기화 개체는 다음 두 가지 주요 기능을 제공합니다.

  • 인터럽트 에 대한 응답으로 ISR 목록을 실행합니다. 동기화 개체가 인터럽트 원본에 연결됩니다. 인터럽트 발생 때마다 동기화 개체는 선택한 모드에 따라 지정된 순서로 ISR을 실행합니다. (세 가지 모드에 대한 다음 설명을 참조하세요.)

  • ISR이 아닌 루틴의 실행 이러한 비 인터럽트 루틴은 동기화 개체의 인터럽트 에 연결되지 않습니다. 대신 비 인터럽트 루틴은 호출자가 선택한 시간에 실행됩니다. 그러나 동기화 개체는 개체의 ISR 목록과 함께 비 인터럽트 루틴을 동기적으로 실행합니다. 즉, 동기화 개체 목록의 ISR이 실행되기 전에 비 인터럽트 루틴이 완료될 때 실행되고 그 반대의 경우도 마찬가지입니다.

인터럽트 동기화 개체는 여러 ISR을 유연하게 처리할 수 있습니다. ISR은 동기화 개체가 인터럽트 시간에 트래버스하는 연결된 목록에 상주합니다. 미니포트 드라이버가 동기화 개체를 사용하여 ISR을 등록하는 경우 ISR을 이 목록의 시작 또는 끝에 추가할지 여부를 지정합니다.

미니포트 드라이버는 PcNewInterruptSync 함수를 호출하여 인터럽트 동기화 개체를 만듭니다. 이 호출 중에 드라이버는 개체가 인터럽트 시 ISR 목록을 트래버스하는 방식을 지정합니다. 이 호출은 다음 표의 INTERRUPTSYNCMODE 열거형 상수에 지정된 세 가지 옵션을 지원합니다.

상수 의미

InterruptSyncModeNormal

해당 ISR 중 하나가 STATUS_SUCCESS 반환될 때까지 목록에서 각 ISR을 호출합니다.

InterruptSyncModeAll

이전 ISR의 반환 코드에 관계없이 목록에서 각 ISR을 정확히 한 번 호출합니다.

InterruptSyncModeRepeat

목록의 ISR이 STATUS_SUCCESS 반환하지 않는 목록을 탐색할 때까지 전체 ISR 목록을 트래버스합니다.

InterruptSyncModeNormal 모드에서 동기화 개체는 그 중 하나가 STATUS_SUCCESS 반환할 때까지 목록의 각 ISR을 호출합니다. 이 ISR을 따르는 목록의 모든 ISR은 호출되지 않습니다. 이 모드는 운영 체제에서 일반적으로 ISR을 처리하는 방식을 에뮬레이트합니다. STATUS_SUCCESS 반환하는 ISR이 없는 경우 동작은 InterruptSyncModeAll과 동일합니다.

InterruptSyncModeAll 모드에서 목록의 각 ISR은 이전 ISR의 반환 코드에 관계없이 정확히 한 번 호출됩니다. 이는 다른 상황에서도 유용할 수 있지만 인터럽트 원본이 결정적이지 않은 더 기본적인 하드웨어를 위한 것입니다. 예를 들어 특정 인터럽트에서 가져온 두 소스에 관계없이 모든 인터럽트에서 두 개의 인터럽트 원본이 긴밀하게 동기화될 수 있습니다.

InterruptSyncModeRepeat 모드에서 동기화 개체는 목록의 루틴이 STATUS_SUCCESS 반환하지 않는 목록을 탐색할 때까지 ISR의 전체 목록을 반복적으로 트래버스합니다. 이 모드는 여러 원본의 인터럽트에서 동시에 동일한 인터럽트 라인에서 발생하거나 ISR 처리 중에 두 번째 인터럽트 발생이 발생할 수 있는 상황에 적합합니다. 모든 인터럽트 원본은 처리가 필요한지 여부를 확인할 수 있어야 합니다. 항상 STATUS_SUCCESS 반환하는 ISR이 이 모드에서 동기화 개체에 등록된 경우 시스템은 응답을 중지합니다.

이러한 모드에서 동기화 개체는 등록된 ISR이 STATUS_SUCCESS 반환하는 경우 운영 체제에 대한 인터럽트 를 승인합니다. 세 가지 모드에서 모든 인터럽트 원본이 인터럽트를 성공적으로 처리하지 못했음을 나타내는 경우 동기화 개체는 실패한 결과 코드를 운영 체제에 반환합니다.

IInterruptSync 인터페이스는 다음 메서드를 지원합니다.

IInterruptSync::CallSynchronizedRoutine

IInterruptSync::Connect

IInterruptSync::D sconnect

IInterruptSync::GetKInterrupt

IInterruptSync::RegisterServiceRoutine