Arsitektur Perangkat Lunak pada Sistem Embedded

Diagram alir multithread dengan superloop, interupsi dan thread

Arsitektur Perangkat Lunak pada Sistem Embedded

Pada artikel ini diuraikan macam-macam arsitektur perangkat lunak dalam konteks system embedded. Pertama akan diuraikan arsitektur aplikasi desktop sebagai perbandingan. Kemudian akan kita lihat 3 macam arsitektur yang umum dipakai pada system embedded, yaitu pertama: arsitektur super loop, kedua arsitektur super loop dengan interupsi. Arsitektur , kedua ini dikenal juga dengan nama foreground-background. Ketiga adalah arsitektur multithreading.

Ada dua macam aplikasi:

  • Aplikasi Desktop
  • Aplikasi Sistem Embedded

Ada beberapa macam arsitektur software sistem embedded:

  1. Super loop (tanpa interupsi)
  2. Super loop dengan interupsi / foreground-background
  3. Multithreading

Aplikasi Desktop

Berikut ini arsitektur desktop yang biasa. Pada aplikasi desktop, pengguna mesti menjalankan dulu system operasi pada computer yang dipakai, misalkan Windows, atau Linux.. Aplikasi dijalankan oleh pengguna. Sistem operasi akan menjalankan aplikasi tersebut , biasanya dengan cara mengambil kode dari storage seperti har disk atau flash memory, kemudian mengalokasikan resource seperti CPU, RAM , input output ke aplikasi tersebut. Kemudian aplikasi mulai dijalankan pada START.  Kemudian aplikasi ini melakukan suatu proses yang dapat terdiri dari beberapa task (atau pekerjaan). Setelah proses ini selesai, maka aplikasi akan berhenti, di flowchart dilambangkan dengan STOP. Sistem operasi kemudian menghapus aplikasi dari memori. Pada saat ini aplikasi selesai.

Diagram alir perangkat lunak aplikasi desktop
Diagram alir perangkat lunak aplikasi desktop

Arsitektur Superloop

Berikut ini adalah arsitektur paling sederhana yang dipakai pada sistem embedded, yaitu arsitektur superloop. Pada arsitektur ini , software dikelompokkan menjadi 2 bagian, yaitu bagian INIT yang berisi kode-kode inisialisasi yang hanya dijalankan satu kali saja pada aplikasi tersebut. Biasanya bagian INIT ini berisi konfigurasi hardware pada mikroprosesor / mikrokontroler yang dipakai. Misalnya adalah melakukan setting pin-pin sebagai input ataupun sebagai output. Kemudian ada bagian TASK / Tugas, yang dikerjakan berulang-ulang tanpa henti. Pada diagram alir / flowchart aplikasi sistem embedded tidak ada blok STOP , karena aplikasi tidak pernah berhenti. Arsitektur ini dapat dipakai untuk 1 task  atau beberapa task yang tidak memerlukan jadwal atau pewaktuan yang kritis.

Diagram alir perangkat lunak embedded dengan superloop
Diagram alir perangkat lunak embedded dengan superloop

Superloop pada Arduino

Pada Arduino , arsitektur perangkat lunak yang paling sering dipakai adalah superloop. Di sini sudah difasilitasi dengan cara memberikan 2 buah fungsi dasar yaitu fungsi setup() dan fungsi loop(). Fungsi setup() hanya dijalankan sekali saja di awal, biasanya berisi inisialisasi hardware. Selain itu ada fungsi loop() yang dijalankan terus menerus. Jadi flowchart atau diagram alir program Arduino prinsipnya adalah seperti pada gambar ini. Sebagai contoh adalah perangkat lunak lampu kedip yang tersedia di contoh aplikasi Arduino. Aplikasi ini biasanya aplikasi yang pertama kali kita jalankan di Arduino, untuk mengecek apakah compiler dan hardware yang dipakai berfungsi baik. Pada aplikasi ini pada bagian setup() berisi inisialisasi sebuah pin (dalam hal ini pin LED_BUILTIN) sebagai output. Pada Arduino Nano dan Arduino UNO, pin LED_BUILTIN ini adalah pin 13. Kemudian pada fungsi loop() , di dalamnya adalah Task untuk menyalakan dan mematikan LED dengan delay sebanyak 1000 milidetik.

 

Berikut ini contoh perangkat lunak Arduino sesuai dengan diagram alir di atas.

// https://www.arduino.cc/en/tutorial/blink

void setup() {

pinMode(LED_BUILTIN, OUTPUT);

}

void loop() {

digitalWrite(LED_BUILTIN, HIGH);

delay(1000); digitalWrite(LED_BUILTIN, LOW);   

delay(1000);

}

 

Superloop Dengan Dua Task

Aplikasi superloop umumnya hanya baik dipakai untuk satu task / tugas yang tidak memerlukan pewaktuan yang kritis. Bisa juga dipakai untuk dua atau lebih task, namun akan ada masalah kalau kedua task tersebut memerlukan pewaktuan yang berbeda. Pada ilustrasi flowchart ini kita lihat 2 buah task / pekerjaan yang dimasukkan ke dalam sebuah loop. Task 1 dan Task 2 akan bekerja bergantian. Untuk memulai Task 2 harus menunggu task 1 selesai, dan sebaliknya : task 1 harus menunggu task 2 selesai sebelum task 1 dapat mulai bekerja.

 

Diagram alir superloop dengan dua task
Diagram alir superloop dengan dua task

Lampu Kedip Dengan Superloop

