Konfigurasi dan Wiring
Motivasi TinyOS dibangun dari berbagai lapis komponen Suatu komponen sangat mungkin terkait dengan berbagai komponen yang lain Mengkaitkan komponen-komponen dalam nesC dilakukan di dalam konfigurasi: kenyataannya, program pada TinyOS mengandung lebih banyak konfigurasi daripada modul Konfigurasi berarti suatu komponen yang tinggal pakai: semua komponen yang terkait sudah di-wiring dalam satu konfigurasi Selain melakukan wiring, konfigurasi juga mengekspor antarmuka
Contoh
Operator -> and <- revisited nesC Hasil kompilasi ke C
Operator = Seperti halnya modul, konfigurasi juga dapat menyediakan atau menggunakan antarmuka Namun karena konfigurasi tidak memiliki kode implementasi, maka harus disedikan oleh komponen lain Cara adalah dengan menjadi proxy, yaitu dengan mengubah implementasi komponen lain menjadi seolah-olah implementasinya Operator yang digunakan adalah = Operator = menghubungkan antarmuka pada signature konfigurasi dengan komponen di implementasi
Contoh
Kesimpulan Operator -> dan <- menggabungkan komponen yang sudah ada dan melengkapi signature yang sudah ada Operator = mendefinisikan bagaimana antarmuka sebuah konfigurasi diimplementasikan: tentu saja dengan “meminjam” komponen (baca: modul) lain Dengan kata lain, konfigurasi mendelegasikan antarmuka pada signature-nya ke komponen lain dengan operator =
Serba-serbi Konfigurasi Penggunaan kata kunci “as” digunakan dalam mengelola namespace mengingat penamaan komponen pada nesC adalah flat (nama adalah global) Penggunaan kata kunci “as” juga dapat digunakan untuk menyingkat nama komponen Dalam hal wiring, maka nama yang digunakan adalah nama di belakang kata kunci “as”: sesungguhnya kata kunci “as” ditambahkan secara implisit
Serba-serbi Konfigurasi Dalam melakukan wiring, antarmuka dapat dipandang sebagai tipe data: 2 komponen dapat dihubungkan jika memiliki (baca: menyediakan atau menggunakan) antarmuka yang sama Dalam melakukan wiring, boleh tidak disebutkan nama antarmuka di salah satu komponen, berlaku pula pada saat mengekspor antarmuka Ingat: penyingkatan wiring tidak dilakukan berdasarkan nama melainkan berdasarkan peran komponen (penyedia atau pengguna): tidak boleh menghubungkan peran yang sama
Serba-serbi Konfigurasi Masih ingat akhiran C dan P? Maka ingatlah bahwa praktek tersebut tercakup dalam Programming hint 11 Auto-initialization dapat dilakukan pada tingkat konfigurasi: berguna untuk memastikan bahwa suatu komponen (atau abstraksi layanan) telah diinisialisasi pada saat booting Auto-initialization dilakukan dengan menghubungkan pada MainC (Programming hint 12)
Serba-serbi Konfigurasi Membangun abstraksi yang lebih besar/kompleks dengan menggabungkan berbagai komponen terkait dalam lapisan-lapisan pada suatu konfigurasi memberikan keuntungan Extensibility: meskipun kodenya menjadi lebih kompleks, tetapi lebih mudah dimodifikasi Hardware specificity: membagi abstraksi menjadi lapisan-lapisan mempermudah dalam hal mengubah implementasi yang spesifik perangkat keras Tapi ingat: pada saat menggunakan abstraksi/layanan jangan melakukan wiring pada lapisan yang berbeda-beda (Programming hint 13)
Serba-serbi Konfigurasi Multiple wiring dapat terjadi karena tugas wiring adalah “menghubungkan”: artinya, tidak salah jika komponen A telah dihubungkan dengan komponen B kemudian juga dihubungkan dengan komponen C Mengingat wiring adalah hubungan dua arah, maka ada kemungkinan (atau kepastian?): Fan out: satu komponen “memanggil” banyak komponen, contoh event Fan in: banyak komponen “memanggil” satu komponen, contoh command
Serba-serbi Konfigurasi Jadi, sesungguhnya tidak ada hubungan yang unik (baca: satu ke satu) antara komponen Hati-hati, fan in dan fan out tidak menentukan urutan pemanggilan: tergantung saat kompilasi meskipun bisa diatur dengan cara tertentu (silakan Bab 9) nesC memperlakukan multiple wiring secara hati-hati, yaitu pada kasus hubungan “transitif”: A -> B, A -> C, B -> C maka pemanggilan B ke C akan berhenti pada C (tidak terjadi rekursi)
Serba-serbi Konfigurasi Pada kasus fan out terdapat fungsi penggabungan (combine function) untuk menggabungkan nilai kembalian suatu fungsi Fungsi penggabungan harus disediakan dan harus bersifat asosiatif dan komutatif: tidak terpengaruh urutan atau pengelompokan pemanggilan fungsi Jika tidak ada fungsi penggabungan, maka nesC mengeluarkan peringatan (Programming hint 14) Contoh pada kembalian fungsi dengan tipe error_t Jika nilai kembaliannya sama, maka nilai tersebut dikembalikan ke pemanggil Jika berbeda berbeda maka akan mengembalikan FAIL