December 5, 2021

Blogna Kang U-2 Man

STM32, Embedded System, Microcontroller, ARM Cortex-M, RTOS, FreeRTOS

Bermain-main dengan FreeRTOS (Bagian 3): LED Blink dengan RTOS

4 min read

بِسْمِ اللَّهِ الرَّحْمَنِ الرَّحِيم

Di artikel bagian ke-1 dan ke-2, telah dijelaskan secara singkat apa itu RTOS dan mengapa kita menggunakan RTOS. Sekarang kita akan mulai bagaimana membuat aplikasi menggunakan RTOS dan Insya Allah juga akan dibahas fitur-fitur RTOS seperti cara kerja scheduler, mutex, semaphore dan lain-lain berserta contoh aplikasinya.

Pada contoh pertama ini, kita akan membuat program LED Blink dengan RTOS menggunakan board STM32F407 Discovery. Board ini mempunyai 4 buah LED yang terhubung ke PD12, PD13, PD14 dan PD15. Dan program yang akan dibuat adalah menge-blink-an keempat LED tersebut dengan interval yang berbeda, karena programnya dibuat dengan RTOS, maka keempat LED tersebut akan di-blink-an oleh 4 buah task yang berbeda.

Board STM32F407 Discovery

KONFIGURASI PINOUT

Di program ini hanya akan ada inisialisai GPIO sebagai output yang terhubung ke LED dan juga penggunaan kristal eksternal 8 MHz sebagai sumber clock, di konfigurasi clock sendiri sistem clock diatur agar bekerja di frekuensi 168 MHz.

Pinout STM32F407

KONFIGURASI FREERTOS

FreeRTOS diaktifkan dengan memilih CMSIS-v1. STM32CubeMX sendiri sudah mendukung CMSIS-RTOSv1 dan CMSIS-RTOS v2. Untuk tutorial kali ini konfigurasi FreeRTOS dibiarkan menggunakan apa yang dibuat oleh STM32CubeMX (default).

Konfigurasi FreeRTOS

PEMBUATAN TASK

Task dalam aplikasi mikrokontroler pada dasarnya adalah fungsi. Sebenarnya tidak ada ketetapan baku tentang istilah ini. FreeRTOS menyebutnya sebagai task, sedangkan CMSIS-RTOS menyebutnya thread. Dan saya akan menggunakan task atau mungkin fungsi.

Nah pembuatan fungsi yang nantinya akan dijalankan sebagai task oleh RTOS bisa dilakukan dengan 2 cara: secara manual dengan mengetikan langsung di file sumber atau melalui STM32CubeMX.

Untuk membuat fungsi secara manual maka ada beberapa langkah yang harus dilakuka

Membuat variabel task handle untuk task yang bersangkutan

Variabel ini menggunakan tipe data osThreadId. Misal dalam program ini digunakan 4 buah variabel karena akan membuat 4 buah task.

Membuat prototype fungsi untuk masing-masing task

Selanjutnya adalah membuat prototype fungsi untuk masing-masing task.

Dan tentu saja, fungsinya itu sendiri. Misal untuk fungsi task LED1

Ciri utama dari sebuah fungsi dalam task RTOS adalah HARUS ada super loop dalam fungsi tersebut, seperti halnya statemen while(1) di program main. Di program digunakan statemen for(;;) yang fungsinya sama dengan while(1). Kalau tidak ada ini, artinya fungsi ada perintah kembali (return) maka kernel RTOS akan kacau dan akan menyebabkan program menjadi hang.

Dengan adanya keharusan adanya perintah for(;;) atau while(1) maka ini seolah-olah dalam RTOS akan ada banyak fungsi main, atau dengan kata lain setiap fungsi akan seolah-olah mempunyai CPU masing-masing. Sehinga efek multi-tasking akan terlihat di programnya dan juga output programnya (efek blink dari masing-masing LED).

Sedangkan pembuatan fungsi/task melalui STM32CubeMX dilakukan di tab Task and Queues. Untuk membuat task tinggal klik tombol Add.

Pembuatan task melalui STM32CubeMX

Kemudian ketika muncul jendela New Task, tinggal isi saja nama task, prioritas, ukuran stack, nama fungsinya dan seterusnya , lalu klik OK. Setelah semua task yang dibuat ditambahkan, maka STM32CubeMX akan membuat variabel task handle dan prototipe fungsi untuk semua task yang dibuat. Tetapi, isi untuk setiap task harus dibuat sendiri sesuai dengan fungsi task tersebut. STM32CubeMX hanya membuat fungsi yang memanggil fungsi osDelay.

MENJALANKAN TASK

Kernal RTOS dijalankan setelah memanggil fungsi osKernelStart(). Nah agar bisa dijalankan, semua task harus dibuat dengan fungsi osThreadCreate.

Fungsi osThreadCreate pada dasarnya adalah pemberitahuan kepada kernel RTOS bahwa akan ada task yang harus dijalankan, parameter ditunjukan oleh perintah osThreadDef yang pada dasarnya berisi definsi dari nama task, fungsi yang harus dijalankan, prioritas dan alokasi memori stack untuk task yang bersangkutan. Untuk prioritas dan memori stak, Insya Allah akan dibahas di artikel berikutnya.

Apakah task hanya bisa dibuat sebelum kernel dijalankan? Jawabanya adalah tidak, task bisa dibuat setelah kernel dijalankan. Tentu saja harus ada task yang dibuat sebelum kernal dijalankan. Task itulah yang akan membuat task ketika kernel sudah berjalan.

OK mungkin itu penjelasan singkat dari program tutorial kali ini. Silakan simak video berikut.

Soruce code dari tutorial ini bisa diunduh di link berikut.

Semoga bermanfaat

Visits: 54 Visits: 97924

Leave a Reply

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

Copyright © All rights reserved. | Newsphere by AF themes.