rangkuman embedded os
TRANSCRIPT
-
7/31/2019 Rangkuman Embedded Os
1/10
-
7/31/2019 Rangkuman Embedded Os
2/10
Di dalam dokumen TinyOS 2.x terdapat beberapa programming hint. Programming hint berisi
tentang aturan-aturan penting dalam penulisan program di TinyOS 2.x. Berikut ini merupakan
rangkuman beberapa programming hint yang ada di dalam TinyOS 2.x pada buku TinyOS
Programming tahun 2009.
1. Programming Hint 1: Use the as keyword libraryPada programming hint 1 ini dijelaskanpenggunaan keyword as dalam signature untuk
meyakinkan bahwa setiap instance dari suatu interface memiliki nama yang unik.
Di dalam TinyOS 2.x setiap komponen ( modules dan configurations ) memiliki sebuah
signature, yang mendeskripsikan fungsi yang ingin dipanggil dan fungsi lain yang akan
dipanggil oleh yang lainnya. Setiap komponen di dalam nesC memiliki dua blok kode, yaitu
signature dan implementation. Secara umum, dua blok kode tersebut dapat digambarkan
seperti di bawah ini:
Contoh di bawah ini blok signature dan implementation yang digunakan pada program
nesC untuk menyalakan Led:
Keyword as digunakan sebagai alternative nama untuk sebuah interface. Keyword as
di dalam signature dapat memperjelas pembaca dalam memahami kode program. Misalnya
pada contoh berikut:
-
7/31/2019 Rangkuman Embedded Os
3/10
Pada configuration MainC, dapat digunakan keyword as sebagai berikut:
Penggunaan nama SoftwareInit untuk interface Init akan memudahkan pembaca dalam
memahami maksud kode program tersebut.
Beberapa signature harus menggunakan keyword untuk membedakan multiple instance
dari interface yang sama. Jika sebuah komponen menyediakan atau menggunakan lebih dari
sekali, signature dari komponen tersebut harus menggunakan keyword as untuk
memberikan nama yang berbeda. Seperti contoh berikut:
Sesuai contoh di atas, LedsC menyediakan abstraksi tiga LED melalui interface Leds, tetapi
LedsC merupakan sebuah configuration dan bukan merupakan executable code.
Configuration LedsC menghubungkan module LEDs, LedsP, ke komponen yang
menyediakan digital input-output yang menyalakan LEDs. Signature hanya meyakinkan
bahwa setiap instance dari interface memiliki nama yang unik. LedsP dapat menggunakan
keyword as hanya dua kali, dan meninggalkan satu instance interface GeneralIO, sehingga
nama ketiga instance dari interface tersebut adalah Led0, Led1, dan GeneralIO. Tetapi, haltersebut dapat membingungkan, sehingga LedsP mengganti nama ketiga instances dari
GeneralIO. Secara teknik, deklarasi interface secara eksplisit menggunakan keyword as.
Kode berikut:
uses interface Leds;
sebenarnya merupakan kependekan dari
-
7/31/2019 Rangkuman Embedded Os
4/10
uses interface Leds as Leds;
secara umum, keyword as merupakan tool yang sangat bermanfaat untuk menjadikankomponen dan requirement-nya lebih jelas.
2. Programming Hint 2: Never write recursive functions within a module. In combinationwith TinyOS coding conventions, this guarantees that all programs have bounded stack
usage.
Programming Hint 3: Never use malloc and free. Allocate all state in components. If your
application requirements necessitate a dynamic memory pool, encapsulate it in a
component and try to limit the set of users.
Di dalam lingkungan mote, sumber daya yang dijadikan fokus utama dan merupakan
karateristik untuk embedded system adalah power dan RAM. Power berarti radio dan CPU
harus tidur jika tidak digunakan, berarti sebanyak mungkin bisa tidur. RAM di dalam
mikrokontroller sangat kecil, sehingga programmer harus dapat membuat program dengan
kode seefisien mungkin.
Module mengalokasikan memory dengan mendeklarasikan variabel yang mengikuti
aturan scope nesC, yaitu sepenuhnya private dalam komponen tersebut. Contoh, komponen
CountingGetC dialokasikan count sebagai sebuah variabel 8-bit module-level, dengan biaya
sebesar 1 byte di dalam RAM. Karena TinyOS menggunakan operasi split-phase dan tidak
menyediakan thread, tidak ada long-lived stack allocated data. Sebagai hasilnya, saat sistem
TinyOS sedang dalam keadaan diam/idle, variabel pada module merepresentasikan status
software secara keseluruhan.
nesC tidak mendukung alokasi memory secara dinamis, baik malloc ataupun
pemanggilan library C yang lainnya. Kita dapat memanggilnya, tetapi proteksi kekurangan
memory pada embedded microcontroller membuat penggunaan malloc terlalu beresiko.
-
7/31/2019 Rangkuman Embedded Os
5/10
-
7/31/2019 Rangkuman Embedded Os
6/10
menggunakan referensi (pointer). Jika menggunakan nilai, maka data digandakan ke dalam
stack, sehingga fungsi yang dipanggil dapat memodifikasi atau menyembunyikannya secara
bebas. Sedangkan jika menggunakan referensi, pemanggil maupun fungsi yang dipanggil,
berbagi pointer ke data, sehingga dua komponen harus berhati-hati dalam mengatur akses ke
data agar mencegah memory yang korup (memory corruption).
Cara yang paling sederhana untuk mencegah masalah data-sharing adalah jangan pernah
menyimpan parameter pointer di variabel module. Tetapi, pendekatan ini tidak dapat
dipraktekkan untuk pemanggilan split-phase, karena komponen yang dipanggil secara
khusus membutuhkan akses ke pointer selama operasi dieksekusi, pointer menyimpan
parameter di variabel module. Contoh:
Pada contoh di atas, untuk mengirimkan sebuah paket, sebuah komponen memanggil
fungsi send. Jika fungsi send mengembalikan/return SUCCESS, kemudian pemanggil telah
melewatkan paket ke sebuah stack komunikasi untuk digunakan, dan tidak memodifikasi
paket. Fungsi yang dipanggil menyimpan pointer di sebuah variabel, membuat status
berubah, dan mengembalikan dengan segera. Jika interface pengguna memodifikasi paket
setelah melewatkan paket tersebut ke interface penyedia, paket dapat rusak. Misalnya, radio
stack bisa jadi menghitung checksum keseluruhan paket, kemudian mengirimkan paket
tersebut. Jika pemanggil memodifikasi paket setelah checksum dihitung, kemudian data dan
checksum tidak akan sama/cocok dan penerima akan menolak paket tersebut.
Untuk menghindari masalah tersebut, TinyOS mengikuti sebuah aturan ownership: setiapmemory object ( sebuah bagian dari memory, secara khusus variabel atau suatu elemen
array ) harus dimiliki oleh sebuah single module. Ketika sebuah interface split-phase
memiliki semantic pass, penyelesaian event harus melewatkan pointer dengan satu
parameter, untuk menunjukkan bahwa objek sedang dikembalikan ke pemilik yang
sebenarnya.
-
7/31/2019 Rangkuman Embedded Os
7/10
4. Programming Hint 5: Converse memory by using enums rather than conts variables forinteger constants, and dont declare variables with an enum type.
Module seringkali membutuhkan constant, misalnya menstransimiskan hitungan.
Penggunaan sebuah literal constant merupakan permasalahan. Di dalam bahasa C,
penggunaan constant seperti berikut:
Masalah yang timbul pada nesC/TinyOS ketika kita menggunakan contoh di atas adalah
sebuah cons tint harus mengalokasikan RAM, tergantung pada compiler ( compiler yang
bagus akan menempatkan constant di dalam program memory ). Kita dapat mendapatkan
efek yang sama dengan mendefinisikan sebuah enum, seperti berikut:
Hal ini mengijinkan komponen untuk menggunakan sebuah nama untuk memelihara sebuah
nilai yang konsisten dan tidak menyimpan nilai tersebut di RAM atau program memory.
Bahkan penggunaan enum dapat meningkatkan kinerja, seperti daripada sebuah memory
load, arsitektur dapat hanya memuat constant. Hal ini lebih baik daripada penggunaan
#define. Tetapi, enum hanya dapat mendeklarasikan constant yang bertipe integer, sehingga
kita harus selalu menggunakan #define untuk constant yang bertipe floating-point dan
constant yang bertipe string.
Kadang-kadang, penggunaan tipe enum pada deklarasi variabel dapat membuang
memory, selama enum sebagai default untuk lebar integer. Sebagai contoh:
-
7/31/2019 Rangkuman Embedded Os
8/10
Di bawah ini juga merupakan kode untuk mengalokasikan status variabel:
Meskipun range nilai yang valid adalah 0-3, kode yang di awal akan mengalokasikan native
integer, di dalam mikrokontroller biasanya sebesar 2 byte, tetapi dapat menjadi 4 byte di
dalam mikroprosessor yang low-power. Kode yang kedua akan mengalokasikan single byte.
Sehingga kita harus menggunakan enum untuk mendeklarasikan constant, tetapi
menghindari mendeklarasikan variabel dengan tipe enum.
5. Programming Hint 6: Never, ever use the packed attribute in portable code.Untuk menyederhanakan kode jaringan (networking code), TinyOS secara tradisional
menggunakan struct untuk mendefinisikan format pesan dan akses pesan secara langsung,hal ini menghindari kompleksitas programming dan biaya penggunaan penyusunan fungsi
untuk mengubah antara host dan representasi pesan jaringan. Sebagai contoh, standar header
sebuah paket dari CC2420 802.15.4 chip wireless radio sebagai berikut:
Header tersebut memiliki satu byte length field, dua byte frame control field, satu byte
sequence number, dua byte grup, dua byte untuk tujuan (destination), dua byte untuk source,
dan satu byte tipe field. Mendefiniskan struktur header di atas mengijinkan kita mengakses
field, mengalokasikan penyimpanan, dan sebagainya dengan mudah. Masalahnya, layout
dan proses encoding struktur header tersebut bergantung pada chip yang sedang di-compile.
Misalnya, CC2420 mengharapkan semua field-nya merupakan little-endian. Jika
mikrokontroller yang digunakan merupakan big-endian, mikrokontroller tidak dapat
mengakses frame control field dengan mudah. Solusinya adalah memanggil macros secara
-
7/31/2019 Rangkuman Embedded Os
9/10
eksplisit yang mengubah antara mikrokontroller dan urutan byte dari chip, sebagai contoh
macros seperti Unixs htons, ntohl, dan sebagainya. Tetapi, pendekatan ini cenderung terjadi
error (error-prone), terutama ketika kode pada awalnya dikembangkan di atas sebuah
prosessor dengan urutan byte yang sama seperti chip.
Masalah lain yang timbul akibat dari pendekatan tersebut adalah karena perbedaan aturan
aligment antara prosessor. Pada ATmega128, struktur field akan diluruskan pada satu byte
boundaries, sehingga layout akan bekerja dengan baik. Pada MSP4300, bagaimanapun, nilai
dua byte harus diluruskan pada dua byte boundaries: kita tidak dapat memuat sebuah kata
yang tidak diluruskan (unaligned). Sehingga compiler MSP430 akan mengenalkan sebuah
byte padding setelah panjang field, membuat strukturnya tidak kompatibel dengan CC2420
dan platform yang lain. Berikut pasangan isu yang muncul, tetapi memiliki point yang sama:
program di TinyOS membutuhkan kemampuan untuk menspesifikasikan format data
platform-independent yang dapat diakses dan digunakan dengan mudah.
Di TinyOS 1.x, beberapa program berusaha mengatasi masalah ini dengan menggunakan
atribut packed gcc untuk membuat struktur data platform yang independent. Packed
memberitahu gcc untuk mengabaikan struct aligment requirements dan sebagai gantinya
memasukkan struktur yang ketat:
Kode di atas merupakan penggunaan atribut di TinyOS 1.x pada library MintRoute.
Packed disediakan di ATmega128 dan di x86 untuk menyepakati format data. Tetapi,
packed memiliki beberapa maslaah. Versi gcc yang digunakan pada family MSP430 tidak
menangani struktur packed dengan benar. Packed merupakan fitur gcc yang spesifik,
sehingga kode yang menggunakan packed tidak terlalu portable. Selama packed
menghilangkan perbedaan aliggment, packed tidak mengubah endian: int16_t mungkin
merupakan big-endian di suatu platform dan little-endian di platform lainnya, sehingga
sebaiknya kita selalu menggunakan konversi macros seperti htons.
6. Programming Hint 7: Use platform independent types when defining message structures
-
7/31/2019 Rangkuman Embedded Os
10/10
Untuk menjaga ketepatan dalam menspesifikasi layout paket, nesC 1.2 mengenalkan tipe
platform independent. Tipe platform independent yang sederhana adalah big-endian atau
little-endian, berada di bawah chip hardware. Secara umum, tipe eksternal sama dengan tipe
pada umumnya, kecuali pada tipe eksternal didahului dengan nx_ atau nxle_,
penggunaanya seperti contoh di bawah ini:
Sebagai tambahan untuk menyederhanakan tipe, terdapat juga platform independent
struct dan union, dideklarasikan dengan nx_struct dan nx_union. Setiap filed dari
sebuah platform independent struct dan union harus merupakan tipe platform independent.
Arsitektur hardware yang mengompile struktur kode di atas menggunakan layout
memory yang sama dan endian yang sama untuk semua field. Hal tersebut memungkinkan
kode platform untuk mengumpulkan dan membongkar struktur, tampa mengurutkan lagi
macros atau fungsi utility seperti UNIX socket htonl dan ntohs.