Pada artikel sebelumnya kita telah membahas bagaimana membuat aplikasi sederhana menggunakan FreeRTOS. Di artikel tersebut juga sudah dijelaskan bagaimana membuat task baik melalui source code maupun melalui STM32CubeMX. Nah dalam artikel kali ini kita akan membahas konfigurtasi FreeRTOS agar bekerja sesuai dengan yang diharapkan.

CMSIS-RTOS

Ketika kita mengaktifkan FreeRTOS di CubeMX, maka akan diberikan pilihan untuk interface,CMSIS-V1 atau CMSIS-V2. CMSIS atau Common Microcontroller Software Interface Standard merupakan lapisan abstraksi (abstraction layer) untuk sofware yang digunakan oleh prosesor ARM Cortex yang tidak tergantung oleh vendor pembuat mikrokontroler berbasis ARM Cortex. CMSIS ini dibuat oleh ARM, dan menyediakan antarmuka software yang memudahkan untuk mengembangkan aplikasi mikrokontroler.

CMSIS ini menyediakan antarmuka untuk prosesor dan periperal, RTOS,dan komponen middleware lain. CMSIS menyediakan package seperti Driver, DSP (Digital Signal Processing), NN (Neural Network),RTOS dan lain-lain. Keterangan lebih lanjut tentang CMSIS bisa dilihat di halaman CMSIS ini.

CMSIS

CMSIS-V1 dan CMSIS-V2 dalam CubeMX merujuk kepada CMSIS-RTOS v1 dan CMSIS-RTOS v2. Oleh karena CMSIS itu merupakan lapisan abtraksi, maka CMSIS-RTOS akan menyediakan API (Application Programming Interface) untuk dihubungkan dengan pustaka RTOS yang digunakan, misal FreeRTOS, ┬ÁC OS atau yang lainnya. Jadi ketika program memanggil fungsi CMSIS untuk membuat sebuah task misalnya, maka CMSIS-RTOS akan memanggil fungsi untuk membuat task yang digunakan oleh pustaka RTOS yang digunakan.

Struktur API CMSIS-RTOS

Berikut contoh fungsi osThreadCreate dari CMSIS yang memanggil fungsi xTaskCreate dari FreeRTOS

/*********************** Thread Management *****************************/
/**
* @brief  Create a thread and add it to Active Threads and set it to state READY.
* @param  thread_def    thread definition referenced with \ref osThread.
* @param  argument      pointer that is passed to the thread function as start argument.
* @retval thread ID for reference by other functions or NULL in case of error.
* @note   MUST REMAIN UNCHANGED: \b osThreadCreate shall be consistent in every CMSIS-RTOS.
*/
osThreadId osThreadCreate (const osThreadDef_t *thread_def, void *argument)
{
  TaskHandle_t handle;
  
#if( configSUPPORT_STATIC_ALLOCATION == 1 ) &&  ( configSUPPORT_DYNAMIC_ALLOCATION == 1 )
  if((thread_def->buffer != NULL) && (thread_def->controlblock != NULL)) {
    handle = xTaskCreateStatic((TaskFunction_t)thread_def->pthread,(const portCHAR *)thread_def->name,
              thread_def->stacksize, argument, makeFreeRtosPriority(thread_def->tpriority),
              thread_def->buffer, thread_def->controlblock);
  }
  else {
    if (xTaskCreate((TaskFunction_t)thread_def->pthread,(const portCHAR *)thread_def->name,
              thread_def->stacksize, argument, makeFreeRtosPriority(thread_def->tpriority),
              &handle) != pdPASS)  {
      return NULL;
    } 
  }
#elif( configSUPPORT_STATIC_ALLOCATION == 1 )

    handle = xTaskCreateStatic((TaskFunction_t)thread_def->pthread,(const portCHAR *)thread_def->name,
              thread_def->stacksize, argument, makeFreeRtosPriority(thread_def->tpriority),
              thread_def->buffer, thread_def->controlblock);
#else
  if (xTaskCreate((TaskFunction_t)thread_def->pthread,(const portCHAR *)thread_def->name,
                   thread_def->stacksize, argument, makeFreeRtosPriority(thread_def->tpriority),
                   &handle) != pdPASS)  {
    return NULL;
  }     
#endif
  
  return handle;
}

Keterangan lebih lengkap mengenai CMSIS-RTOS v1 dan CMSIS-RTOS v2.

KONFIGURASI FREERTOS

Ada banyak item konfigurasi di FreeRTOS yang semuanya bisa dikonfigurasi melalui CubeMX dan akan disimpan di sebuah file header (FreeRTOSConfig.h). Saat pembuatan proyek menggunakan FreeRTOS, saya biasnya hanya akan mengedit di bagian Memory Management, karena sampai sekarang masih menggunakan alokasi memori di Dynamic, maka saya harus memasukan TOTAL_HEAP_SIZE, Insya Allah akan dibahas di artikel selanjutnya saat pembahasan Manajemen Memori.Konfigurasi lain, biasanya mengikuti default dari CubeMX.

TICK_RATE_HZ menentukan berapa frekuensi kernel FreeRTOS akan melakukan context switch, TICK_RATE_HZ akan mengatur interupsi timer yang digunakan, di ARM Cortex-M biasanya digunakan timer SysTick. Sebagai contoh ketika TICK_RATE_HZ di-set di 1000 (1kHz), maka timer Systick akan diatur untuk melakukan interupsi setiap 1 mdetik, yang artinya kernel akan melakukan context switch setiap 1mdetik. Bisakan TICK_RATE_HZ di-set nilai lebih tinggi, misal di 1 mikro detik (1MHz) sehingga diperoleh akurasi lebih tinggi di pewaktuan? Bisa saja, tapi tentu saja hal ini akan menyebabkan CPU bekerja lebih sering, sehingga mungkin menjadi tidak efisien. Tapi tentu saja kalau prosesor yang digunakan mempunyai frekuensi clock yang tinggi hal ini tidak akan menjadi masalah.

Untuk keterangan lebih jelas tentang konfigurasi FreeRTOS, bisa dilihat di link ini.

Konfigurasi FreeRTOS
Konfigurasi FreeRTOS

Semoga bermanfaat.

Silakan dibaca juga seri tutorial FreeRTOS yang lainnya

Bermain-main dengan FreeRTOS (Bagian 1): Apa Itu RTOS?
Bermain-main dengan FreeRTOS (Bagian 2): Mengapa Menggunakan RTOS?
Bermain-main dengan FreeRTOS (Bagian 3): LED Blink dengan RTOS

Leave a Reply

Your email address will not be published.