M5StickC非公式日本語リファレンスで項目を書くためにesp32-halの項目を調べました。
サンプルコード
void loopTest(void *pvParameters) { while (1) { Serial.print( xPortGetCoreID() ); // 動作確認用出力 vPortYield(); // vPortYield()ではウォッチドッグに影響しない yield(); // yield()ではウォッチドッグに影響しない delay(0); // 1以上にするとウォッチドッグのリセットがなくなる delayMicroseconds(1000000); // delayMicroseconds()はウォッチドッグとは関係ない } } void setup() { Serial.begin(115200); // Core0でタスク起動 xTaskCreateUniversal( loopTest, "loopTest0", 8192, NULL, 1, NULL, 0 ); // Core1でタスク起動 xTaskCreateUniversal( loopTest, "loopTest1", 8192, NULL, 1, NULL, 1 ); // ウォッチドッグ停止 //disableCore0WDT(); //disableCore1WDT(); // 起動直後は有効化されていないのでエラーがでる // ウォッチドッグ起動 //enableCore0WDT(); //enableCore1WDT(); } void loop() { }
解説
他サイトのサンプルですとxTaskCreatePinnedToCore()かxTaskCreate()を使っているケースばかりでした。
ESP32の1.0.2からxTaskCreateUniversal()が増えたようでして、内部でxTaskCreatePinnedToCore()かxTaskCreate()を呼び出しています。
xTaskCreate()はシングルコア用の古い関数で、無効なcore番号を指定すると内部で呼び出されてCore0でタスクが起動していました。
通常はCore1でloop()などが実行されており、ウォッチドッグ は無効です。Core0はウォッチドッグが有効化されており、長時間ブロックしているとハングアップしたとみなされ、リセットが入ります。
リセットを回避する方法はdisableCore0WDT()でウォッチドッグを無効化するか、処理の中で定期的にdelay(1)を呼び出すかが必要です。delay(0)とかyield()では回避できませんでした。
まとめ
リファレンスで関数群が大体網羅できたかと思っていましたが、xTaskとかvPort系の関数が抜けていました。どんどん対象が広がっていきます、、、
コメント