다음을 통해 공유


타이머 사용

이 항목에서는 프레임워크의 기본 제공 타이머 지원을 사용하는 방법을 설명합니다. KMDF(Kernel-Mode Driver Framework) 드라이버와 버전 2부터 User-Mode 드라이버 프레임워크(UMDF) 드라이버 모두에 적용됩니다.

프레임워크는 드라이버가 타이머 를 만들 수 있도록 하는 타이머 개체를 제공합니다. 드라이버가 타이머 개체를 만들고 타이머의 시계를 시작한 후 프레임워크는 지정된 시간이 경과한 후 드라이버 제공 콜백 함수를 호출합니다. 필요에 따라 지정된 시간이 경과할 때마다 프레임워크가 콜백 함수를 반복적으로 호출하도록 드라이버가 타이머를 설정할 수 있습니다.

프레임워크 타이머 개체를 만들려면 드라이버가 WdfTimerCreate 메서드를 호출해야 합니다. 이 메서드는 EvtTimerFunc 콜백 함수와 주기적인 시간 간격을 등록합니다. 프레임워크에서 콜백 함수를 한 번만 호출하려는 경우 드라이버는 주기적인 시간 간격에 대해 0을 지정합니다.

일반적으로 드라이버가 각 디바이스에 필요한 타이머 수를 알 수 있습니다. 따라서 드라이버는 EvtDriverDeviceAdd 콜백 함수에서 WdfTimerCreate를 호출하여 타이머 개체를 만들 수 있으며 타이머 개체 핸들을 디바이스 또는 큐 개체의 컨텍스트 공간에 저장할 수 있습니다.

타이머를 시작하려면 드라이버가 WdfTimerStart를 호출하여 "기한"을 전달합니다. 프레임워크는 타이머의 클록을 시작하고 지정된 시간이 경과하면 EvtTimerFunc 콜백 함수를 호출합니다.

드라이버가 WdfTimerCreate를 호출할 때 주기적인 시간 간격을 제공한 경우 타이머를 주기적 타이머라고 합니다. 초기 "기한"이 경과한 후에도 주기적 타이머의 클록이 계속 실행되고 프레임워크는 주기적인 시간 간격이 경과할 때마다 드라이버의 콜백 함수를 반복적으로 호출합니다. 주기적 타이머는 자동으로 시작되지 않습니다. 비정기 타이머와 마찬가지로 드라이버는 타이머를 처음 시작한 후에도 WdfTimerStart 를 호출해야 합니다.

드라이버가 만료된 후 비정기 타이머를 다시 시작하기 위해 EvtTimerFunc 콜백 함수에서 WdfTimerStart를 호출할 수 있습니다.

타이머를 중지하기 위해 드라이버는 WdfTimerStop을 호출할 수 있습니다. 드라이버는 타이머를 반복적으로 시작하고 중지하여 다시 사용할 수 있습니다.

드라이버가 타이머 개체를 만들 때 부모 개체를 지정해야 합니다. 프레임워크는 타이머를 중지하고 부모가 삭제되면 타이머 개체를 삭제합니다. 타이머 개체의 부모 개체를 가져오려면 드라이버에서 WdfTimerGetParentObject를 호출할 수 있습니다.

버전 1.9 이전의 KMDF 버전에서는 드라이버의 모든 콜백 함수가 IRQL = PASSIVE_LEVEL 실행되도록 하려면 타이머 개체를 쉽게 사용할 수 없습니다. 프레임워크는 IRQL = DISPATCH_LEVEL 호출되는 DPC(지연 프로시저 호출)로 타이머 개체의 EvtTimerFunc 콜백 함수를 구현합니다. 따라서 타이머 만료 코드를 PASSIVE_LEVEL 실행하려는 경우 EvtTimerFunc 콜백 함수는 PASSIVE_LEVEL 실행되는 작업 항목을 큐에 대기해야 합니다.

