これのラッパクラスを作成。
Arduino:定時処理のESP32版になると思う。
TimerLoopクラス
esp_timerがタスクループを使った時間管理をしていたのでこのように命名。
使い方
サンプルには入っているが簡単に。
基本的にはテンプレートクラスになっているので、このテンプレート派生で作成し、void timerAction()というメソッドを用意する。
指定時間経過したのち、void timerAction()メソッドが呼び出されるようになっている。
メソッド起動に関する指定方法はperiodic()とonce()で、前者が何度も指定時間ごとに呼び出されるもので、後者が1回のみ呼び出されるものになっている。
開始・終了で組み合わせて使うべきメソッドは次のようになっている。
- begin()⇔end()
これはtimerActionを動作させるための関数登録と解除を行っている。 - periodic()/once()⇔stop()
timerActionを呼び出す時間の設定とその取消処理になる。
1オブジェクトで1タイマーの設定になる。
esp_timerについて
今回TimerLoopを作るうえでちょっとだけesp_timerについて調べてみた。
内部の初期化処理で永久ループのタスクを作成し、LACT(LAC Timer)をベースとしたカウンター値を取り出し設定期間ごとにコールバック関数を呼び出すようにしている。
永久ループのタスクは起動コア(コア0)で、1タスク。
タスクの優先順位は(ESP_TASK_PRIO_MAX – 3)となっているようだ。
優先順位の最大は25のようなので、22とかなり高優先順位になっている。この中で行う処理は軽くするのが良いのだろう。
デフォルトで設定されている優先順位定義でタイマーより高いのはBT。
次に、ここで出ているLAC Timerに関して。
詳しい説明があまりなされていないのだが、ちょっとだけある説明やレジスタ構成から次のようなものと認識している。
まず現在ESP32に持っているタイマーモジュール(グループ)は2つある。
このモジュール1つ1つに対して、Timer 0/1とウォッチドッグタイマーが割り付けられているのはマニュアルから読み取れる。これにさらにLAC Timerが割り当てられているらしい。
実質4つのタイマーが割り付けられていることになる。
esp_timerはこのLAC Timerの値を使用することで実現をしている。
このLAC TimerはCPU起動後からカウントアップし続けているものなのだろう。
コメント