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 )の以下のブログ記事でも述べられていましたね。
ということで、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つ質問なのですが、私はESP32をスイッチサイエンスさんで販売されている
“ESP-WROOM-32ブレイクアウトSD+”を使用しています。
このボードではSDカードを”SDMMC”というライブラリを使うみたいで”ESP32_SD_ShinonomeFNT Beta ver 1.0″が動作しませんでした。
できればmgo-tecさんのライブラリにSDMMC版が対応していただけるとありがたいです。
カンパニーさん
今回も当記事をご覧いただき、ありがとうございます。
私はスイッチサイエンスさんの委託販売ボード “ESP-WROOM-32ブレイクアウトSD+” は持っておりません。
MMCライブラリしか対応していないので、敬遠していました。
MMC については私は使ったことが無いので、これから検討してみたいと思います。
しばらく時間がかかるかも知れませんので、何卒ご容赦くださいませ。