ソースに絡まるエスカルゴ

貧弱プログラマの外部記憶装置です。

【Arduino】Seeed Studio XIAO ESP32C3でマルチスレッド

 今回はArduinoの記述でSeeed Studio XIAO ESP32C3のマルチスレッドをやってみた備忘録になります。
 詳しくは参考資料に挙げているページ様を参照してください。


 では、始めます。


1:マルチスレッドの書き方
 書き方は簡単で以下のxTaskCreatePinnedToCore関数を使用します。

TaskHandle_t p_task;

xTaskCreatePinnedToCore(
  task,       // タスク関数へのポインタ(スレッドで実行させたい関数を設定)
  "taskname", // タスク名(最大16文字まで)
  2048,       // スタックサイズ(Byte)
  NULL,       // タスクのパラメータのポインタ
  1,          // タスクの優先順位(0:低 - 25:高)
  &p_task,    // タスクのHandleへのポインタ
  0           // 利用するCPUコア(0か1を指定)
);

 第1引数には別スレッドで実行させたい関数を指定します。第2引数にはタスク名を文字列で指定し、第3引数はスタックサイズを指定します。
 第4引数には第1引数へ渡すパラメータ、第5引数にはタスクの優先順位、第6引数にはタスクHandleのポインタを指定します。
 第7引数にはタスクを実行するコア番号を指定しますが、XIAO ESP32C3の場合であればシングルコアなので0を指定することになります。

 また注意点として、別スレッドで実行する関数は「delayを1以上入れる」必要があるようです。delayを入れない場合は、他の処理を行う時間がなくなってしまうために動かなくなるようなので必ずdelayを入れるようにしてください。


2:マルチスレッドのサンプル
 書き方がわかったので実際にマルチスレッドを試してみます。
 Arduino IDEを開いて以下のスケッチを作成してみてください。

・XIAO_ESP32C3_multi_thread_test.ino

#include <Arduino.h>

// メインループ用カウンタ
unsigned long _loop_count = 0;
// スレッド用カウンタ
unsigned long _thread_count = 0;

// マルチスレッド用のタスク
TaskHandle_t _p_task;

void setup() {
  Serial.begin(115200);
  delay(1000);
  Serial.println("setup start");

  // マルチスレッドでタスクを実行
  xTaskCreatePinnedToCore(
    printThread,   // タスク関数へのポインタ(スレッドで実行させたい関数を設定)
    "printThread", // タスク名(最大16文字まで)
    2048,          // スタックサイズ(Byte)
    NULL,          // タスクのパラメータのポインタ
    1,             // タスクの優先順位(0:低 - 25:高)
    &_p_task,      // タスクのHandleへのポインタ
    0              // 利用するCPUコア(0か1を指定できるがXIAO ESP32C3は1つのCPUしかないので0となる)
  );

  Serial.println("setup end");
}

void loop() {
  Serial.print("loopCount: ");
  Serial.println(_loop_count);
  _loop_count++;
	delay(1000); // 1秒待つ
}

// マルチスレッドで実行する関数
void printThread(void *param) {
  while(true) {
    Serial.print("threadCount: ");
    Serial.println(_thread_count);
    _thread_count++;
    delay(3000); // 割込時間確保のためにdelayを入れる
  }
}

 このスケッチをXIAO ESP32C3に書き込んでシリアルモニタで確認すると、以下のように1秒毎にloopCountのカウンタが表示され、3秒毎にthreadCountのカウンタが表示されます。

14:06:13.025 -> setup start
14:06:13.025 -> setup end
14:06:13.025 -> loopCount: 0
14:06:13.025 -> threadCount: 0
14:06:13.822 -> loopCount: 1
14:06:14.839 -> loopCount: 2
14:06:15.827 -> threadCount: 1
14:06:15.827 -> loopCount: 3
14:06:16.828 -> loopCount: 4
14:06:17.809 -> loopCount: 5
14:06:18.809 -> threadCount: 2
14:06:18.809 -> loopCount: 6
14:06:19.814 -> loopCount: 7
14:06:20.814 -> loopCount: 8
14:06:21.794 -> threadCount: 3
14:06:21.838 -> loopCount: 9


 以上がArduinoにおけるSeeed Studio XIAO ESP32C3でマルチスレッドを使う方法になります。

 マイコンでもマルチスレッドが使えると何かと便利だと思うので、覚えておいて損はないかと思います。


・参考資料