Multitasking di Arduino menggunakan Library FREERTOS

Multitasking pada dasarnya adalah sebuah beberapa proses komputasi (atau sering disebut ‘Task’) yang harus dijalankan oleh CPU (Central Processing Unit) secara ‘bersamaan’. Kata ‘bersamaan’ saya kasih tanda petik karena pada dasarnya semua proses komputasi tidak akan ada yang bisa bersamaan (kecuali CPU nya lebih dari satu, masing-masing CPU handle satu proses). Kata ‘bersamaan’ ini merujuk pada proses komputasi yang dilakukan hampir bersamaan namun dalam rentang waktu bersamaan (dalam orde mili/nano/pico second tergantung kecepatan clock CPU) sehingga seakan-akan ‘bersamaan’. Nah, terminologi ‘multitasking’ sebenarnya hanya ada di CPU atau yang hardware yang dikategorikan ‘processor’. Kalau hardware yang masuk kategori ‘kontroller’ atau bahkan ‘mikrokontroller’ (contoh arduino. ESP8266, Teensy, dll), multitasking ini belum bisa dilakukan, setidaknya untuk saat ini . Namun demikian, ada sedikit ‘pendekatan’ yang bisa kita lakukan sehingga seakan-akan multitasking dapat dilakukan di sebuah mikrokontroller

Sekilas RTOS (Real Time Operating System)

Pada kesempatan kali ini kita akan membahas tentang RTOS atau Real Time Operating System. Secara sederhana, RTOS ini akan sangat berguna ketika temen-temen ingin mengerjakan proyek yang mempunyai banyak task (tugas) dan ingin dijalankan dalam waktu yang hampir bersamaan.

Perbedaan konsep yang digunakan antara proyek arduino dengan RTOS dan tanpa RTOS dapat dilihat pada Gambar di bawah ini.

Jika tanpa RTOS, Arduino akan mengeksekusi perintah secara sekuensial dengan konsep Super Loop, berurut dari Task 1, Task 2, kemudian Task 3. Sehingga jika terdapat delay tiap Task, akan menyebabkan Task 3 (dalam hal ini task terakhir) akan lama dieksekusi. Berbeda jika kita menerapkan RTOS pada program Arduino kita, kita dapat mengeksekusi ketiga Task dalam waktu yang hampir bersamaan. Selain itu, kita dapat mengatur urutan eksekusi program dengan hanya mengatur tingkat prioritas dari tiap Task.

Cara Install Library FREERTOS di Arduino

Sebelum menuju ke materi ini, kita perlu menginstal library FREERTOS terlebih dahulu. Berikut step-stepnya.

  1. Klik Tools → Manage Libraries

2. Ketik pada kolom search : FreeRTOS → pilih yang dibuat oleh Richard Barry → klik Install

3. Pastikan setelah selesai install, terdapat tulisan “Installed” seperti gambar di bawah.

4. Untuk beberapa contoh program yang bisa dijalankan, temen-temen bisa cek seperti gambar di bawah ini.

Contoh Code Sederhana untuk Implementasi RTOS pada Arduino

Berikut merupakan contoh code sederhana untuk menjalankan 3 tugas sekaligus dengan tingkat prioritas yang berbeda

#include <Arduino_FreeRTOS.h>

// 1. Print ke serial monitor dengan 3 task (tugas)

void Task_Print1(void *param);
void Task_Print2(void *param);
void Task_Print3(void *param);

TaskHandle_t Task_Handle1;
TaskHandle_t Task_Handle2;
TaskHandle_t Task_Handle3;


void setup() {
  //Letakkan setup code disini, untuk dijalankan sekali saja.
  Serial.begin(9600);
  //Semakin tinggi prioritas, task tersebut akan dijalankan duluan.
  //Misal diinginkan mengerjakan task dengan urutan seperti berikut:
  //  Task3 -> Task2 -> Task1
  //  atau
  //  Task Baca Sensor MPU -> Task Baca Potensiometer -> Task LED Blink
  //maka, prioritasnya bisa diatur seperti program di bawah ini.
  xTaskCreate(Task_Print1,"Task1",100,NULL,1,&amp;Task_Handle1);
  xTaskCreate(Task_Print2,"Task2",100,NULL,2,&amp;Task_Handle2);
  xTaskCreate(Task_Print3,"Task3",100,NULL,3,&amp;Task_Handle3);
}

void loop() {
  //Jangan letakkan code apapun di bawah sini
}

void Task_Print1(void *param)
{
  (void) param;

  while(1) // or for(;;)
  {
    //Letakkan code disini
    Serial.println("Task LED Blink");
    vTaskDelay(1000/portTICK_PERIOD_MS); // Arduino akan melakukan print ke serial monitor tiap 1 detik sekali
  }
}

void Task_Print2(void *param)
{
  (void) param;

  while(1)
  {
    //Letakkan code disini
    Serial.println("Task Baca Potensiometer");
    vTaskDelay(1000/portTICK_PERIOD_MS); // Arduino akan melakukan print ke serial monitor tiap 1 detik sekali
  }
}

void Task_Print3(void *param)
{
  (void) param;

  while(1)
  {
    //Letakkan code disini
    Serial.println("Task Baca Sensor MPU");
    vTaskDelay(1000/portTICK_PERIOD_MS); // Arduino akan melakukan print ke serial monitor tiap 1 detik sekali
  }
}

Tampilan Output Program:

Penjelasan Singkat dari Program RTOS di atas

Program di atas merupakan program untuk menjalankan 3 task (tugas) secara bersamaan, dimana

  • Task 1 (Task LED Blink)
  • Task 2 (Task Baca Potensiometer)
  • Task 3 (Task Baca Sensor MPU).

Program akan dibuat agar dapat menjalankan Task-task tersebut dengan urutan :
Task 3 (Baca Sensor MPU) → Task 2 (Task Baca Potensiometer) → Task 3 (Task LED Blink).

Sehingga pada program, kita perlu mengatur priority (prioritas) tiap task seperti program di bawah ini.

NOTE: Semakin tinggi priority (prioritas), maka semakin duluan task tersebut dijalankan.

Demikian tutorial mengenai multitasking di Arduino menggunakan pustaka RTOS, semoga dapat bermanfaat buat Anda. Salam ngoprek 🙂

Add a Comment

Your email address will not be published. Required fields are marked *