PlatformIOでESP32を開発する

ESP-IDFとの比較


PlatformIOが利用する「Arduino core for the ESP32」は、ESP-IDFが提供するAPIをラップしてArduino互換APIを提供するものです。
2021年2月時点でPlatformIOが提供するESP-IDFはVer3.3です。
一方、ESP-IDFはVer3の開発は終了し、Ver4.3まで開発が進んでいて、新たな機能やドライバーが追加されています。
また、2021年6月時点でESP32-S2、ESP32-C3、ESP32-S3への対応も完了しています。

PlatformIOとESP-IDFの差は、「Arduino core for the ESP32」が提供するAPIを使うか、ネィテイブなAPIを使うかと言う事になります。
「Arduino core for the ESP32」が提供するAPIは、ArduinoのAPIと互換を取るために、ESP-IDFの一部の機能しか使うことができません。
ESP-IDFにはJSON、XML、JPEGなどのライブラリが標準で含まれているので、ESP-IDFでこれらを使うときには外部のライブラ リを必要としませんが、
「Arduino core for the ESP32」はこれらの機能を提供しないので、別途Arduinoのライブラリを使うことになります。

ネットワークに関しては、ESP-IDFではlwIPのAPIがそのまま使えるので、Linux用のコードをほとんどそのまま移植することができ ます。
こちらで公開されているSMBライブラ リや、こちらで公開されているsshライ ブラリがそのまま動きました。
「Arduino core for the ESP32」もネットワーク機能を提供していますが、Arduino互換関数となっているので、機能が制限されています。

ESP-IDFで使うことができるmenuconfig機能は非常に強力です。
ソースコードの変更を行うことなく、メニュー項目の変更だけで機能を変更することができます。

「Arduino core for the ESP32」でもFreeRTOSのAPIを使えばマルチコア、マルチタスクのアプリを作れますが、
それならば最初からESP-IDFを使った方がはるかに簡単です。
ESP-IDFが提供するタスクディスパッチャー(タスクスケジューラ)は非常に強力で、ユーザーにマルチコアを意識させることは有りません。

「Arduino core for the ESP32」でビルドすると、こ のメイン関数が自動的に実行されます。
loop()はプライオリティが1のタスクとして起動されます。
ESP32はバックグラウンドで様々なシステムタスクが動きます。
シングルコアのESP32では、全速力でloopすると、バックグラウンドで動いているシステムタスクにCPUの実行権が渡らないので、
5Tick(50ミリ秒)の待ちを設けています。

Arduino環境の場合、このようなコードを書くことが有ります。
void loop() {
 if(UART/Socketから受信データが有るか) {
  UART/Socketから受信
  受信したデータの処理
  }
}

これは以下の様に展開されます。
void loopTask(void *pvParameters) {
 if(UART/Socketから受信データが有るか) {
  UART/Socketから受信
  受信したデータの処理
  }
  vTaskDelay(5);
}

個人的には「Arduino core for the ESP32」を使う事はほとんどありません。