3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【FreeRTOS × ESP32 】EventGroupとは?複数条件の待ち合わせができる仕組み

Posted at

この記事でわかること

  • EventGroup(イベントグループ)の機能内容(何ができるか)
  • 使うメリット(どんな時に効くか)
  • 最小構成のサンプル(ESP32 Arduinoで動く)

1. EventGroupの機能内容(何ができる?)

EventGroupは、複数のフラグ(ビット)を1つにまとめて管理し、
タスク同士で「条件が揃うまで待つ」を実現する仕組みです。

ざっくり言うと、

  • 条件が成立したらビットを立てる
  • 必要なビットが揃うまで待つ(AND待ち / OR待ち)

ができます。

例:

  • Wi-Fi 接続完了
  • センサー初期化完了

この 2つが揃ったら送信開始、みたいな待ち合わせが簡単になります。

2. EventGroupを使うメリット(何が嬉しい?)

メリット1:複数条件待ちがスッキリ書ける

「Wi-FiもOK」「センサーもOK」みたいな条件が増えると、
グローバル変数のフラグ監視(ポーリング)は見通しが悪くなりがちです。

EventGroupなら 待つ条件をビットでまとめて表現できます。

メリット2:待っている間はCPUを使わない

ポーリングだと「まだかな?」を定期チェックする必要がありますが、
EventGroupなら **条件が揃うまでタスクをブロック(待機)**できます。

3. 軽い実装:2条件が揃うまで待つ(ESP32 Arduino)

やること

  • TaskA:Wi-Fi準備完了(を想定して)ビットを立てる
  • TaskB:センサー準備完了(を想定して)ビットを立てる
  • TaskC:2つのビットが揃うまで待つ → 揃ったら処理する
#include <Arduino.h>

static EventGroupHandle_t eg;

// どのビットが何を意味するかは「設計で決める」
#define WIFI_READY_BIT   (1 << 0)
#define SENSOR_READY_BIT (1 << 1)

void WifiTask(void *pvParameters) {
  vTaskDelay(pdMS_TO_TICKS(3000)); // 3秒後にWi-Fi接続できた想定
  xEventGroupSetBits(eg, WIFI_READY_BIT); // ビットをたててWi-Fi接続完了を知らせる
  for(;;) vTaskDelay(pdMS_TO_TICKS(1000));
}

void SensorTask(void *pvParameters) {
  vTaskDelay(pdMS_TO_TICKS(1000)); // 1秒後にセンサー準備できた想定
  xEventGroupSetBits(eg, SENSOR_READY_BIT); // ビットをたててセンサー準備完了を知らせる
  for(;;) vTaskDelay(pdMS_TO_TICKS(1000));
}

void MainTask(void *pvParameters) {
  for(;;) {
    // Wi-Fi と Sensor の両方が揃うまで待つ(AND待ち)
    xEventGroupWaitBits(
      eg,
      WIFI_READY_BIT | SENSOR_READY_BIT, // 待つ条件(ビットの組み合わせ:ここでは0b0011)
      pdFALSE,                            // 成立してもビットは消さない(状態として扱う)
      pdTRUE,                             // 全ビットが揃うまで待つ(AND)
      portMAX_DELAY                       // 無期限待ち
    );

    Serial.println("[Main] Wi-Fi & Sensor OK -> Start!");
    vTaskDelay(pdMS_TO_TICKS(1000));
  }
}

void setup() {
  Serial.begin(115200);

  eg = xEventGroupCreate();

  xTaskCreate(WifiTask, "WifiTask", 2048, NULL, 1, NULL);
  xTaskCreate(SensorTask, "SensorTask", 2048, NULL, 1, NULL);
  xTaskCreate(MainTask, "MainTask", 2048, NULL, 1, NULL);
}

void loop() {
  vTaskDelay(portMAX_DELAY);
}

4. 使いどころのイメージ

  • 「Wi-Fi接続完了」+「MQTT接続完了」→ 送信開始

  • 「初期化完了」+「SDカードOK」→ ログ開始

  • 「センサー準備完了」+「キャリブレーション完了」→ 計測開始

5. まとめ

  • EventGroupは ビット(フラグ)を束ねて タスク間で待ち合わせできる仕組み

  • **複数条件待ち(AND/OR)**が簡単になる

  • ポーリングせずに 条件が揃うまで待機できる

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?