EVT_SERCX2_PIO_TRANSMIT_DRAIN_FIFO fungsi panggilan balik (sercx.h)

Fungsi panggilan balik peristiwa EvtSerCx2PioTransmitDrainFifo dipanggil oleh versi 2 dari ekstensi kerangka kerja serial (SerCx2) untuk menguras transmisi FIFO di perangkat keras pengontrol serial.

Sintaks

EVT_SERCX2_PIO_TRANSMIT_DRAIN_FIFO EvtSercx2PioTransmitDrainFifo;

void EvtSercx2PioTransmitDrainFifo(
  [in] SERCX2PIOTRANSMIT PioTransmit
)
{...}

Parameter

[in] PioTransmit

Handel SERCX2PIOTRANSMIT ke objek transmisi PIO. Driver pengontrol serial sebelumnya disebut metode SerCx2PioTransmitCreate untuk membuat objek ini.

Nilai kembali

Tidak ada

Keterangan

Driver pengontrol serial Anda dapat, sebagai opsi, menerapkan fungsi ini. Jika driver Anda menerapkan fungsi ini, driver juga harus mengimplementasikan fungsi panggilan balik peristiwa EvtSerCx2PioTransmitCancelDrainFifo dan EvtSerCx2PioTransmitPurgeFifo . Driver yang mengimplementasikan fungsi-fungsi ini mendaftarkannya dalam panggilan SerCx2PioTransmitCreate yang membuat objek transmisi PIO.

SerCx2 memanggil fungsi EvtSerCx2PioTransmitDrainFifo , jika diimplementasikan, untuk menguras transmisi FIFO di perangkat keras pengontrol serial di akhir transaksi transmisi PIO. Fungsi ini memastikan bahwa setiap byte data yang tetap berada dalam transmisi FIFO ditransmisikan ke perangkat periferal yang terhubung secara serial. Setelah byte terakhir ditransmisikan dari FIFO, fungsi EvtSerCx2PioTransmitDrainFifo memanggil metode SerCx2PioTransmitDrainFifoComplete untuk memberi tahu SerCx2.

Jika driver pengontrol serial menerapkan fungsi EvtSerCx2PioTransmitDrainFifo , SerCx2 tidak menyelesaikan permintaan tulis tertunda (IRP_MJ_WRITE) hingga driver memanggil SerCx2PioTransmitDrainFifoComplete.

Jika pengontrol serial Anda memiliki FIFO perangkat keras (atau mekanisme buffering serupa) untuk menyimpan data pengiriman, driver Anda harus menerapkan fungsi EvtSerCx2PioTransmitDrainFifo . Jika tidak, SerCx2 tidak dapat mengonfirmasi bahwa pengiriman FIFO telah dikosongkan sebelum permintaan tulis tertunda selesai. Sebagai gantinya, SerCx2 menyelesaikan permintaan ini setelah byte terakhir dalam buffer tulis ditulis ke FIFO pengiriman. Tidak ada jaminan bahwa data yang ditulis ke PENGIRIMAN FIFO akan ditransmisikan tanpa penundaan yang signifikan. Data apa pun yang tersisa di FIFO setelah permintaan tulis selesai mungkin hilang sebelum dapat ditransmisikan ke perangkat periferal yang terhubung secara serial. Kehilangan data tak terduga dalam permintaan tulis yang berhasil diselesaikan ini dapat menciptakan masalah keandalan untuk driver periferal.

Misalnya, driver periferal mungkin mengirim permintaan tulis ke port serial tempat perangkat periferal tersambung. Sampai semua permintaan tulis yang luar biasa selesai, driver ini harus menunda pengiriman IOCTL untuk mengubah laju baud di mana port serial mengirimkan data. Namun, jika tidak ada fungsi EvtSerCx2PioTransmitDrainFifo yang diimplementasikan, permintaan tulis untuk mengirimkan 100 byte data mungkin selesai sementara 50 byte data masih tetap berada dalam PENGIRIMAN FIFO. Jika driver periferal kemudian mengirim IOCTL untuk menetapkan laju baud baru, beberapa byte yang tersisa di FIFO mungkin ditransmisikan pada tingkat baud baru, menyebabkan kesalahan.

Demikian pula, jika permintaan tulis untuk mengirimkan 100 byte data selesai sementara 50 byte data masih tetap berada di FIFO pengiriman, dan pengontrol serial keluar dari D0 untuk memasuki status perangkat berdaya rendah sebelum byte yang tersisa di FIFO dapat ditransmisikan, driver periferal tidak akan tahu bahwa byte ini hilang.

Untuk informasi selengkapnya, lihat Transaksi PIO-Transmit SerCx2.

Contoh

Untuk menentukan fungsi panggilan balik EvtSerCx2PioTransmitDrainFifo , Anda harus terlebih dahulu memberikan deklarasi fungsi yang mengidentifikasi jenis fungsi panggilan balik yang Anda tentukan. Windows menyediakan sekumpulan tipe fungsi panggilan balik untuk driver. Mendeklarasikan fungsi menggunakan jenis fungsi panggilan balik membantu Analisis Kode untuk Driver, Pemverifikasi Driver Statis (SDV), dan alat verifikasi lainnya menemukan kesalahan, dan itu adalah persyaratan untuk menulis driver untuk sistem operasi Windows.

Misalnya, untuk menentukan fungsi panggilan balik EvtSerCx2PioTransmitDrainFifo yang diberi nama MyPioTransmitDrainFifo, gunakan jenis fungsi EVT_SERCX2_PIO_TRANSMIT_DRAIN_FIFO , seperti yang ditunjukkan dalam contoh kode ini:

EVT_SERCX2_PIO_TRANSMIT_DRAIN_FIFO  MyPioTransmitDrainFifo;

Kemudian, terapkan fungsi panggilan balik Anda sebagai berikut:

_Use_decl_annotations_
VOID
  MyPioTransmitDrainFifo(
    SERCX2PIOTRANSMIT  PioTransmit
    )
  {...}

Jenis fungsi EVT_SERCX2_PIO_TRANSMIT_DRAIN_FIFO didefinisikan dalam file header Sercx.h. Untuk mengidentifikasi kesalahan secara lebih akurat saat Anda menjalankan alat analisis kode, pastikan untuk menambahkan anotasi Use_decl_annotations ke definisi fungsi Anda. Anotasi Use_decl_annotations memastikan bahwa anotasi yang diterapkan ke jenis fungsi EVT_SERCX2_PIO_TRANSMIT_DRAIN_FIFO dalam file header digunakan. Untuk informasi selengkapnya tentang persyaratan untuk deklarasi fungsi, lihat Mendeklarasikan Fungsi dengan Menggunakan Jenis Peran Fungsi untuk Driver KMDF. Untuk informasi selengkapnya tentang Use_decl_annotations, lihat Perilaku Fungsi Anotasi.

Persyaratan

Persyaratan Nilai
Klien minimum yang didukung Tersedia dimulai dengan Windows 8.1.
Target Platform Desktop
Header sercx.h
IRQL Dipanggil di IRQL <= DISPATCH_LEVEL.

Lihat juga

EvtSerCx2PioTransmitCancelDrainFifo

EvtSerCx2PioTransmitPurgeFifo

IRP_MJ_WRITE

SERCX2PIOTRANSMIT

SerCx2PioTransmitCreate

SerCx2PioTransmitDrainFifoComplete