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:
- Super loop (tanpa interupsi)
- Super loop dengan interupsi / foreground-background
- Multithreading
Daftar Isi
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.
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.
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.
// 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.
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..
// 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.
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
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.
Lampu Kedip dengan RTOS
Berikut ini contoh 4 buah lampu kedip dengan menggunakan 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