Arduino core for the ESP32 core panic [ESP32]
本当はこの記事では「ESP32 Arduinoはユーザーが排他制御をあまり意識しなくても使えますよ~、楽ですよ~」ってするつもりだったんです。それがですねぇ、この結末、、、
はじまりはESP32 ArduinoでI2Cに関する検索をしていたらツイッターに、「ESP32 Arduinoは排他制御が入っているのでこの結果はおかしい」的なのを見付けて、「ええ!そうなんですか?」ってソースコード(esp32-hal-i2c.c)を見てみました。
あ、有るのう、、、
ちなみに定義されているCONFIG_DISABLE_HAL_LOCKSは何処に有るのか探してみると、esp32\tools\sdk\sdkconfigの中に
# # Arduino Configuration # CONFIG_ENABLE_ARDUINO_DEPENDS=y CONFIG_AUTOSTART_ARDUINO=y CONFIG_DISABLE_HAL_LOCKS=
の様に記述されています。実際にこれが有効なのかどうかは判りませんが、なんとなくCONFIG_DISABLE_HAL_LOCKSの定義には値が設定されていない気がする。
となると
i2c->lock = xSemaphoreCreateMutex();
でI2C用のミューテックスが生成され、排他制御が有効となっていると考えられます。
ちなみにI2C同様にミューテックスが設定されているのは、LEDC、SIGMA-DELTA、SPI、UARTでした。
と言う訳で前回
https://hamayan.blog.so-net.ne.jp/2018-07-11
で実行したプログラムの中から、セマフォに関するコードを抜いて実行してみました。
その結果が冒頭のキャプチャです。
あれぇ???と思っているとArduino core for the ESP32のI2Cの抽象化層がしれっと更新されているので、新しい奴で試してみましたが、やはりカーネルパニックを発生させて再起動します。
片方のタスクの起動時間を100msくらいオフセットしてしまえば、一応は起動直後にカーネルパニックを起こす事は避けられていますが、、、タスク間で同期が必要になりますもんね。
なーんでしょうね?次のバージョンアップに期待ですか。
複数タスクでI2Cを共有する場合、当面はこのやり方の様にユーザーで排他制御を入れた方が安心です。
https://hamayan.blog.so-net.ne.jp/2018-07-11
複数タスクの同時アクセスでカーネルパニックを起こすのがI2Cだけなのか、まだわからない、、、
2018-07-12 10:31
nice!(0)
コメント(0)
コメント 0