Tutorial ESP32 Dengan ESP-IDF : #4 Multitasking dengan FreeRTOS (Bagian 1)
ESP-IDF sebagai framework native yang dirilis Espressif dalam mengembangkan software ESP32, dibangun diatas FreeRTOS. Hal tersebut berarti, programmer dapat memanfaatkan banyak benefit dengan menggunakan library FreeRTOS, misalnya adalah menjalankan program secara multitasking.
Hal tersebut mengingat bahwa ESP32 merupakan System On Chip (mikrokontroler) yang dirancang memiliki dua inti alias “dual core” Mikroprosesor Xtensa 32-bit. yaitu
- core 0 (Protocol CPU yang biasa disebut sebagai CPU 0 atau PRO_CPU)
- core 1 (Application CPU yang biasa disebut sebagai CPU 1 atau APP_CPU)
Dua inti ini secara praktek bersifat identik (sama) dan berbagi memori yang sama, sehingga memungkinkan dua inti tersebut menjalankan tugas yang sama secara bergantian.
Meskipun secara default biasanya akan digunakan Core 0. Programmer dapat memaksimal kinerja ESP32 dengan menggunakan FreeRTOS agar kedua inti tersebut dapat bekerja mengeksekusi perintah sehingga program akan berjalan lebih efektif.
FreeRTOS adalah RTOS yang dirancang untuk cukup kecil dan bisa dijalankan oleh mikrokontroler, meskipun dapat diterapkan tidak hanya pada aplikasi mikrokontroler. Kernel FreeRTOS awalnya dikembangkan oleh Richard Barry pada 2003, dan kemudian dikembangkan dan dipelihara oleh perusahaan miliknya yang bernama Real Time Engineers Ltd.
FreeRTOS pada ESP-IDF adalah versi modifikasi dari FreeRTOS yang asli, yang mendukung symmetric multiprocessing (SMP). FreeRTOS pada ESP-IDF bedasarkan porting Xtensa terhadap FreeRTOS v8.2.0
Namun meskipun begitu, beberapa fitur dari FreeRTOS v9.0.0 juga di-porting ke ISP-IDF (backport). Beberapa API itu diantaranya adalah sebagai berikut:
xTaskCreateStatic()
xQueueCreateStatic
xSemaphoreCreateBinaryStatic
xSemaphoreCreateCountingStatic
xSemaphoreCreateMutexStatic
xSemaphoreCreateRecursiveMutexStatic
xTimerCreateStatic()
xEventGroupCreateStatic()
- 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 !!
- 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 yangs sama dengan yang pernah dibahas pada pada tautan berikut
- Membuat Project #1
Project ini melanjutkan project pada artikel sebelumnya yang bernama Blink
. 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 Blink
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 Multitask
.
Agar tidak terjadi salah build, pastikan project selain Multitask
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 #1: xPortGetCoreID
Pada main.c
tambahkan 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 "sdkconfig.h"
#define BLINK_GPIO 2
void app_main()
{
gpio_pad_select_gpio(BLINK_GPIO);
/* Set the GPIO as a push/pull output */
gpio_set_direction(BLINK_GPIO, GPIO_MODE_OUTPUT);
printf("core : %u \n", xPortGetCoreID());
while(1) {
/* Blink off (output low) */
printf("Turning off the LED\n");
gpio_set_level(BLINK_GPIO, 0);
vTaskDelay(1000 / portTICK_PERIOD_MS);
/* Blink on (output high) */
printf("Turning on the LED\n");
gpio_set_level(BLINK_GPIO, 1);
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
Pada baris 2 dan 3, programmer memasukkan "freertos/FreeRTOS.h
” dan "freertos/task.h"
yang merupakan library yang dibutuhkan untuk aplikasi FreeRTOS
Perhatikan pada baris 16 dimana satu baris statement printf
disisipkan. Tujuannya adalah agar hasil dari xPortGetCoreID()
dapat dicetak di konsol. Fungsi xPortGetCoreID()
sendiri berfungsi mengidentifikasi core mana yang sedang dijalankan.
Build dan flashing program tersebut pada ESP32, lalu jalankan make monitor
Perhatikan pada konsol, core yang sedang dijalankan untuk logika tersebut adalah core 0. Selebihnya program akan berjalan sama dengan program Blinky sebagaimana telah dibahas dalam tulisan sebelumnya
Dalam artikel selanjutnya, embeddednesia akan melanjutkan eksperimen ESP-IDF dan FreeRTOS : Bagaimana Membuat Task Baru dengan FreeRTOS.
[…] Tutorial ESP32 Dengan ESP-IDF : #4 Multitasking dengan FreeRTOS (Bagian 1) […]