Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Este tópico descreve como usar o suporte de temporizador interno da estrutura. Ele se aplica aos drivers do Kernel-Mode Driver Framework (KMDF), bem como aos drivers do User-Mode Driver Framework (UMDF) a partir da versão 2.
A estrutura fornece um objeto de temporizador do, permitindo aos drivers criar temporizadores. Depois de um driver criar um objeto de temporizador e iniciar o relógio desse temporizador, a estrutura chama uma função de callback fornecida pelo driver após um período de tempo especificado. Opcionalmente, o driver pode configurar o temporizador para que o framework chame a função de retorno de chamada repetidamente, sempre que um intervalo de tempo específico tiver passado.
Para criar um objeto temporal de estrutura, o seu driver deve chamar o método WdfTimerCreate. Este método regista uma função de retorno de chamada EvtTimerFunc e um intervalo de tempo periódico. Se pretenderes que o sistema chame a função callback apenas uma vez, o teu driver deve especificar zero para o intervalo de tempo periódico.
Normalmente, você saberá o número de temporizadores que seu driver precisará para cada dispositivo. Portanto, o driver pode criar objetos de temporizador chamando WdfTimerCreate na sua EvtDriverDeviceAdd função de retorno de chamada e pode armazenar identificadores de objetos de temporizador num espaço de contexto de um dispositivo ou de um objeto de fila .
Para iniciar o temporizador, o seu controlador chama WdfTimerStart, passando um "tempo devido". A estrutura inicia o relógio do temporizador e chama a função de retorno de chamada EvtTimerFunc quando o tempo especificado tiver decorrido.
Se o driver forneceu um intervalo de tempo periódico quando chamou WdfTimerCreate, o temporizador é referido como um temporizador periódico . O relógio de um temporizador periódico continua a funcionar após o "tempo devido" inicial ter decorrido, e o framework chama a função callback do driver repetidamente, sempre que o intervalo de tempo periódico tiver decorrido. Os temporizadores periódicos não são iniciados automaticamente. Semelhante aos temporizadores não periódicos, o driver ainda deve chamar WdfTimerStart depois de criar o temporizador para iniciá-lo pela primeira vez.
Um driver pode chamar WdfTimerStart da sua função de retorno de chamada EvtTimerFunc para reiniciar um temporizador não periódico após expirar.
Para parar um temporizador, o motorista pode chamar WdfTimerStop. O seu condutor pode reutilizar temporizadores iniciando-os e parando-os repetidamente.
Quando o driver cria um objeto de temporizador, ele deve especificar um objeto pai. A estrutura para o temporizador e elimina o objeto de temporizador quando o pai é eliminado. Para obter o objeto pai de um objeto de temporizador, seu driver pode chamar WdfTimerGetParentObject.
Nas versões do KMDF anteriores à versão 1.9, você não pode usar facilmente objetos de temporizador se quiser que todas as funções de retorno de chamada do driver sejam executadas em IRQL = PASSIVE_LEVEL. A estrutura implementa a função de retorno de chamada EvtTimerFunc do objeto de temporizador como uma chamada de procedimento diferido (DPC) que é chamada no nível IRQL = DISPATCH_LEVEL. Portanto, se tu quiseres que o código de expiração do temporizador seja executado em PASSIVE_LEVEL, a função de retorno de chamada EvtTimerFunc deve enfileirar um item de trabalho que é executado em PASSIVE_LEVEL.
Nas versões 1.9 e posteriores do KMDF, você pode criar temporizadores de nível passivo , que são temporizadores executados em PASSIVE_LEVEL. Para criar um temporizador de nível passivo, especifique o nível de execução WdfExecutionLevelPassive quando o seu driver chamar WdfTimerCreate. Como resultado, a estrutura implementa EvtTimerFunc funções de retorno de chamada como itens de trabalho que são executados em PASSIVE_LEVEL. Observe que os temporizadores de nível passivo não podem ser temporizadores periódicos.
A partir da versão 2.0 do UMDF, a framework implementa as funções de retorno de chamada EvtTimerFunc do objeto de temporizador como threads de trabalho a partir do pool de threads em modo de utilizador. Como resultado, as funções de retorno de chamada do temporizador de um driver UMDF sempre são executadas em PASSIVE_LEVEL.
Sem temporizadores de despertar
A eficiência energética do sistema é reduzida por temporizadores que repetidamente fazem com que o sistema seja retomado a partir de estados de baixa potência. Uma maneira de melhorar a vida útil da bateria é atrasar operações periódicas não críticas em vez de acordar o sistema. A partir do Windows 8.1, pode-se usar temporizadores de ativação desativados para executar essas operações não críticas em um driver KMDF ou UMDF. Um temporizador sem despertar não desperta o sistema se ele expirar enquanto o sistema estiver em um estado de baixa energia. Em vez disso, a estrutura chama a função de retorno de chamada EvtTimerFunc do driver na próxima vez que o sistema estiver totalmente ligado, estado S0.
Nenhum temporizador de despertar está disponível a partir do KMDF versão 1.13 e UMDF versão 2.0.
Para criar um temporizador sem despertar, defina o TolerableDelay membro do WDF_TIMER_CONFIG como TolerableDelayUnlimited.
Para obter mais informações sobre temporizadores de não-despertar, consulte Temporizadores de Não-Despertar.
Temporizadores de alta resolução
Os temporizadores de estrutura padrão têm uma precisão que corresponde ao intervalo de tick do relógio do sistema, que é, por padrão, de 15,6 milissegundos. A partir do Windows 8.1, pode criar temporizadores de alta resolução . Um temporizador de alta resolução tem uma precisão de um milissegundo. Você pode usar um temporizador de alta resolução para uma operação crítica que requer um tempo de expiração preciso e previsível. Como resultado da manutenção frequente que exige, um temporizador de alta resolução pode resultar na diminuição da vida útil da bateria.
Os temporizadores de alta resolução estão disponíveis apenas para drivers KMDF, começando com KMDF versão 1.13.
Para criar um temporizador de alta resolução, defina o UseHighResolutionTimer membro do WDF_TIMER_CONFIG para WdfTruee, em seguida, ajuste o valor Período para a resolução desejada.
A tabela a seguir mostra exemplos de comportamento do temporizador com base em valores diferentes que o driver fornece para Período. Estes exemplos pressupõem que o intervalo de marcação do relógio do sistema é de 15 milissegundos.
| Período, em ms | Temporizador padrão | Temporizador de alta resolução |
|---|---|---|
10 |
O temporizador expira entre 0 milissegundos e 25 milissegundos. |
O temporizador expira logo após 10 milissegundos quanto possível. |
16 |
O temporizador expira entre 15 milissegundos e 30 milissegundos. |
O temporizador expira logo após 16 milissegundos quanto possível. |
Para obter mais informações sobre temporizadores de alta resolução, consulte High-Resolution temporizadores.
Para obter mais informações sobre como a precisão do temporizador está relacionada à granularidade do relógio do sistema, consulte Timer Accuracy.