これまで僕自身は、Eclipse 系 IDE を用いてマイコンの開発(征服)を行ってきましたが、とある方から「VSCode はいいぞ」と言われ、いじってみました。
その結果いいぞというお気持ちになったので、マイコン向けの使い方をご紹介します。
予定
本シリーズでは以下の構成でやっていきたいと思います(随時追加・変更等あります)。
- VSCode の C言語/C++ 開発
- ESP32
- STM32
- デバッグ
- ARM Cortex-M
さらに、これらを設定する際に必要となるファイルの書き方も合わせて(雰囲気で)説明します。現時点では PlatfomIO を扱う予定はありません。
VSCodeで開発するメリット
これまで(僕にとっては)、次の2種類が主な開発方法でした。
- IDE(Eclipse など)
- ターミナル(Vim や grep を駆使して)
Eclipse 系 IDE はやたらと重いしメモリを食うので、精神衛生上良くありません。また、IDE 内部のプロセス管理や、設定ファイル破損に依る起動失敗のリスクもあり、あまりいい選択肢とは言えません。
一方で CLI 環境は高速です。しかしながら、うまくやろうとしても、Vim の設定が煩雑だとか、タグジャンプ(関数やマクロの定義先へジャンプすること)のパス設定がいまいちよくわからない等があります。これは 巨大なライブラリ群(ESP の IDF や、STM32 の HAL 等)を扱う時に不便です。その際に定義を調べるのに、以下のようなシェル芸を打たねばならず、これも面倒ですね。
$ find ../CMSIS -type f -name "*.h" | xargs grep -l '#define GPIOA'
# GPIOAの定義を探している
そこで、VSCode の豊富な(かつ簡単な)拡張性を利用することでこれらのデメリットを解決できます。肝心の動作速度ですが、VSCode は Electron ベースなのでやや遅い(Sublime Text 比)ですが、それでも十分許せるレベルです。とにかく拡張機能が素晴らしいので、多少コンピュータに詳しい方には使って欲しいなという感じです。
参考サイト
やりかた
とりあえず上の参考サイトに従ってください。本記事では、ワークスペースの設定に関して、deprecated となったプロパティを除いて最新の記法で書こうと思います。また、Mac を対象とします。Linux の方でもほぼ同様にできると思います。
c_cpp_properties.json
Mac 向けの設定です。インテリセンスのパスやらそこらへんはよくわかりませんが、とりあえず動くので良しとします。
{
"configurations": [
{
"name": "Mac",
"includePath": [
"${workspaceRoot}",
"/Users/yuki/Dropbox/esp32/esp-idf/components/"
],
"browse": {
"limitSymbolsToIncludedHeaders": true,
"databaseFilename": "",
"path": [
"${workspaceRoot}",
"/Users/yuki/Dropbox/esp32/esp-idf/components/"
]
},
"intelliSenseMode": "clang-x64",
"macFrameworkPath": [
"/System/Library/Frameworks/",
"/Library/Frameworks"
],
"compilerPath": "/usr/local/embedded_bin/xtensa-esp32-gcc",
"cStandard": "c11",
"cppStandard": "c++17"
}
],
"version": 4
}
ポイント
path、includePath
どちらも同じですが、ひとまず
- ワークスペースのルートディレクトリ
- ESP-IDFの conpoments ディレクトリ
にパスを指定するのがミソです。こうすることで、コード執筆中のインテリセンスが効きます。
tasks.json
deprecated な記法が目立ったため(バージョンアップするので仕方ないですが)、それっぽく改造してみました。いやぁ、JSON って便利ですね。
{
"version": "2.0.0",
"command": "bash",
"args": [
"--login",
"-c"
],
"type": "shell",
"options": {
"cwd": "${workspaceRoot}",
},
"tasks": [
{
"label": "build app",
"command": "make",
"args": [
"app"
],
"group": "build",
"problemMatcher": {
"owner": "cpp",
"fileLocation": "absolute",
"pattern": {
"regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$",
"file": 1,
"line": 2,
"column": 3,
"severity": 4,
"message": 5
}
}
},
{
"label": "clean app",
"command": "make",
"args": [
"app-clean"
]
},
{
"label": "flash app",
"command": "make",
"args": [
"app-flash"
],
"problemMatcher": []
},
{
"label": "monitor",
"command": "make",
"args": [
"monitor"
],
"presentation": {
"reveal": "never",
},
"problemMatcher": []
},
{
"label": "menuconfig",
"command": "make",
"args": [
"menuconfig"
],
"presentation": {
"reveal": "never",
},
"problemMatcher": []
}
]
}
〆
ということで、オリジナリティゼロでしたが、参考サイト様の通りにやれば ESP32 の開発が超便利になるということでした。次回は STM32 編です。