FreeRTOS Tips

GR-ROSEはFreeRTOS上で動いています。setupやloopはmain関数からコールされていますが、このmain関数もタスクの一つです。

FreeRTOSによってマルチタスク化ができます。これまでloopの処理が長くて複雑になってしまった処理も、タスクとして切り出すことでシンプルにできます。プログラミングもタスク単位で分担して開発することもできます。

各TipsではFreeRTOSのコンフィギュレーションや使用例を紹介します。FreeRTOSの仕様についてはリファレンスマニュアルを参照してください。

FreeRTOSは、FreeRTOSConfig.hというヘッダファイルで様々な設定を行います。ここでは基本的な設定について、以下のサンプルを例に少し説明します。


#include <Arduino.h>

void loop2(void *pvParameters);
static const char *pcText = "loop2 is running";
 
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  delay(3000);
   
  uint32_t size1 = xPortGetFreeHeapSize();
  Serial.print("Heap Size 1: ");
  Serial.println(size1);
 
  xTaskCreate(loop2, "LOOP2", 512, (void*)pcText, 2, NULL);
   
  uint32_t size2 = xPortGetFreeHeapSize();
  Serial.print("Heap Size 2: ");
  Serial.println(size2);
  Serial.print("Consumption: ");
  Serial.println(size1 - size2);
}
 
void loop() {
  // put your main code here, to run repeatedly:
  Serial.println("loop is running");
  vTaskDelay(pdMS_TO_TICKS( 1000 )); // into "Block State" for 1000ms
 
}
 
void loop2(void *pvParameters) {
  while (1) {
    Serial.println((char*)pvParameters);
    delay(2000); // delay uses vTaskDelay to be into "Block State".
  }
}

11行目にあるxPortGetFreeHeapSize()で、FreeRTOS用に確保されたHEAPメモリのサイズを取得することができます。FreeRTOSではタスクやキューの生成時、HEAPメモリを使用します。GR-ROSEのSDKでは128KiBをHEAPメモリとして確保しています。FreeRTOSConfig.hの中にあるconfigTOTAL_HEAP_SIZEによって設定変更できます。

27行目にあるvTaskDelay(pdMS_TO_TICKS(1000))は1000msを待つ処理です。vTaskDelayはTicks数の分だけ待つという処理ですが、pdMS_TO_TICKS(1000)を実行することで、1000ms分のTicks数を取得しています。GR-ROSEのSDKでは1Ticksは1msのため、vTaskDelay(1000)と直値を指定しても1000ms待つ処理になります。なお、delay関数はこのvTaskDelayを使って実装しています。