Tutorial ESP32 Dengan ESP-IDF : #5 Multitasking dengan FreeRTOS (Bagian 2)
Sebagaimana telah diulas pada bagian 1, FreeRTOS pada ESP32 memungkinkan programmer dapat membuat beberapa “logika pemrograman” yang dapat berjalan paralel dan independen. Dalam terminologi RTOS “logika pemrograman” ini disebut sebagai Task
.
Dalam artikel kali ini, embeddednesia akan menunjukan bagaimana membuat Task
baru yang dapat berjalan secara paralel di dalam program.
- Prasyarat Materi
Pembaca diasumsikan telah membaca artikel sebelumnya di seri Tutorial ESP32 dengan ESP-IDF.
- Tutorial ESP32 dengan ESP-IDF: #1 Mempersiapkan Environment
- Tutorial ESP32 dengan ESP-IDF : #2 Membuat Program “Hello World”
- Tutorial ESP32 dengan ESP-IDF : #3 Blinky !!
- Tutorial ESP32 Dengan ESP-IDF : #4 Multitasking dengan FreeRTOS (Bagian 1)
- Prasyarat Perangkat Keras
Development Board yang kompatibel dengan artikel kali ini dan dapat dibeli di TOKO BEY. Salah satu jenisnya adalah ESP32S DevKit DOIT dengan kaki – kaki pin berjumlah 38 seperti berikut
Development board lainnya, yang sedikit berbeda namun memiliki diagram pin yang sama adalah sebagai berikut
Pembaca dapat membeli modul ESP32 melalui TOKO BEY dengan mengakses halaman pembelian di tautan berikut. Jika pembaca merasa tulisan ini bermanfaat, pembaca dapat berterimakasih dengan membeli produk di TOKO BEY
- Prasyarat Perangkat Lunak
Sebagaimana tutorial sebelumnya, kali ini embeddednesia menggunakan environment perangkat lunak yang sama dengan yang pernah dibahas pada pada tautan berikut
- Membuat Project #2
Project ini melanjutkan project pada artikel sebelumnya yang bernama MultiTask
. Programmer dapat membuat project baru dari scratch. dengan meng-clone ESP-IDF Template
dan mengatur konfigurasinya seperti yang pernah dibahas pada saat membuat program Hello World yang lalu.
Cara lain yang lebih cepat adalah, membuat project baru dari project Multitask di tulisan sebelumnya. Tinggal copy paste saja project tersebut dengan klik kanan pada direktori project, lalu pilih copy dan paste di Panel Project Explorer. Beri nama project tersebut, misalnya Multitask2
.
Agar tidak terjadi salah build, pastikan project selain Multitask2
sebaiknya dalam kondisi close. Caranya klik kanan direktori project yang ingin di-close, lalu pilih Close Project. Jika suatu saat programmer ingin membuka lagi tinggal klik kanan lalu Open Project
- Eksperimen #2 Multitasking 1
Pada main.c
ubah code-nya menjadi sebagai berikut
#include <stdio.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "esp_system.h" #include "driver/gpio.h" #include "nvs_flash.h" #define BLINK_GPIO 2 void blinky(void *pvParameter) { gpio_pad_select_gpio(BLINK_GPIO); gpio_set_direction(BLINK_GPIO, GPIO_MODE_OUTPUT); while(1) { gpio_set_level(BLINK_GPIO, 0); vTaskDelay(1000 / portTICK_RATE_MS); gpio_set_level(BLINK_GPIO, 1); vTaskDelay(1000 / portTICK_RATE_MS); } } void hello_task(void *pvParameter){ printf("core hello %u \n",xPortGetCoreID()); unsigned int i=0; while(1){ printf("Hello world! %u \n", i); vTaskDelay(100 / portTICK_RATE_MS); i++; } } void app_main(){ nvs_flash_init(); xTaskCreate(&hello_task, "hello_task", 2048, NULL, 5, NULL); xTaskCreate(&blinky, "blinky", 512,NULL,5,NULL ); }
- Penjelasan Program
Program tersebut sebenarnya adalah gabungan program dari program HelloWord
dengan Blinky
yang pernah dibahas di sesi tutorial sebelumnya. masing – masing program tersebut dibuatkan fungsinya tersendiri :
- fungsi
void blinky(void *pvParameter)
: Menyalakan led internal di GPIO2 berkedip – kedip di rentang dengan periode 2 detik (1 detik menyala, 1 detik mati) - fungsi
void hello_task(void *pvParameter)
: Memberikan keluaran string Hello world berulang – ulang ke ke komunikasi serial dengan rentang waktu 100 mili detik.
Perhatikan, pada baris baris 6, terdapat tambahan #include nvs_flash.h
merupakan header untuk library dari non-volatile storage
(NVS) yang dirancang untuk menyimpan pasangan key – value di dalam flash. Sedangkan pada baris 37, nvs_flash_init()
menginisialisasi memori non-volatile di memori flash, sehingga dapat digunakan untuk menjalankan task
secara paralel.
xTaskCreate
yang digunakan pada baris 38 dan 39 digunakan untuk membuat task baru tanpa menentukan core mana yang digunakan. Berikut adalah argumen yang digunakan
pvTaskCode
: Pointer ke fungsi task. fungsi task yang diimplementasikan haruslah tidak pernah mengalami return (loop tak terhingga)pcName
: Nama deskritif dari task yang akan dibuat.Digunakan terutama untuk memudahkan proses debugging. Nama task yang didefinisikan tidak boleh lebih dari 16 karakter.usStackDepth
: Ukuran dari stack task yang ditentukan sebagai jumlah variabel yang stack dapat simpan. Misalnya, jika stack memiliki lebar 16 bit, makausStackDepth
ditetapkan sebagai 100, sehingga 200 bytes akan dialokasikan ke penyimpanan stack.pvParameters
: Pointer yang digunakan sebagai parameter dari task yang akan dibuat.uxPriority
: Prioritas task yang akan dijalankan. Sistem yang menggunakan dukungan MPU (microprocessing unit) dapat secara opsional membuat task dengan mode privilege dengan mengatur bitportPRIVILEGE_BIT
dari parameter prioritas. Misalnya untuk membuat task ber-privilege dengan prioritas 2, parameteruxPriority
harus diset menjadi( 2 | portPRIVILEGE_BIT )
.pvCreatedTask
: Digunakan untuk mengembalikan penanganan task yang dapat untuk direferensikan
- Running
Ketika program selesei di-build, dan di-flash, jalankan mingw32.exe lalu ketikkan make monitor
. Jika tidak ada masalah, maka led built-in akan berkedip – kedip dengan frekuensi yang berbeda dengan data serial yang dikirim.
Sampai sini, dua task telah berhasil dibuat berjalan secara paralel. Meskipun sebenarnya program tidak benar – benar berjalan paralel secara fisik. Program ESP32 berjalan demikian cepatnya, sehingga seakan – akan, kedua task berjalan paralel.
Setiap Task memiliki waktu idle (yang dilakukan dengan vTaskDelay()
) sehingga memberikan cukup untuk program dapat menjalankan task lainnya.
Pada tulisan selanjutnya, embeddednesia akan membahas mengenai bagaimana membuat task benar – benar berjalan secara paralel (membuat task berjalan di core yang berbeda)