Menggunakan Timer

Topik ini menjelaskan cara menggunakan dukungan timer bawaan kerangka kerja. Ini berlaku untuk driver Kernel-Mode Driver Framework (KMDF) serta driver User-Mode Driver Framework (UMDF) mulai versi 2.

Kerangka kerja menyediakan objek timer yang memungkinkan driver untuk membuat timer. Setelah driver membuat objek timer dan memulai jam timer, kerangka kerja memanggil fungsi panggilan balik yang disediakan driver setelah jumlah waktu yang ditentukan berlalu. Secara opsional, driver Anda dapat mengatur timer sehingga kerangka kerja memanggil fungsi panggilan balik berulang kali, setiap kali jumlah waktu yang ditentukan telah berlalu.

Untuk membuat objek timer kerangka kerja, driver Anda harus memanggil metode WdfTimerCreate . Metode ini mendaftarkan fungsi panggilan balik EvtTimerFunc dan interval waktu berkala. Jika Anda ingin kerangka kerja memanggil fungsi panggilan balik hanya sekali, driver Anda menentukan nol untuk interval waktu berkala.

Biasanya, Anda akan mengetahui jumlah timer yang dibutuhkan driver Anda untuk setiap perangkat. Oleh karena itu, driver dapat membuat objek timer dengan memanggil WdfTimerCreate dalam fungsi panggilan balik EvtDriverDeviceAdd , dan dapat menyimpan handel objek timer di perangkat atau ruang konteks objek antrean.

Untuk memulai timer, driver Anda memanggil WdfTimerStart, melewati "waktu jatuh tempo". Kerangka kerja memulai jam timer dan memanggil fungsi panggilan balik EvtTimerFunc ketika jumlah waktu yang ditentukan telah berlalu.

Jika driver menyediakan interval waktu berkala ketika disebut WdfTimerCreate, timer disebut sebagai timer berkala. Jam timer berkala terus berjalan setelah "waktu jatuh tempo" awal berlalu, dan kerangka kerja memanggil fungsi panggilan balik driver berulang kali, setiap kali interval waktu berkala telah berlalu. Timer berkala tidak dimulai secara otomatis. Seperti timer non-berkala, driver masih harus memanggil WdfTimerStart setelah membuat timer untuk memulainya pertama kali.

Driver mungkin memanggil WdfTimerStart dari fungsi panggilan balik EvtTimerFunc untuk memulai ulang timer non-berkala setelah kedaluwarsa.

Untuk menghentikan timer, driver dapat memanggil WdfTimerStop. Driver Anda dapat menggunakan kembali timer dengan memulai dan menghentikannya berulang kali.

Ketika driver Anda membuat objek timer, driver harus menentukan objek induk. Kerangka kerja menghentikan timer dan menghapus objek timer saat induk dihapus. Untuk mendapatkan objek induk objek timer, driver Anda dapat memanggil WdfTimerGetParentObject.

Dalam versi KMDF sebelum versi 1.9, Anda tidak dapat dengan mudah menggunakan objek timer jika Anda ingin semua fungsi panggilan balik driver Anda berjalan di IRQL = PASSIVE_LEVEL. Kerangka kerja mengimplementasikan fungsi panggilan balik EvtTimerFunc objek timer sebagai panggilan prosedur yang ditangguhkan (DPC) yang dipanggil di IRQL = DISPATCH_LEVEL. Oleh karena itu, jika Anda ingin kode kedaluwarsa timer Anda berjalan pada PASSIVE_LEVEL fungsi panggilan balik EvtTimerFunc harus mengantre item kerja yang berjalan pada PASSIVE_LEVEL.

Di KMDF versi 1.9 dan yang lebih baru, Anda dapat membuat timer tingkat pasif, yang merupakan timer yang berjalan pada PASSIVE_LEVEL. Untuk membuat timer tingkat pasif, tentukan tingkat eksekusi WdfExecutionLevelPassive saat driver Anda memanggil WdfTimerCreate. Akibatnya, kerangka kerja mengimplementasikan fungsi panggilan balik EvtTimerFunc sebagai item kerja yang berjalan pada PASSIVE_LEVEL. Perhatikan bahwa timer tingkat pasif tidak dapat menjadi timer berkala.

Mulai dari UMDF versi 2.0, kerangka kerja mengimplementasikan fungsi panggilan balik EvtTimerFunc objek timer sebagai utas pekerja dari kumpulan utas mode pengguna. Akibatnya, fungsi panggilan balik timer driver UMDF selalu berjalan pada PASSIVE_LEVEL.

Tidak Ada Timer Bangun

Efisiensi daya sistem dikurangi oleh timer yang berulang kali menyebabkan sistem dilanjutkan dari status daya rendah. Salah satu cara untuk meningkatkan masa pakai baterai adalah dengan menunda operasi berkala non-kritis daripada membangunkan sistem. Mulai dari Windows 8.1, Anda tidak dapat menggunakan timer bangun untuk melakukan operasi non-kritis tersebut baik di driver KMDF atau UMDF. Timer tidak bangun tidak membangunkan sistem jika kedaluwarsa saat sistem dalam status daya rendah. Sebaliknya, kerangka kerja memanggil fungsi panggilan balik EvtTimerFunc driver saat sistem aktif sepenuhnya, S0.

Tidak ada timer bangun yang tersedia dimulai dengan KMDF versi 1.13 dan UMDF versi 2.0.

Untuk membuat timer tanpa bangun, atur anggota TolerableDelaydari WDF_TIMER_CONFIG ke TolerableDelayUnlimited.

Untuk informasi selengkapnya tentang tidak ada timer bangun, lihat Timer Tanpa Bangun.

Timer Resolusi Tinggi

Timer kerangka kerja standar memiliki akurasi yang cocok dengan interval centang jam sistem, yaitu secara default 15,6 milidetik. Mulai dari Windows 8.1, Anda dapat membuat timer resolusi tinggi. Timer resolusi tinggi memiliki akurasi satu milidetik. Anda dapat menggunakan timer resolusi tinggi untuk operasi penting yang membutuhkan waktu kedaluwarsa yang tepat dan dapat diprediksi. Sebagai akibat dari layanan yang sering diperlukan, timer resolusi tinggi dapat mengakibatkan penurunan masa pakai baterai.

Timer resolusi tinggi hanya tersedia untuk driver KMDF, dimulai dengan KMDF versi 1.13.

Untuk membuat timer resolusi tinggi, atur anggota UseHighResolutionTimerdari WDF_TIMER_CONFIG ke WdfTrue, lalu sesuaikan nilai Periode ke resolusi yang diinginkan.

Tabel berikut ini memperlihatkan contoh perilaku timer berdasarkan nilai berbeda yang disediakan driver untuk Periode. Contoh-contoh ini mengasumsikan bahwa interval centang jam sistem adalah 15 milidetik.

Periode, dalam md Timer Standar Timer Resolusi Tinggi

10

Timer kedaluwarsa antara 0 milidetik dan 25 milidetik.

Timer kedaluwarsa segera setelah 10 milidetik mungkin.

16

Timer kedaluwarsa antara 15 milidetik dan 30 milidetik.

Timer kedaluwarsa segera setelah 16 milidetik mungkin.

Untuk informasi selengkapnya tentang timer resolusi tinggi, lihat Timer Resolusi Tinggi.

Untuk informasi selengkapnya tentang bagaimana akurasi timer terkait dengan granularitas jam sistem, lihat Akurasi Timer.