rangkuman embedded os

Upload: oryza-nurfa

Post on 05-Apr-2018

216 views

Category:

Documents


0 download

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.