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/
内の設定によって実現していますが、これは以下の条件のときに生成されます。
- プロジェクトルートに
platformio.ini
があるとき - 1の状態で新しくVSCodeのウィンドウを開いたとき
自動生成されたあとに削除などを行わなければ、platformio.ini
を編集するたびに自動更新されます。
仮に設定のリセットを行いたい場合は .vscode/
を削除し、VSCodeを再度開きます。
VSCodeを再度開く場合:ターミナル以外の場所をクリック後に「Ctrl + Shift + c」を同時押してターミナルを開いた上でVSCodeを閉じて
code ./
でVSCodeを開き直せます。