Advertisement

Tutorial ESP32 Dengan ESP-IDF : #5 Multitasking dengan FreeRTOS (Bagian 2)

0 2,504

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.

  • 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

 

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

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

Adverstiment

  • 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 Multitask2sebaiknya 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 );
}

 

Adverstiment

  • 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, maka usStackDepth 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 bit portPRIVILEGE_BIT dari parameter prioritas. Misalnya untuk membuat task ber-privilege dengan prioritas 2, parameter uxPriority harus diset menjadi  ( 2 | portPRIVILEGE_BIT ).
  • pvCreatedTask:  Digunakan untuk mengembalikan penanganan task yang dapat untuk direferensikan

- Advertisement -

  • 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)

Baca juga tulisan lain pada seri #Tutorial ESP32 dengan ESP-IDF atau tulisan menarik lainnya di kategori ESP32

Tinggalkan Balasan

Situs ini menggunakan Akismet untuk mengurangi spam. Pelajari bagaimana data komentar Anda diproses.