SNSへはこちら

マイコン向けの開発環境構築(VSCode) (1) - 概要・ESP-IDF

これまで僕自身は、Eclipse 系 IDE を用いてマイコンの開発(征服)を行ってきましたが、とある方から「VSCode はいいぞ」と言われ、いじってみました。
その結果いいぞというお気持ちになったので、マイコン向けの使い方をご紹介します。

予定

本シリーズでは以下の構成でやっていきたいと思います(随時追加・変更等あります)。

  1. VSCode の C言語/C++ 開発
    • ESP32
    • STM32
  2. デバッグ
    • 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 編です。