2019年8月20日火曜日

LinuxでSloeber+Arduino core for ESP32環境で作業していてぶち当たったこと

電光掲示板もどきプロジェクトは一応形になったので、渋々使用していたArduino IDEからSloeberへ移行してみようと思い立ちました。コンパイル時にArduino core for ESP32のファイルでコンパイルエラーが発生したのでひとまずほったらかしにしてたんですよね。

※SloeberとArduino-core-esp32のインストール方法については他所に情報がありますので割愛します。

ところで、windowsのホームディレクトリに日本語が含まれるていることに気が付かず、何気なくgithub経由でArduino core for ESP32をSloeberに適用したところ、日本語を含むパスのおかげでコンパイルエラーになったことに業を煮やし、Linux Mintに移行しました。

というわけで、以下の情報は

OS:Linux mint 19.1 Tessa
Sloeber:ver4.3.1
Arduino core for ESP32:ver1.0.2

であることを念頭に置いてください。




Sloeberは便利なんですが、「Arduino IDEと同様の振る舞いをする」高機能GUI環境、ではない点に注意が必要です。
Arduino IDEのみを使用してシンプルなスケッチを作成している分にはソースをそのまま移行しても問題ないのですが、Arduino IDE + Arduino core for ESP32と Sloeber+Arduino core for ESP32はかなり違いがあります。
ESP32固有の機能を利用したソースをそのまま移行すると問題が発生するかもしれません。

以下、Sloeber + Arduino core for ESP32環境で作業していて遭遇した問題と、自分なりの考察・解決策を書き留めておきます。念の為書いておきますが、質問されても知識不足で答えられませんのであしからず。

1.Arduino core for ESP32のライブラリでエラーが発生してしまいスケッチをコンパイルできない。

  1−1.error: #include expects "FILENAME" or <FILENAME> -> #include MBEDTLS_CONFIG_FILE が発生する。


プロジェクトの環境変数 A.COMPILER.CPREPROCESSOR.FLAGSに定義されているコンパイルオプションのうち

         -DMBEDTLS_CONFIG_FILE="mbedtls/esp_config.h"

記述が原因で発生します。
ググるとgithubへの投稿に記述を以下のように変えるとコンパイルが通るようになる、という情報がありました。記述そのものは文法的に正しいのですが、Sloeberがこれを展開する際に問題が発生するようです。

         -DMBEDTLS_CONFIG_FILE="" "mbedtls/esp_config.h" ""

=の後ろをダブルクォートを2つとスペースで挟む形に修正します。

この方法で試したところ、エラー内容が"mbedtls/esp_config.h"が見つからない、に変わりました。 先の環境変数の後ろの方で、-Iオプションによって、mbedtls/esp_config.hへのパスが定義されており、念の為コンパイルエラー時に吐かれる展開後のパスを打ち込んでみると参照先へ移動できたのでシェルに渡る部分は問題ないのですが、なぜかコンパイルの際には意図した通りに渡らないようです。
自分の力量では何が問題でエラーになるのかよくわかりません。というわけで別の方法を探しました。

環境変数として展開する場合に発生する問題なので、逆手を取ってスケッチ内で直接esp_config.hをインクルードしてみました。

          #include "mbedtls/esp_config.h"

をスケッチに追加します。
そのままだと二重定義になりますので、環境変数 A.COMPILER.CPREPROCESSOR.FLAGSから MBEDTLS_CONFIG_FILEの記述を削除します。こちらが残ったままだと二重定義でエラーになるか、コンパイル時に上書きされてエラーが解消しないままになります。

 対処の後コンパイルしたところMBEDDTLS_CONFIG_FILE関連のエラーは解消されました。

1−2.FreeRTOSConfig.hにてfatal error: avr/io.h: No such file or directoryが発生する


Arduino core for ESP32はどうもFreeRTOSをベースにしているようです。
スケッチを新規作成すると Arduino.hがincludeされますが、このヘッダの中でFreeRTOS関連のライブラリが3つほどincludeされています。Arduino core for ESP32はFreeRTOSも一緒に配布されていて、このバージョンのFreeRTOSはavr配下のライブラリを参照しないためコンパイルは問題なく通ります。
ではなぜavr配下を参照しているのかというと、SloeberもFreeRTOSを一緒に配布しているものの、バージョンが古いために avr配下のライブラリを相当数includeしているのが原因です。
FreeRTOSはもともとArduinoのcoreモジュールをベースとしていたのでしょう。Arduinoのcoreへパスを通したくなるところですが、Arudino core for ESP32のFreeRTOSはavr配下のライブラリに依存していませんのでやってはいけません。(そうするとボード関連マクロをdefineしていないよエラーが大量にでます)

SloeberについてくるFreeRTOSが悪さをしていますので、参照を削除する必要があります。
プロジェクトのプロパティ→Resource→Linked Resources→Linked ResourcesタブにてECLIPSE_HOME配下のFreeRTOSが表示されている場合は削除してください。
困ったことに一回で削除されないことがありますので、コンパイルが通るようになるまで対処してください。
         
※上記の解決方法はボードを変える度に設定がデフォルト値に戻ってしまうため、都度行う必要があります。

2.Arduino IDE側のコンパイルオプションがわからないため、Sloeberでコンパイルしたバイナリとサイズが異なる。

特に問題はなさそうに見えますが内部が違うからサイズが異なるわけで、自分のケースではArduino IDE版は問題なく動作するのに、Sloeber版はStack smashing protect failureとなってリセットがかかってしまいます。
この点については調査不足なので未解決です。


-----
コンパイルを通すだけでも一癖あって、それなりにEclipseで他の言語をコンパイルしたり、makefileを書いたことがあったりしないと解決の道筋が見えないかもしれませんね。
Arduino IDEを使うほうが気楽で良いのですが、スケッチを機能分割してライブラリっぽくしたいのに、複数ファイルを同じワークフォルダにベタッと展開する形でしか記述できない点が不満ですね。
Arduino IDEのみを使ってライブラリって作れるのかしら。

0 件のコメント:

コメントを投稿

ESP32 Devkit C での疑問点

 前回の投稿から放置状態にあった当ブログですが、再び何かしら作ろうということで、スマートコンセントもどきに取り組んでいます。 回路なども一応動作するものができたのですが、ブレッドボードから移行するために基板に用意しておいたピンソケットにESP32を取り付けたところ、なぜか動作しま...