Berikut ini flowchart lampu kedip pada Arduino. Software ini berfungsi cukup baik dan dapat mudah difahami untuk karena pada system ini hanya ada 1 task saja, dan frekuensi lampu kedip tidak terlalu kritis. Secara sepintas, perioda lampu kedip adalah 2 detik , sehingga frekuensi lampu kedip adalah 0,5 Hz. Namun jika kita lihat lebih teliti, perioda akan sedikit lebih besar dari 2 detik. Perioda sebenarnya adalah 2 detik (karena delay 1000 ms) , ditambah waktu untuk menyalakan LED, dan waktu untuk mematikan LED, serta waktu untuk melakukan JUMP dari bawah setelah delay 1000 milidetik ke LED ON..

Diagram alir lampu kedip dengan superloop
Diagram alir lampu kedip dengan superloop

// https://www.arduino.cc/en/tutorial/blink

void setup() {

pinMode(LED_BUILTIN, OUTPUT);

}

void loop() {

digitalWrite(LED_BUILTIN, HIGH);

delay(1000); digitalWrite(LED_BUILTIN, LOW);   

delay(1000);

}

 

Arsitektur Superloop Dengan Interupsi / Foreground-Background

Arsitektur berikutnya adalah superloop dengan interupsi, atau dikenal juga sebagai foreground-background. Pada arsitektur ini terdapat superloop seperti pada arsitektur sebelumnya, ditambah dengan beberapa buah Task yang dijalankan dengan interupsi. Interupsi ini ditrigger oleh suatu kejadian pada hardware Pada keadaan normal tanpa interupsi, yang dijalankan hanya Loop() saja, di sini menjalankan Task 1. Jika ada Interupsi 1, maka Task 1 akan dihentikan dulu, kemudian CPU menjalankan Task 2 sampai selesai , kemudian Interupsi 1 menjalankan RETI (return from interrupt) yang mengakhiri pelaksanaan interupsi 1. setelah itu baru kemudian Loop() yang berisi Task 1 diteruskan. Demikian juga hal serupa jika terjadi Interupsi 2 dan interupsi 3. Loop () ini dikenal juga sebagai background (latar belakang), sedangkan interupsi ini diistilahkan juga dengan Foreground. Analoginya Background ini posisinya di belakang, jadi tidak kelihatan jika ada sesuatu di depannya. Foreground jika ada akan menutupi Background. Maka dari tamsilan ini arsitektur ini dikenal juga dengan nama foreground-background.

Diagram alir superloop dengan interupsi
Diagram alir superloop dengan interupsi

Contoh Superloop Dengan Interupsi Timer

Interupsi yang umum dipakai misalnya adalah interupsi timer dan interupsi eksternal. Interupsi timer dapat timbul jika ada timer yang overflow atau mencapai suatu angka tertentu. Secara praktisnya, Timer ini dapat dipakai untuk membuat sebuah Task yang aktif secara periodik. Pada Arduino Nano/UNO terdapat 3 timer hardware di mikrokontrolernya, sehingga kita dapat membuat 3 buah interupsi timer. Dari sini kita dapat membuat 3 buah LED berkedip, dengan masing-masing dikendalikan oleh 1 interupsi timer. Dengan arsitektur ini, kita dapat mempunyai task periodic sebanyak jumlah timer yang tersedia pada mikrokontroler

Diagram alir superloop dengan interupsi timer
Diagram alir superloop dengan interupsi timer

 

Lampu Kedip Dengan Interupsi

Sebagai contoh pada gambar ini adalah aplikasi untuk membuat 4 buah LED berkedip dengan frekuensi yang berbeda. LED 1, LED 2 dan LED 3 akan berkedip sesuai dengan frekuensi yang diprogramkan pada timer 0, 1 dan 2. Setting timer ini dilakukan di bagian INIT(). LED 4 berkedip sendiri di superloop, namun periodanya tidak akan seusai 100% dengan waktu delay di superloop.

 

Arsitektur Multi Thread Dengan Real Time Operating System (RTOS)

Berikut ini adalah diagram alir arsitektur dengan multithreading atau multitasking. Untuk dapat menjalankan diagram alir ini, harus menggunakan suatu Real Time Operating System seperti FreeRTOS. Pada RTOS, superloop biasanya hanya berisi inisialisasi RTOS, selain itu kosong saja. Fungsi-fungsi di dalam aplikasi dijalankan sebagai Task pada Thread ataupun sebagai interupsi. Interupsi di sini bekerja sama seperti pada arsitektur sebelumnya. Perbedaan utama di sini adalah ada bagian yang bernama Real Time Kernenl dan Thread. Real Time Kernel biasanya dijalankan secara rutin oleh salah satu interupsi Timer pada mikrokontroler. Real Time Kernel ini kemudian tugasnya adalah menjalankan Thread-thread / Task yang ada pada aplikasi tersebut. Real Time Kernel dapat menjalankan dan menghentikan setiap task secara bergantian, sehingga seakan-akan kita memiliki beberapa CPU , padahal sebenarnya hanya ada 1 buah CPU. Pada Thread 1 dan Thread 2, struktur di dalamnya ada inisialisasi, dan ada sebuah superloop di masing-masingnya.

Diagram alir multithread dengan superloop, interupsi dan thread
Diagram alir multithread dengan superloop, interupsi dan thread

Lampu Kedip dengan RTOS

Berikut ini contoh 4 buah lampu kedip dengan menggunakan FreeRTOS.

Lampu kedip dengan FreeRTOS
Lampu kedip dengan FreeRTOS

Source code ada di tautan berikut ini:  https://github.com/waskita/embedded/tree/master/atmega-blink-freertos

Detail lampu kedip tersebut dijelaskan di artikel berikut ini: Elektrologi:  Lampu kedip pada arduino/

Video Demo : https://www.youtube.com/watch?v=LV0qBlbytHE

Tinggalkan Balasan

This site uses Akismet to reduce spam. Learn how your comment data is processed.