VSCode写一切——MCU篇

Why VSCode?

首先,Keil、IAR之流虽然不是不能用,但是UI看着有一种复古的美(逃),并且.....笔者习惯于在Linux下开发,这俩货都不支持Windows之外的任何平台,所以这俩玩意被pass了。其次,笔者早年确实折腾过CubeIDE等一系列基于Eclipse的IDE。确实能跨平台,魔改完CDT的补全触发机制之后功能也算可用。但是,eclipse的内存泄漏问题不可谓不恶名昭彰。笔者那台8G RAM的开发机,如果长时间开着eclipse + Firefox开上十几个tab,RAM就不够了...所以,eclipse系也不行。最终我把目光转向了VSCode,一番折腾之下,搞出了一套笔者自己用着挺顺手的方案。

依赖安装

Linux篇

以笔者用的Linux Mint为例,首先安装gcc,make这些编译环境

sudo apt-get update
sudo apt-get install gcc-arm-none-eabi libnewlib-arm-none-eabi binutils-arm-none-eabi gdb-multiarch make cmake
然后安装Language Server和生成CompileDB的工具
sudo apt-get install ccls bear
最后安装OpenOCD:
sudo apt-get install openocd
注意: 某些MCU可能并不被主干OpenOCD支持,需要自行编译下游OpenOCD

Windows篇

先安装MSYS2,在MSYS2官网下载安装包安装即可。然后打开mingw64环境,更新一下系统包

pacman -Syyu
再安装make等编译工具

pacman -S make cmake mingw-w64-x86_64-arm-none-eabi-gcc mingw-w64-x86_64-arm-none-eabi-newlib mingw-w64-x86_64-arm-none-eabi-binutils

然后,安装clangd和Python3

pacman -S mingw-w64-clang-x86_64-clang-tools-extra python

安装pip(可能需要魔法上网)

wget https://bootstrap.pypa.io/get-pip.py
python get-pip.py
安装compiledb:
pip3 install compiledb -i https://pypi.tuna.tsinghua.edu.cn/simple
### macOS篇 其实非常类似Linux。。。

curl https://bootstrap.pypa.io/get-pip.py | python3
pip3 install compiledb -i https://pypi.tuna.tsinghua.edu.cn/simple
brew install make cmake ccls
brew install --cask gcc-arm-embedded

似乎brew里没有OpenOCD,所以....只能自食其力了,先安装brew里有的依赖和编译环境

brew install capstone hidapi libusb
brew install pkg-config libtool autoconf automake

手动编译安装libjaylink

git clone https://github.com/syntacore/libjaylink.git --depth=1
cd libjaylink
./autogen.sh
./configure
make -j
sudo make install
make clean

编译安装OpenOCD

git clone git://git.code.sf.net/p/openocd/code openocd-code
cd openocd-code
./bootstrap
./configure
make -j 
sudo make install
mak clean

不要乱删源码,卸载的时候需要makefile

VSCode插件安装

Linux 和 Mac的插件列表:

插件 功能 是否必须 备注
Arm Assembly 为ARM汇编提供高亮 可选 -
C/C++ vcFormat工具人 可选 vcFormat配置起来比较方便,而且功能比较强大
ccls LSP客户端,为VSCode提供C/Cpp语言支持 必须 比MS官方的C/C++插件提供的功能强大,并且速度更快
Coretex-Debug 为MCU提供调试功能 必须 其实用C/C++那个cppdbg也能配置出来,只是极其麻烦
Doxygen Doxygen支持 可选 Doxygen可以说是文档神器了2333
Doxygen Documentation Generator Doxygen格式注释模板自动生成 可选 再也不用手动敲doxygen模板辣
GieLens 更强大的Git集成 可选 不用Git的可以忽略
ident-rainbow 渲染缩进时上色,便于分辨缩进 可选 -
Makefile Tools 提供Makefile语言支持和自动配置C/C++ IntelliSense 必须 如果不配置IntelliSense C/C++会给你渲染很多并不存在的Error
MemoryView 提供内存监视功能 可选 -
RTOS Views 为调试RTOS提供了一些诸如task监视的功能 可选 -
Todo Tree 高亮注释中的TODO和FIXME,并且生成树状图 可选 -

