今回は実験
ESP32 Arduinoではいったい誰がWDTをリセットしているのか?いろいろもやもやしているので、ちょっと実験してみる。以下の様なコードを書いてみた。
試してみたいのは、タスク優先度とコアIDを変化させた場合である。task1、loop共に無限ループに入る。
無限ループの中では別のタスクをディスパッチさせるようなコードを書いていないので、優先度によってはタスクがコアを占有してしまう。※割り込みは除く
※task1内でLEDは高速に点滅するので、点きっぱなし比べれば暗く光る事になる。
(1) task1の優先度を2、コアIDを1とした場合、とくに問題無く暗く点く。
(2) task1の優先度を1、コアIDを1とした場合、更に暗くなったような気がする。
(3) task1の優先度を0、コアIDを1とした場合、点かない。
(4) task1の優先度を2、コアIDを0とした場合、LEDは点くがシリアルモニターから謎のメッセージが周期的に出力される。
![esp32_WDT_Message_002.png]()
(5) task1の優先度を1、コアIDを0とした場合、(4)と変わらず。
(6) task1の優先度を0、コアIDを0とした場合、(4)と変わらず。
(7) task1の優先度を2、コアIDを0とし、delay(1)を入れたら謎のメッセージは出なくなった。
それぞれの結果について検討してみると、
(1) の結果はtask1がコア1を占有的に使用している状態。
(2) の結果はtask1とloopTaskがラウンドロビンしている状態。
(3) の結果はtask1にCPU時間が与えられず、loopTaskがコア1を占有している状態。
(4)、(5)、(6) 謎のメッセージは「watchdogはトリガーされた。次のタスクは時間内にwatchdogをリセットできなかった - IDLE(CPU 0)」
プログラムが起動するとシリアルから起動メッセージを出すようにしているけれど、そのメッセージは出力されていないので、状況から考えるとWDTのリセットタイミングが間に合わなかったとしても、いきなりリセットされる訳ではなさそうだ。
(7) delay(1)を挿入する事で、コア0側でバックグランドで動いている謎のプログラムにもCPU時間が与えられたので、watchdogのリセット処理が行えたと言う事なのだろう。
![ITRONプログラミング入門 H8マイコンとHOSで始める組み込み開発 ITRONプログラミング入門 H8マイコンとHOSで始める組み込み開発]()
![リアルタイムOSと組み込み技術の基礎―実践μITRONプログラミング (TECHI (Vol.17)) リアルタイムOSと組み込み技術の基礎―実践μITRONプログラミング (TECHI (Vol.17))]()
ESP32 Arduinoではいったい誰がWDTをリセットしているのか?いろいろもやもやしているので、ちょっと実験してみる。以下の様なコードを書いてみた。
const int ledPin = 2; void setup() { Serial.begin( 115200 ); Serial.println( "FreRTOS Test." ); pinMode( ledPin, OUTPUT ); digitalWrite( ledPin, LOW ); /* turn off led. */ /* configure led blink task. */ xTaskCreatePinnedToCore( task1, /* task name */ "", /* task name string */ 1024, /* stack size */ NULL, /* execute parameter */ 2, /* task priority : 0 to 24. 0 is lowest priority. */ NULL, /* task handle pointer */ 0 /* core ID */ ); } void loop() { while( 1 ) {} } /* task1 */ void task1( void *execParam ) { while( 1 ) { digitalWrite( ledPin, ( digitalRead(ledPin) ) ? LOW : HIGH ); /* toggle led. */ // delay( 1 ); } }
試してみたいのは、タスク優先度とコアIDを変化させた場合である。task1、loop共に無限ループに入る。
無限ループの中では別のタスクをディスパッチさせるようなコードを書いていないので、優先度によってはタスクがコアを占有してしまう。※割り込みは除く
※task1内でLEDは高速に点滅するので、点きっぱなし比べれば暗く光る事になる。
(1) task1の優先度を2、コアIDを1とした場合、とくに問題無く暗く点く。
(2) task1の優先度を1、コアIDを1とした場合、更に暗くなったような気がする。
(3) task1の優先度を0、コアIDを1とした場合、点かない。
(4) task1の優先度を2、コアIDを0とした場合、LEDは点くがシリアルモニターから謎のメッセージが周期的に出力される。

(5) task1の優先度を1、コアIDを0とした場合、(4)と変わらず。
(6) task1の優先度を0、コアIDを0とした場合、(4)と変わらず。
(7) task1の優先度を2、コアIDを0とし、delay(1)を入れたら謎のメッセージは出なくなった。
それぞれの結果について検討してみると、
(1) の結果はtask1がコア1を占有的に使用している状態。
(2) の結果はtask1とloopTaskがラウンドロビンしている状態。
(3) の結果はtask1にCPU時間が与えられず、loopTaskがコア1を占有している状態。
(4)、(5)、(6) 謎のメッセージは「watchdogはトリガーされた。次のタスクは時間内にwatchdogをリセットできなかった - IDLE(CPU 0)」
プログラムが起動するとシリアルから起動メッセージを出すようにしているけれど、そのメッセージは出力されていないので、状況から考えるとWDTのリセットタイミングが間に合わなかったとしても、いきなりリセットされる訳ではなさそうだ。
(7) delay(1)を挿入する事で、コア0側でバックグランドで動いている謎のプログラムにもCPU時間が与えられたので、watchdogのリセット処理が行えたと言う事なのだろう。

ITRONプログラミング入門 H8マイコンとHOSで始める組み込み開発
- 出版社/メーカー: オーム社
- 発売日: 2005/04/23
- メディア: Kindle版

リアルタイムOSと組み込み技術の基礎―実践μITRONプログラミング (TECHI (Vol.17))
- 作者: 高田 広章
- 出版社/メーカー: CQ出版
- 発売日: 2004/02
- メディア: 単行本