久しぶりに、M5Stack製マイコン(M5StickS3)用のスケッチで「ウォッチドッグタイマー」を使用しようとしたところ、以前から使っていた書き方(こちら)では、以下の行でコンパイルエラーが発生してしまいました。
リンク
esp_task_wdt_init(30, true);
ChatGPTに聞いたところ、Arduino IDEの「M5Stack用ボード設定」が「2.x系」のときには、「esp_task_wdt_init」コマンドは、上記のように引数で時間を渡すかたちだったものが、「3.x系」では、以下のように「esp_task_wdt_config_t」構造体を渡す方式に変わったそうです。
esp_task_wdt_config_t config = {
.timeout_ms = 30000,
.idle_core_mask = 0,
.trigger_panic = true
};
esp_task_wdt_init(&config);
そのため、ウォッチドッグタイマーの設定にこの方式をつかった以下のスケッチをつくって動作確認しました。
#include <M5Unified.h>
#include <esp_task_wdt.h>
void setup() {
esp_task_wdt_config_t config = {
.timeout_ms = 30000, // 30秒
.idle_core_mask = 0,
.trigger_panic = true
};
esp_task_wdt_init(&config);
esp_task_wdt_add(NULL);
auto cfg = M5.config();
M5.begin(cfg);
M5.Display.setRotation(1);
M5.Display.setTextColor(TFT_WHITE);
M5.Display.setTextFont(&fonts::Font4);
M5.Display.fillScreen(TFT_BLACK);
}
int i = 0;
void loop() {
M5.Display.clear();
M5.Display.setCursor(0, 0);
M5.Display.printf("count: %d\n", i++);
delay(1000);
}
すると、コンパイル自体は問題なくできたのですが、実際に動かしてみると、タイムアウトの設定時間に関わらず、5秒程度で再起動を繰り返すようになってしまいました。
引き続きChatGPTに質問すると、今度は「M5Stack用ボード設定 3.x系」では、この「esp_task_wdt_init(&config);」に相当する初期設定が内部で実施されており、それとユーザが設定した内容が競合することでおかしな振る舞いをしてしまうのではないか?との回答でした。
対策としては、「esp_task_wdt_init()」ではなく、設定を変更するための「esp_task_wdt_reconfigure()」を使えばよいとのことです。
スケッチを以下のように変更しました。
#include <M5Unified.h>
#include <esp_task_wdt.h>
void setup() {
esp_task_wdt_config_t config = {
.timeout_ms = 30000, // 30秒
.idle_core_mask = 0,
.trigger_panic = true
};
esp_task_wdt_reconfigure(&config);
esp_task_wdt_add(NULL);
auto cfg = M5.config();
M5.begin(cfg);
M5.Display.setRotation(1);
M5.Display.setTextColor(TFT_WHITE);
M5.Display.setTextFont(&fonts::Font4);
M5.Display.fillScreen(TFT_BLACK);
}
int i = 0;
void loop() {
M5.Display.clear();
M5.Display.setCursor(0, 0);
M5.Display.printf("count: %d\n", i++);
delay(1000);
}
これで問題なく、設定した時間(30秒)で再起動するようになりました。