Arduino – ESP32 WiFiClientSecure ライブラリのハングアップ問題がついに解決!

ESP32 ( ESP-WROOM-32 )

make コマンドでコンパイルして、新たな libmbedtls.a ファイルを作成する

では、いよいよコンパイルです。

先ほどのMSYS2 画面に続いて、make コマンドのみ打ち込んでコンパイルします。

そうすると、下図の様にエラーメッセージが出ると思います。
コンパイルは2分くらいかかりますので、あまりにも早く終わったら明らかにエラーです。

エラーが出ると、libmbedtls.a ファイルは作成されません。
このメッセージを見てみると、https_request フォルダの中の SimpleBLE ライブラリに必要なファイルが無いのでエラーになっているというメッセージです。

今回は Bruetooth は使いませんので、このライブラリをフォルダごと削除してしまいます。

その後、再度、MSYS2 画面で make コマンドを実行してみてください。
下図の様にエラーメッセージが無ければ成功です。
結構長い時間(約2分)かかりました。

では、下図の様にhttps_request フォルダの中に build フォルダが形成されていて、その中に mbedtls フォルダがあります。
パスはこんな感じです。

D:\msys32\home\https_request\build\mbedtls

そこに、libmbedtls.a ファイルが作成されていれば成功です。

Arduino core for ESP32 ライブラリを修正する

では、新たに作った、libmbedtls.a ファイルを本来の Arduino core for ESP32 のライブラリと入れ替えます。

Windows10 の場合の Arduino core for ESP32 の libmbedtls.aフォルダパスは以下のようになります。

C:\Users\User-Name\Documents\Arduino\hardware\espressif\esp32\tools\sdk\lib

そこに、下図の様にコピペ上書きして、置き換えてください。

次に、下図の様に本来の Arduino core for ESP32 ライブラリ中の sdkconfig.h ファイルをテキストエディタで修正します。
パスは以下のところにあります。

C:\Users\User-Name\Documents\Arduino\hardware\espressif\esp32\tools\sdk\include\config

下図の様に、ハードウェアアクセラレーター関係を全てコメントアウトして保存してください。
合計4つあります。

line  48: #define CONFIG_MBEDTLS_MPI_USE_INTERRUPT 1
line  85: #define CONFIG_MBEDTLS_HARDWARE_AES 1
line 106: #define CONFIG_MBEDTLS_HARDWARE_SHA 1
line 126: #define CONFIG_MBEDTLS_HARDWARE_MPI 1

Arduino core for ESP32 のライブラリ設定は以上です。
ですが、実はこれだけでは動作しないんですね。

次に進みます。

Arduino メインループのスタックメモリを増やす

いよいよ、最後の設定です。

ライブラリを修正しただけでは、コンパイルは通りますが、HALTエラーになってしまって動作しません。

そこで、下図の様に、Arduino IDE のメインloop 関数のソースコードをテキストエディタで開いて下さい。
パスは以下のところにあります。

C:\Users\User-Name\Documents\Arduino\hardware\espressif\esp32\cores\esp32

そして、下図の様に 25行目の数値を2倍の 8192 に書き換えて上書き保存してください。

このmain ソースを見てみて、ピンと来た方がいると思います。
なんと、Arduino – ESP32 のメインloop 関数は FreeRTOS を使っていて、既にデュアルコア(マルチタスク)で動作できるようになっていますね。

最初の方で紹介した、けりさん ( @Ryokeri14 )の以下のブログ記事でも述べられていましたね。

ESP32でデュアルコアを使おう!

ということで、Arduino core for ESP32 は初めのころからデュアルコア(マルチタスク)で動作させる前提で作られていたということです。

これに気付いてから、私も最近では ESP32 を Arduino でデュアルコアで動作させる実験をするようになりました。
デュアルコアで動かすと、ESP32 ( ESP-WROOM-32 ) のポテンシャルが凄すぎて、ヤバイです。

ということで、以上で Arduino core for ESP32 の WiFiClientSecure ライブラリの修正は終了です。
全てが済んだら、Arduino IDE を必ず再起動してください

これで、今までの SSL ( https )ページとコネクションするスケッチをコンパイルし直してみて下さい。
サクサク感が全然違いますよ!!!

Web GETリクエストも1000回連続でやってもフリーズは一切しなくなります。
スバラシイ!!!

まとめ

以上、WiFiClientSecure ライブラリの修正でしたが、うまく動作しましたでしょうか?

この修正方法ができるようになると、機能豊富な ESP-IDF と連携させて Arduino IDE ライブラリの機能をアップさせることも可能な気がします。

今回の件は、本家 Espressif Arduino core for ESP32 の issue ページで質問を投げかけていますので、もしかしたら近い将来修正されるかもしれません。
2017/8/1 に修正されました

最近は ESP32 をArduino IDE でコンパイルして、デュアルコア(マルチタスク)で動かしていますが、その実験中に今回のライブラリ修正方法を思いついた感じです。
とても良いヒラメキを与えてくれた、「けり」さんの記事に感謝します。

次回は、ESP32 電光掲示板をマルチタスクで動かして、文字がスクロール中に停止することなく裏で Web記事を取得する方法を紹介したいと思います。

長くなりましたが、私も今回で疲れ果てました・・・。
記事を書くのが苦痛です・・・。

ではまた・・・。

コメント

  1. カンパニー より:

    素晴らしい記事をありがとうございます。
    ぜひ参考にさせていただきます。

    1つ質問なのですが、私はESP32をスイッチサイエンスさんで販売されている
    “ESP-WROOM-32ブレイクアウトSD+”を使用しています。
    このボードではSDカードを”SDMMC”というライブラリを使うみたいで”ESP32_SD_ShinonomeFNT Beta ver 1.0″が動作しませんでした。

    できればmgo-tecさんのライブラリにSDMMC版が対応していただけるとありがたいです。

    • mgo-tec mgo-tec より:

      カンパニーさん

      今回も当記事をご覧いただき、ありがとうございます。

      私はスイッチサイエンスさんの委託販売ボード “ESP-WROOM-32ブレイクアウトSD+” は持っておりません。
      MMCライブラリしか対応していないので、敬遠していました。

      MMC については私は使ったことが無いので、これから検討してみたいと思います。
      しばらく時間がかかるかも知れませんので、何卒ご容赦くださいませ。

タイトルとURLをコピーしました