ESP32で別タスクに通知を送信する

最新情報はM5StickC非公式日本語リファレンスを参考にしてください。

タスク周りを調べた結果のアウトプットです。別タスクへはキューと通知がありますが、データを渡さない場合には、通知が簡単に利用できそうです。

概要

別タスクへのデータ受け渡しは、通知とキューが利用できます。通知は通信などの受信タスクに受信を通知するなどで内部利用されています。渡せるデータは少ないので実際にデータを受け渡すのではなく、その通知をトリガーに処理を再開させるなどの用途に使います。

送信タスクなどに送信データを受け渡す場合には、キューを利用したほうが適しています。

サンプルスケッチ

TaskHandle_t taskHandle;
void testTask(void *pvParameters) {
  uint32_t ulNotifiedValue;
  while (1) {
    // 通知が来るまで待機する。値のクリアはしない
    xTaskNotifyWait( 0,
                     0,
                     &ulNotifiedValue,
                     portMAX_DELAY );
    Serial.println( pcTaskGetTaskName(NULL) );
    Serial.println( ulNotifiedValue );
  }
}
void setup() {
  Serial.begin(115200);
  // Core0でタスク起動
  xTaskCreatePinnedToCore(
    testTask,
    "loopTask1",
    8192,
    NULL,
    1,
    &taskHandle,
    0
  );
}
void loop() {
  delay(500);
  // 通知送信(値は0から増えていき、100の値は無視される)
  xTaskNotify(taskHandle, 100, eIncrement );
}

xTaskNotifyWait()で通知を受信します。portMAX_DELAYを指定することで、通知が来るまでタイムアウト無しで待機します。実際にはタイムアウト処理をいれることが推奨されています。

上記のように数値を送信することができますが、何個の通知が溜まっているかぐらいの確認しかできませんので、数値に依存しない実装のほうが好ましいと思います。

数値を使わないのであればulTaskNotifyTake()の方がスッキリします。

    // 通知が来るまで待機する。値のクリアはしないので通知が受け取れている限り1のまま
    int ulNotifiedValue = ulTaskNotifyTake( pdFALSE, portMAX_DELAY );

まとめ

受信待ちや、外部からのトリガー入力を待っている場合には通知は有効だと思います。反面送信待ちなどについてはキューを利用したほうが楽に実装が可能です。

コメント