Bagikan melalui


Mengganggu Objek Sinkronisasi

Driver sistem PortCls mengimplementasikan antarmuka IInterruptSync untuk keuntungan driver miniport. IInterruptSync mewakili objek sinkronisasi interupsi yang menyinkronkan eksekusi daftar rutinitas layanan interupsi (ISR) dengan rutinitas yang tidak mengganggu.

Objek sinkronisasi interupsi menyediakan dua kemampuan utama:

  • Eksekusi daftar ISR sebagai respons terhadap gangguan. Objek sinkronisasi tersambung ke sumber interupsi. Setiap kali gangguan terjadi, objek sinkronisasi menjalankan ISR dalam urutan tertentu sesuai dengan mode yang dipilih. (Lihat deskripsi berikut dari tiga mode.)

  • Eksekusi rutinitas yang bukan ISR. Rutinitas yang tidak mengganggu ini tidak terhubung ke interupsi objek sinkronisasi. Sebaliknya, rutinitas yang tidak mengganggu berjalan pada saat pemanggil memilih. Namun, objek sinkronisasi menjalankan rutinitas yang tidak mengganggu secara sinkron dengan daftar ISR objek. Dengan kata lain, rutinitas yang tidak mengganggu berjalan hingga selesai sebelum salah satu ISR dalam daftar objek sinkronisasi mulai dijalankan, dan sebaliknya.

Objek sinkronisasi interupsi fleksibel dalam menangani beberapa ISR. ISR berada dalam daftar tertaut yang dilalui objek sinkronisasi pada waktu interupsi. Ketika driver miniport mendaftarkan ISR dengan objek sinkronisasi, ia menentukan apakah ISR harus ditambahkan ke awal atau akhir daftar ini.

Driver miniport memanggil fungsi PcNewInterruptSync untuk membuat objek sinkronisasi interupsi. Selama panggilan ini, driver menentukan cara objek melintasi daftar ISR-nya pada waktu interupsi. Panggilan mendukung tiga opsi yang ditentukan oleh konstanta enumerasi INTERRUPTSYNCMODE dalam tabel berikut.

Terus-menerus Makna

InterruptSyncModeNormal

Panggil setiap ISR dalam daftar hingga salah satunya kembali STATUS_SUCCESS.

InterruptSyncModeAll

Panggil setiap ISR dalam daftar tepat sekali, terlepas dari kode pengembalian ISR sebelumnya.

InterruptSyncModeRepeat

Melintasi seluruh daftar ISR hingga perjalanan melalui daftar terjadi di mana tidak ada ISR dalam daftar yang mengembalikan STATUS_SUCCESS.

Dalam mode InterruptSyncModeNormal , objek sinkronisasi memanggil setiap ISR dalam daftar hingga salah satunya kembali STATUS_SUCCESS. ISR apa pun dalam daftar yang mengikuti ISR ini tidak dipanggil. Mode ini menimulasi cara sistem operasi biasanya menangani ISR. Jika tidak ada ISR yang mengembalikan STATUS_SUCCESS, perilakunya sama dengan InterruptSyncModeAll.

Dalam mode InterruptSyncModeAll , setiap ISR dalam daftar dipanggil tepat sekali, terlepas dari kode pengembalian ISR sebelumnya. Ini ditujukan untuk perangkat keras yang lebih primitif di mana sumber gangguan tidak deterministik, meskipun mungkin berguna dalam situasi lain juga. Misalnya, dua sumber interupsi mungkin disinkronkan dengan erat pada setiap gangguan, terlepas dari sumber mana dari kedua gangguan tertentu berasal.

Dalam mode InterruptSyncModeRepeat , objek sinkronisasi berulang kali melintasi seluruh daftar ISR hingga perjalanan melalui daftar terjadi di mana tidak ada rutinitas dalam daftar yang mengembalikan STATUS_SUCCESS. Mode ini sesuai untuk situasi di mana gangguan dari beberapa sumber mungkin diaktifkan pada garis interupsi yang sama pada saat yang sama, atau gangguan kedua mungkin terjadi selama pemrosesan ISR. Setiap sumber gangguan harus dapat menentukan apakah memerlukan pemrosesan. Sistem akan berhenti merespons jika ISR yang selalu mengembalikan STATUS_SUCCESS terdaftar dengan objek sinkronisasi dalam mode ini.

Dalam salah satu mode ini, objek sinkronisasi akan mengakui gangguan pada sistem operasi jika salah satu ISR terdaftar mengembalikan STATUS_SUCCESS. Dalam ketiga mode, jika semua sumber gangguan menunjukkan bahwa mereka tidak berhasil menangani gangguan, objek sinkronisasi akan mengembalikan kode hasil yang tidak berhasil ke sistem operasi.

Antarmuka IInterruptSync mendukung metode berikut:

IInterruptSync::CallSynchronizedRoutine

IInterruptSync::Connect

IInterruptSync::D isconnect

IInterruptSync::GetKInterrupt

IInterruptSync::RegisterServiceRoutine