えいあーるれいの技術日記

ROS2やM5 Stack、Ubuntuについて書いています

PlatformIOでプラットフォームのキーワードを取得する(PIO, Arduino)

VSCodeでPlatformIOを使用するとき、ボードでコンパイル分岐させることがあります。

とくにArduinoなどのもはやアーキテクチャすら違うボードではライブラリを同様に扱えるようにしておきたいところです。

分岐を行う場合は #if defined()#endif で挟んでその間に記述を行います。条件に当てはまらなかったときは、そもそもコンパイル対象になりません。

// 使用例(STM32L4xxである場合は、"This is STM32L4xx"と表示)

#if defined(STM32L4xx)
Serial.println("This is STM32L4xx");
#endif

キーワードの取得自体はそれほど難しくありませんが、PIOの仕様が分からず少し戸惑ったところもあったので、備忘録として残しておきます。


キーワードの取得方法

キーワードはボードごとに異なり、それぞれ探す必要があります。最も簡単な方法がプロジェクトのルートにある .vscode/c_cpp_properties.json[configurations][defines] 欄の確認となります。

ファイル内では PLATFORMIO=60103, STM32L432xx, STM32L4xx, ARDUINO=10808, ARDUINO_ARCH_STM32, ARDUINO_NUCLEO_L432KC, BOARD_NAME="NUCLEO_L432KC", HAL_UART_MODULE_ENABLED, USE_FULL_LL_DRIVER, VARIANT_H="variant_NUCLEO_L432KC.h"が定義されています。

=で定義されているものは #if ARDUINO==10808 のように記述して条件分岐させます。

ボード上のデバイスによって左右されやすいものは BOARD_NAME="NUCLEO_L432KC" などの定義を行い、あまり左右されない場合は ARDUINO_ARCH_STM32 などのゆるい定義を行うと良いでしょう。


いつ c_cpp_properties.jsonが生成されるのか

PlatformIOは非常によくできているIDEで、パス通しがArduinoの仕様を残しつつVSCodeの使い勝手の良さを実現しています。

この使い勝手の良さは .vscode/ 内の設定によって実現していますが、これは以下の条件のときに生成されます。

  1. プロジェクトルートに platformio.ini があるとき
  2. 1の状態で新しくVSCodeのウィンドウを開いたとき

自動生成されたあとに削除などを行わなければ、platformio.ini を編集するたびに自動更新されます。


仮に設定のリセットを行いたい場合は .vscode/ を削除し、VSCodeを再度開きます。

VSCodeを再度開く場合:ターミナル以外の場所をクリック後に「Ctrl + Shift + c」を同時押してターミナルを開いた上でVSCodeを閉じて code ./VSCodeを開き直せます。