基本ライブラリ
デジタルIO
アナログIO
拡張IO
時間
数学
三角関数
乱数
ビットバイト操作
割り込み
シリアル通信
標準ライブラリ
Ethernet
サーボモーター
ステッピングモーター
キャラクタ液晶表示
SPI通信
I2C通信(Wire)
SD
SD(File操作)
周期処理(MsTimer2)
時計(RTC)
PPG(パルス生成)
WiFiEsp
ICS(シリアルサーボ)
FreeRTOS Tips
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を使って実装しています。