KMDF 버전 1.9 이상에서는 PASSIVE_LEVEL 실행되는 타이머인 수동 수준 타이머를 만들 수 있습니다. 수동 수준 타이머를 만들려면 드라이버가 WdfTimerCreate를 호출할 때 WdfExecutionLevelPassive 실행 수준을 지정합니다. 결과적으로 프레임워크는 EvtTimerFunc 콜백 함수를 PASSIVE_LEVEL 실행되는 작업 항목으로 구현합니다. 수동 수준 타이머는 주기적인 타이머가 될 수 없습니다.

UMDF 버전 2.0부터 프레임워크는 타이머 개체의 EvtTimerFunc 콜백 함수를 사용자 모드 스레드 풀의 작업자 스레드로 구현합니다. 결과적으로 UMDF 드라이버의 타이머 콜백 함수는 항상 PASSIVE_LEVEL 실행됩니다.

절 해제 타이머 없음

시스템이 저전력 상태에서 다시 시작되도록 하는 타이머에 의해 시스템 전원 효율성이 감소됩니다. 배터리 수명을 개선하는 한 가지 방법은 시스템을 깨우는 대신 중요하지 않은 정기적인 작업을 지연하는 것입니다. Windows 8.1 시작해서 절전 모드 해제 타이머를 사용하지 않고 KMDF 또는 UMDF 드라이버에서 이러한 중요하지 않은 작업을 수행할 수 있습니다. 절전 모드 해제 없음 타이머는 시스템이 저전력 상태인 동안 만료되는 경우 시스템을 절전 모드 해제하지 않습니다. 대신 프레임워크는 다음에 시스템이 완전히 켜져 있는 S0 상태일 때 드라이버의 EvtTimerFunc 콜백 함수를 호출합니다.

KMDF 버전 1.13 및 UMDF 버전 2.0부터는 절전 모드 해제 타이머를 사용할 수 없습니다.

절전 모드 해제 타이머를 만들려면 WDF_TIMER_CONFIGTolerableDelayUnlimitedTolerableDelay 멤버를 설정합니다.

절 해제 타이머 없음에 대한 자세한 내용은 No-Wake 타이머를 참조하세요.

고해상도 타이머

표준 프레임워크 타이머는 기본적으로 15.6밀리초인 시스템 클록 틱 간격과 일치하는 정확도를 갖습니다. Windows 8.1 시작하여 고해상도 타이머를 만들 수 있습니다. 고해상도 타이머의 정확도는 1밀리초입니다. 정확하고 예측 가능한 만료 시간이 필요한 중요한 작업에 고해상도 타이머를 사용할 수 있습니다. 필요한 빈번한 서비스의 결과로 고해상도 타이머로 인해 배터리 수명이 감소할 수 있습니다.

고해상도 타이머는 KMDF 버전 1.13부터 KMDF 드라이버에서만 사용할 수 있습니다.

고해상도 타이머를 만들려면 WDF_TIMER_CONFIGUseHighResolutionTimer 멤버를 WdfTrue로 설정한 다음 마침표 값을 원하는 해상도로 조정합니다.

다음 표에서는 드라이버가 Period에 제공하는 다양한 값을 기반으로 하는 타이머 동작의 예를 보여 줍니다. 이러한 예제에서는 시스템 클록 틱 간격이 15밀리초라고 가정합니다.

마침표(ms)입니다. 표준 타이머 고해상도 타이머

10

타이머는 0밀리초에서 25밀리초 사이에 만료됩니다.

타이머는 가능한 한 10밀리초 후에 만료됩니다.

16

타이머는 15밀리초에서 30밀리초 사이에 만료됩니다.

타이머는 가능한 한 16밀리초 후에 만료됩니다.

고해상도 타이머에 대한 자세한 내용은 고해상도 타이머를 참조하세요.

타이머 정확도가 시스템 클록의 세분성과 관련된 방법에 대한 자세한 내용은 타이머 정확도를 참조하세요.