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互換関数となっているので、機能が制限されています。
「Arduino core for the
ESP32」でもFreeRTOSのAPIを使えばマルチコア、マルチタスクのアプリを作れますが、
それならば最初からESP-IDFを使った方がはるかに簡単です。
ESP-IDFが提供するタスクディスパッチャー(タスクスケジューラ)は非常に強力で、ユーザーにマルチコアを意識させることは有りません。
「Arduino core for the ESP32」でビルドすると、こ
のメイン関数が自動的に実行されます。
loop()はプライオリティが1のタスクとして起動されます。
ESP32はバックグラウンドで様々なシステムタスクが動きます。
シングルコアのESP32では、全速力でloopすると、バックグラウンドで動いているシステムタスクにCPUの実行権が渡らないので、
5Tick(50ミリ秒)の待ちを設けています。