Model Eksekusi TinyOS
Pendahuluan Operasi I/O dan operasi yang membutuhkan waktu cukup lama pada TinyOS adalah split-phase: tidak membutuhkan thread sehingga hanya membutuhkam satu stack Sebagai ganti dari thread: task dan interrupt handler Interupsi dapat terjadi sewaktu-waktu, menginterupsi apa yang sedang dieksekusi TinyOS (baik task maupun interrupt handler)
Pendahuluan Task dan interrupt handler didefinisikan pada suatu modul, tetapi dalam eksekusinya boleh jadi melibatkan komponen yang lain Oleh karena itu, perlu dibedakan apakah suatu kode dieksekusi oleh task atau interrupt handler atau keduanya nesC membedakan menjadi 2: synchronous code (sync) hanya boleh dieksekusi task dan asynchronous code (async) boleh dieksekusi task dan interrupt handler
Pendahuluan Kode asinkron dibahas di Bab 11, terkait dengan konkurensi pada TinyOS Ilustrasi eksekusi pada TinyOS
Task Task memiliki nilai kembalian void Task tidak memiliki parameter Task dapat mengakses variabel, memanggil perintah, mensinyal kejadian, dan memanggil fungsi C Suatu task dideklarasikan dengan kata kunci task Task dipanggil dengan operator post Operator post memberikan nilai kembalian error_t
Task Deklarasi task: Memanggil task
Task Task dieksekusi satu per satu dan tidak saling potong (preempt): task berikutnya dieksekusi setelah task yang sebelumnya selesai dieksekusi Karena tidak saling potong, maka anggapannya task memegang kendali penuh atas prosesor sampai selesai diekskusi Akibatnya tidak perlu ada penanganan khusus terhadap variabel yang dipakai bersama-sama
Task Task dieksekusi secara FIFO: sesuai urutan pada saat di-posting Karena task baru dieksekusi jika semua task sebelumnya telah selesai dieksekusi, maka task harus dibuat sependek/secepat mungkin (beberapa milisecond): Programming hint 15 Task yang cukup panjang dapat mengakibatkan latensi: sistem menjadi tidakresponsif Jika suatu task membutuhkan waktu yang panjang maka harus dipecah menjadi task-task kecil Ingat, task dapat mem-posting ulang dirinya sendiri
Task TinyOS dibangun atas berbagai lapis, oleh karena itu, sebuah event handler mungkin bagian dari suatu rantai kejadian Jika suatu event handler tersebut membutuhkan komputasi yang cukup panjang, maka gunakan task untuk memanggil fungsi komputasinya (komputasi tidak dilakukan di dalam event handler): Programming hint 16 Dengan begitu rantai panjang pada kejadian dapat “dipotong” menjadi lebih pendek: sistem menjadi lebih responsif
Task Task sangat penting dalam hal split-phase operation Dengan task, memungkinkan batas hardware dan software yang fleksibel: hardware dan software mempunyai perilaku yang mirip (split-phase) Mensinyal event langsung pada command dapat mengakibatkan pemanggilan fungsi yang panjang: kasus pencuplikan data frekuensi tinggi Oleh karena itu, mensinyal event sebaiknya dilakukan pada task (Programming hint 17): command mem-posting task yang mensinyal event