ESP32(Arduino)で擬似マルチスレッド可能な「PollingTimer」ライブラリ開発のリリースノート
はじめに
PollingTimerは、シングルスレッドで非ブロッキンなタスク処理を実現させるべく作ったライブラリです。下記リポジトリにて、MITライセンスで公開中です。下記動画のように、擬似的なマルチスレッドが実現できます。
また、マルチスレッドでは変数をvolatileやMutexなどで管理しなければならず面倒です。非ブロッキンな工夫をすればシングルスレッドで十分、というのが私の経験上の感想です。
説明
PollingTimerは、ArduinoおよびESP32用に設計されたシンプルなタイマーライブラリです。このライブラリは、ポーリングに基づくタイマー機能を提供し、擬似マルチスレッドのような操作を可能にします。割り込み処理を避けることで、状態管理を容易にします。直感的なAPIを通じて、定期的なタスクや特定の遅延後の操作を簡単にスケジュールできます。主な機能
- シンプルなインターフェース:setIntervalメソッドを使用して、コールバック関数と実行間隔を設定します。
- 柔軟なタイマー制御:タイマーを開始(fire)、停止(cancel)、および状態を確認(isFired)します。
- ループおよびワンショットタイマー:繰り返しまたは一回限りの実行を選択できます。
- デバッグサポート:デバッグモードでは、詳細なログ出力が可能です。
使い方
リポジトリから、cloneまたはzipファイルをダウンロードして、PollingTimer.hおよびPollingTimer.cppをライブラリディレクトリへ直接配置します。
プログラム内でPollingTimerをインクルードします。
cpp
#include "PollingTimer.h"
タイマーのインスタンスを作成します。
cpp
PollingTimer timer;
そしてsetup内で、setIntervalを呼び出し、コールバック関数の登録や、実行間隔(ms)、ループの有無を設定します。
cpp
timer.setInterval(yourCallbackFunction, interval, isLoop);
その後、fireでタイマーを発火させます。
cpp
timer.fire();
最後に、loopイベント内でhandler()を呼び出します。
cpp
void loop() {
timer.handler();
}
注意事項
PollingTimerはシングルスレッドで動作しているため、登録したコールバック関数内の処理中はループイベントはブロックされます。ですからコールバックイベント内では、不要なdelayなどは使わずに、早く抜けられるようにする工夫をしてください。使用例
冒頭で紹介した擬似マルチスレッドなLチカを実現すべく、PollingTimerを使った例です:
cpp
#include "PollingTimer.h"
PollingTimer timer;
void blinkLED() {
// Code to toggle LED state
}
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
timer.setInterval(blinkLED, 1000, true);
timer.fire();
}
void loop() {
timer.handler();
}
詳しくはリポジトリ内の、exampleフォルダーをご覧ください。
\他にもライブラリ作ってます/