Desain Driver ADC: Teknik Polling Blocking vs Non-Blocking
Dalam artikel sebelumnya kami mengeksplorasi bagaimana antarmuka yang terstruktur dapat memisahkan detail driver tingkat rendah dari logika aplikasi, meningkatkan skalabilitas dan portabilitas di seluruh platform hardware.
Dalam entri ini kita menyelami implementasi driver ADC praktis, fokus pada pendekatan polling. Kami akan membandingkan desain blocking dan non-blocking dan menunjukkan bagaimana setiap yang mempengaruhi performa sistem.
Drivers Blocking vs Non-Blocking
Saat membuat driver mikrokontroler, seorang pengembang harus memutuskan apakah API akan memblokir eksekusi hingga operasi selesai. Driver blocking menghentikan alur program, memastikan kode berikutnya hanya berjalan setelah tugas selesai. Contoh klasik adalah printf yang didukung UART:
printf("Hello World!");
Dengan driver UART blocking, baris yang mengikuti panggilan ini tidak akan berjalan hingga string 12 byte (96 bit) telah sepenuhnya ditransmisikan. Tunda sebenarnya tergantung pada laju baud: pada 1 Mbps, blok berlangsung sekitar 96 µs; pada 9,6 kbps, tertahan hingga sekitar 10 ms.
Sebaliknya, driver non-blocking memulai transfer dan segera mengembalikan kontrol ke aplikasi. UART dapat terus memproses sementara data mengalir keluar, biasanya melalui interrupt, DMA, atau buffer transmisi. Pendekatan ini meningkatkan efisiensi dalam konteks sensitif latensi tetapi menambahkan kompleksitas ke driver dan aplikasi.
Memilih model yang tepat tergantung pada kebutuhan waktu aplikasi dan konfigurasi hardware. Untuk UART berkecepatan tinggi (misalnya, 1 Mbps), overhead desain non-blocking mungkin melebihi manfaatnya. Untuk tautan yang lebih lambat (misalnya, 9,6 kbps), driver non-blocking dapat membuka kenaikan performa yang signifikan dengan kompleksitas tambahan yang dapat dikelola.
Merancang Arsitektur Driver ADC
Driver ADC yang kuat biasanya terdiri dari tiga lapisan:
Driver tingkat rendah, yang menerima struktur konfigurasi saat inisialisasi dan mengatur register hardware.
Kode aplikasi, yang memanggil fungsi HAL generik untuk memulai konversi dan mengambil hasil.
Modul konfigurasi yang mengabstraksi parameter spesifik perangkat.
Driver tingkat rendah menyediakan Hardware Abstraction Layer (HAL) dengan API yang ringkas dan dapat digunakan kembali. Contoh dari proyek nyata meliputi:
void Adc_CallbackRegister(AdcCallback_t const Function, TYPE (*CallbackFunction)(type));
API ini memungkinkan inisialisasi, kontrol konversi, dan polling status yang sederhana. Pengakses register memungkinkan pengembang untuk memperluas HAL untuk fitur kustom, seperti konversi satu saluran, tanpa membesarnya API publik.
Mengimplementasikan Driver ADC Blocking Sederhana
Driver blocking minimal mungkin mengekspos satu rutinitas Adc_Sample yang memulai hardware, menunggu selesai, dan menyalin hasil ke buffer yang disediakan pemanggil. Kode di bawah ini menunjukkan ide inti:
Loop while memblokir hingga Adc_ConversionComplete mengembalikan true, setelahnya driver membaca register konversi dan menyimpan sampel.
Mengonversi ke Driver ADC Non-Blocking
Beralih ke model non-blocking memerlukan perubahan kecil pada API: pemanggil sekarang menerima flag status dan harus polling untuk selesai. Fungsi yang diperbarui mungkin terlihat seperti ini:
Dalam aplikasi, urutan yang umum menjadi:
Adc_Sample(); while (!Adc_ConversionComplete()) { // Lakukan tugas lain } // Baca hasil
Pendekatan ini membebaskan CPU untuk mengeksekusi kode yang tidak terkait sementara hardware ADC menyelesaikan konversinya.
Kesimpulan
Kedua driver ADC blocking dan non-blocking memiliki keuntungan yang berbeda:
Driver blocking sederhana dan tidak memerlukan manajemen status tambahan tetapi dapat menghentikan jalur kritis.
Driver non-blocking memungkinkan eksekusi konkors, meningkatkan throughput keseluruhan, tetapi memerlukan pemeriksaan status yang hati-hati dan potensi logika driver yang lebih kompleks.
Dalam posting berikutnya, kami akan memperluas diskusi ini dengan menunjukkan driver ADC berbasis interrupt yang lebih memisahkan akuisisi sensor dari logika aplikasi.