SSブログ

Arduino core for the ESP32 core panic [ESP32]

esp32_i2c_multitask_test_008.png

本当はこの記事では「ESP32 Arduinoはユーザーが排他制御をあまり意識しなくても使えますよ~、楽ですよ~」ってするつもりだったんです。それがですねぇ、この結末、、、

はじまりはESP32 ArduinoでI2Cに関する検索をしていたらツイッターに、「ESP32 Arduinoは排他制御が入っているのでこの結果はおかしい」的なのを見付けて、「ええ!そうなんですか?」ってソースコード(esp32-hal-i2c.c)を見てみました。
esp32_arduino_core_i2c_001.png

あ、有るのう、、、

ちなみに定義されている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だけなのか、まだわからない、、、
nice!(0)  コメント(0) 

nice! 0

コメント 0

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。