Windows插件列表

插件 功能 是否必须 备注
Arm Assembly 为ARM汇编提供高亮 可选 -
C/C++ vcFormat工具人 可选 vcFormat配置起来比较方便,而且功能比较强大
clangd LSP客户端,为VSCode提供C/Cpp语言支持 必须 稍稍逊色于ccls,但比MS官方那坨东西强了很多
Coretex-Debug 为MCU提供调试功能 必须 其实用C/C++那个cppdbg也能配置出来,只是极其麻烦
Doxygen Doxygen支持 可选 Doxygen可以说是文档神器了2333
Doxygen Documentation Generator Doxygen格式注释模板自动生成 可选 再也不用手动敲doxygen模板辣
GieLens 更强大的Git集成 可选 不用Git的可以忽略
ident-rainbow 渲染缩进时上色,便于分辨缩进 可选 -
Makefile Tools 提供Makefile语言支持和自动配置C/C++ IntelliSense 必须 如果不配置IntelliSense C/C++会给你渲染很多并不存在的Error
MemoryView 提供内存监视功能 可选 -
RTOS Views 为调试RTOS提供了一些诸如task监视的功能 可选 -
Todo Tree 高亮注释中的TODO和FIXME,并且生成树状图 可选 -

Happy Coding(以STM32为例)

先生成makefile工程,just like this:

Makefile_Project_Generate.png

然后cd到工程目录,Linux用户执行:

bear -- make -j

macOS/Windows用户执行:

compiledb make -n

这一步是为了生成compild_commands.json,无论是clangd还是ccls都需要用它来配置includePath等工程信息。(对于使用cmake的工程直接加上-DCMAKE_EXPORT_COMPILE_COMMANDS=on即可生成,不需要外部工具)。

然后用VSCode打开工程目录,就可以Happy Coding辣。

VSCode.png

注意:Windows用户需在mingw64中启动code,否则环境变量不全会导致奇奇怪怪的问题

Debug配置

在工作目录下建立.vscode文件夹,并在.vscode中建立tasks.json和launch.json两个文件。我的tasks.json如下

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "build",
            "type": "process",
            "command": "make",
            "args": ["-j"]
        }
    ]
}

tasks.json可以直接抄过去,但接下来的launch.json需要根据实际情况配置,我的一个工程的launch.json如下:

{
    "version": "0.2.0",
    "configurations": [
        {
            "request": "launch",
            "type": "cortex-debug",
            "servertype": "openocd",
            "preLaunchTask": "build",
            "runToEntryPoint": "main",
            "gdbPath": "gdb-multiarch",
            "cwd": "${workspaceFolder}",
            "name": "Debug with OpenOCD",
            "showDevDebugOutput": "both",
            "objdumpPath": "arm-none-eabi-objdump",
            "executable": "${workspaceFolder}/build/${workspaceFolderBasename}.elf",
            "svdFile": "/media/jinyi/Jinyi/Software/CubeProgrammer/SVD/STM32F103.svd",
            "configFiles": [
                "interface/stlink.cfg",
                "target/stm32f1x.cfg"
            ],
        }
    ]
}

对于macOS用户,需要把gdbPath改为arm-none-eabi-gdb。如果没有对应芯片的SVD请直接删除svdFile一项。如果是自己使用CubeMX直接生成的文件夹可以不动executable,如果是从网上下载/Clone的代码,请将executable替换为你的elf文件路径。最后,configFiles需要根据自己的调试器和MCU配置,可以在/usr/local/share/openocd/scripts或者/usr/share/openocd/scripts/下找到target和interface文件夹,在里面选择自己使用的配置即可。需要注意的是configFiles中两个配置项的顺序 不能调换 ,否则会导致无法调试。

📢 因为是开源博客,为避免 Gitalk授权 带来的 安全风险,也可直接从issue中评论