使用 Keil MDK 进行嵌入式开发时,Keil 的编辑器相对于主流编辑器而言有些不方便,比如缺少暗色主题、缺少智能悬停感知(鼠标停在一个宏上,能自动展开最终的宏结果)、代码补全不好用等等,所以推荐使用 VS Code 来代替 Keil 的编辑器。本文用于记录所需的设置项。

如果是第一次使用 vscode ,推荐先看一下《基于Windows 的 VS Code C/C++ 编译环境搭建》这篇文章。

软件安装

  1. 安装 VS Code
  2. 安装以下插件:
    • C/C++ :必装,提供语法高亮等
    • Bookmarks:选装,设置书签
    • CMake:选装,构建工具,可以用于构建测试 (必须另外安装 CMake 软件和编译器,参考这里)
    • GitLens:选装,显示 Git 提交时间线等
    • Hex Editor:选装,按照 16 进制显示文件内容
    • markdownlint:选装,渲染 Markdown 文件
    • Remote-SSH:选装,连接到远程 SSH,比如 Linux 主机
    • VBS:选装,开发 VBS 脚本
    • TONGYI Lingma:选装,通义灵码,带 AI 的智能补全工具
    • Python:选装,用于 Python 代码开发 (必须另外安装 Python 软件,参考这里)
    • cpp-check-lint:选装,静态代码分析,内置 cppcheckcpplint 静态分析工具
    • ShellCheck:选装,检测 shell 代码
    • Bracket Pair Color DLW:选装,彩色括号
    • VSCode Counter:选装,统计代码行数

软件用法和设置

  1. 使用 VS Code 打开 Keil 工程
    打开 VS Code,点击 File - Open Folder... 选中 Keil 工程文件夹。
    请添加图片描述

  2. 保存工作区(可选)

    主要目的是下次可以双击这个工作区图标来打开工程,一个 Keil 工程只需要保存一次。
    请添加图片描述

  3. 添加头文件

    Keil 工程文件夹内的头文件会自动查找,但工程依赖的一些头文件可能存在其它地方。所有不在工程文件夹内的头文件,都需要手动添加

    • 添加编译器提供的头文件

      编译器提供一些特定头文件和 C 库头文件,比如 stdint.h,缺少这个头文件,VS Code 识别不了代码中的 uint32_t

    • 添加 CMSIS 提供的头文件

    • 其它

    首先按下 F1 ,输入 c/c++ 选择C/C++:Edit configurations(UI):
    请添加图片描述
    Include path 中填入需要的头文件路径(注意:我这里使用的是 Keil MDK 编译器)。
    请添加图片描述

  4. 添加宏

    编译器会自带一些宏,比如 Keil 编译器则会定义宏 __CC_ARM,而有些代码和头文件会使用这些宏,在使用 VS Code 的时候就会找不到这些宏,从而导致语法错误。这些与编译器相关的宏需要我们自己添加。

    Defines 中,填入需要的宏(注意:我这里使用的是 Keil MDK 的 ARMCLANG编译器)
    请添加图片描述

  5. 从 Keil 中打开 VS Code工作区(可选)
    请添加图片描述
    Run Independent: 勾选,这样Keil不用等待VSCode执行完成。(这样就可以使用其它自定义工具菜单)。

  6. 隐藏不需要的文件和文件夹(可选)

    • 按下 ctrl+shift+P 打开显示所有命令,在输入框中输入settings 回车
    • 进入 User Settings 页面搜索 files.exclude
      请添加图片描述
  7. 自动删除每行末尾的空格和制表符(可选)
    点击左下角齿轮图标 - Settings,打开设置界面,切换到 User 选项卡,搜索 Trim Trailing Whitespace,使能。

  8. 自动确保文件末尾有且仅有一个换行符(可选)
    点击左下角齿轮图标 - Settings,打开设置界面,切换到 User 选项卡,搜索 Insert Final NewlineTrim Final Newlines,使能。

自动编译和下载脚本

在 vscode 中编写代码,但编写完的代码要切换到 Keil 中编译和下载,这使得流程有点割裂。我们可以写个脚本代码,来通过脚本调用 Keil 程序编译代码和下载:

  1. 设置(只需一次):Settings - Auto Save,选择 onFocusChange。这是为了切换到内置终端时自动保存修改的文件。
  2. 编写 vbs 脚本,实现编译和下载脚本代码,建议脚本和 vscode 工作区在同一目录 (主要为了不必修改目录就可以调用脚本)
  3. 在 vscode 内置终端(TERMINAL,如果没有可以 Terminal - New Terminal),输入 cscript.exe .\脚本名

代码格式化

安装 C/C++ Extension 扩展后,就可以按下 Shift+Alt+F 组合键,对选中的代码或者文件内的代码自动格式化。VS Code 自带的编辑器本身不懂 C/C++ 的格式化规则,而是调用:

  • clang-format(默认)
  • 或vcFormat(微软自带的 VC++ 格式化器,Windows 环境下可用)

保存时自动格式化

在 VS Code 的设置(settings.json)里,在左侧窗口找到:Text Editor - Formatting,然后勾选 Editor:Format On Save
在这里插入图片描述

配置格式化效果

首先在工程根目录新建 .clang-format 文件,这里面描述格式化规则。因为我使用了谷歌的 cpplint 检查代码风格,所以我的自动格式规则基于 Goolge 风格,然后略作调整:

  • 要求 { 独占一行
  • 每行最大字符放宽到 120
  • 永不使用 Tab 键,并且缩进宽度是 4 个空格
  • 不允许在一行写整个函数,短函数也不行
BasedOnStyle: Google
UseTab: Never								# 不使用制表符,用空格代替
IndentWidth: 4								# 缩进宽度
AllowShortIfStatementsOnASingleLine: false
ColumnLimit: 120
SpaceBeforeParens: ControlStatements		# 只在控制语句(如if、for、while等)的圆括号前加空格
BreakBeforeBraces: Allman					# 大括号总是在新的一行开始。
StatementMacros:
  - TEST
AllowShortBlocksOnASingleLine: false		# 不允许短的块(如if、for、while的块)放在同一行
AllowShortFunctionsOnASingleLine: Empty		# 允许函数放在同一行(空函数可以)
#ForEachMacros:
#  - TEST_GROUP

SpacesBeforeTrailingComments: 2  			# 注释前的最小空格数(按需调整)
AlignTrailingComments: true  				# 开启行尾注释对齐
AlignConsecutiveMacros: true   				# 对齐连续定义的宏(常用于常量注释)
AlignConsecutiveDeclarations: true  		# 对齐连续变量声明(含注释)

PointerAlignment: Right						# 将指针符号*放在变量名旁边(int *tmp)

踩坑

  1. 特殊不需要自动格式化的代码可以用:
    // clang-format off
    这里放不需要自动格式化的代码
    // clang-format on
    
  2. 让结构体数组强制换行:在每个元素后加注释(//),格式化器看到注释,就认为“这一行已经完整”,不会压行。

自定义主题

主题保存在 %USERPROFILE%\\.vscode\\extensions 中,选择其中一个作为模版,在其上进行自定义修改。

我选择 ms-vscode.cpptools-themes-2.0.0 作为模板,将 cpptools_dark_vs_new.json 内容进行修改:

背景 颜色为浅黑色:#212121
注释 颜色为浅灰色:#575E6A
关键字 颜色为蓝色:#569CD6
宏 颜色为蓝色:#61AFEF
函数 颜色为绿色:#6A9955
局部变量 颜色为番茄红:#E06C78

因为关键字和宏的颜色接近,所以代码颜色大约有 5 种,效果为:
在这里插入图片描述

一些已知问题和解决办法

1 补全失效、无法跳转

  1. 文件第一行的 include 会有红波浪,报错提示 command-line error:language modes specified are incompatible
  2. vscode 无法正确的着色部分代码,比如宏;
  3. 补全功能完全失效;
  4. 无法进行文件跳转;

在这里插入图片描述
我的工程中使用了 cMake 构建,然后出现了这个问题,也就是 vscode 无法找到头文件了。

解决办法:Ctrl + Shift + P ,输入 configurationProvider
在这里插入图片描述
CMake Tools 改为 none
在这里插入图片描述

2 不小心关闭了错误检测

解决办法:Ctrl + Shift + P ,输入 errorSquiggles,选择 Enable
在这里插入图片描述

3 快捷键 Ctrl + Shift + F 无反应

大概率和其它软件的快捷键冲突了。
这里给出一个 Win10 系统会冲突的软件:输入法
打开 设置 界面,点击“时间和语言”界面,在弹出的界面中(如下图所示),点击右侧的 语言 - 中文(简体,中国) - 选项
在这里插入图片描述
在弹出的“语言选项”中,点击 微软拼音 - 选项 ;
在弹出的“微软拼音”中,点击 按键;
在弹出的“按键”中,找到 热键,关闭“简体/繁体中文输入切换”:
在这里插入图片描述

这还没完,如果你安装了“搜狗输入法”,还需要找到 搜狗输入法 - 设置 - 按键 - 系统功能快捷键设置 ,把其中的“简繁切换”关闭(或修改成其它快捷键)。
在这里插入图片描述

4 打开的文件中文乱码

可能是 Vs Code 使用的编码与 keil 使用的编码不同导致的。假设 keil 使用 GB2312 编码,将 Vs Code 的编码改为 GB2312 的方法如下:

  1. 点击左下角齿轮图标 - Settings,打开设置界面,点击 Workspace 选项卡。
  2. 搜索 “encoding”,找到 Files:Encoding ,选择 Simplified Chinese (GB 2312) 编码。

注:如果文件编码格式为 GB 2312,并且悬浮窗口中的中文出现乱码(如下图所示),使用本方法也能解决。
在这里插入图片描述

在 ​​VS Code​​ 的 ​​Settings(设置)​​ 界面中,有三个不同的选项卡:​​User(用户)​​、​​Workspace(工作区)​​ 和 ​​Folder(文件夹)​​。它们分别代表不同层级的配置,优先级和作用范围不同。

  • User(用户)​:全局,适用于当前用户的所有 VS Code 项目,除非被 ​​Workspace​​ 或 ​​Folder​​ 设置覆盖。适用于个人偏好设置,如主题、字体、快捷键等。
  • Workspace(工作区)​:适用于当前打开的 ​​Workspace(工作区)​​,保存在 .vscode/settings.json 文件内(如果工作区是单个文件夹)或者 .code-workspace 文件中。适用于特定项目的配置,如语言特定设置、调试配置、扩展推荐等,会覆盖 User 设置。
  • Folder(文件夹):​仅适用于当前打开的 ​​单个文件夹​​(而非工作区)。保存在 .vscode/settings.json 文件内。会覆盖 ​​User​​ 设置,但 ​​Workspace​​ 设置优先级更高。

5 调试变量按照 16 进制显示

WATCH 窗口添加变量时,变量名后面增加 ,h ,即可按照 16 进制显示变量值。

6 CMake 生成 Release 可执行文件

VSCode 的 CMake Tools 扩展默认使用 ​​Debug​​ 配置,这是为了便于开发调试。当编译代码时,它会自动添加 --config Debug参数。如果想在 VSCode 中编译 Release 版本,方法如下:

  • 打开命令面板(Ctrl+Shift+P)
  • 输入 “CMake: Select Variant”
  • 选择 “Release”
  • 重新构建项目

我使用 CppUtest 做测试,相较于 Debug 版本,Release 版本体积降低了一半多,速度快了一倍多。

注意:如果使用 Release 版本,则项目不能在线调试,因为只有 Debug 版本才生成调试信息。

终端滚动行数少,编译信息显示不全

VSCode 默认情况下,终端的回滚行数为 1000 行,这在编译大型项目时是远远不够的,修改方法是:

  • 点击左下角 “Setting”
  • 输入 terminal scrollback,找到设置项
    在这里插入图片描述
  • 将数值修改为需要的大小

远程连接

使用 WSL2

vscode 中搜索 WSL 扩展,安装完毕后按下图查看 Ubuntu 系统:
在这里插入图片描述
点击 Ubuntu -22.04 右侧的箭头,连接到 Ubuntu :
在这里插入图片描述

使用 VMware 虚拟机

  1. 在 Ubuntu 中安装 OpenSSH 服务器:sudo apt install openssh-server
  2. 确认 SSH 服务正在运行:sudo systemctl status ssh
  3. 使用 ifconfig 或者 ip addr show 命令查看 Ubuntu IP 地址,假设为 192.168.1.100
  4. 使用 whoami 查看当前登陆用户名,假设为 ubuntu-2204
  5. 在 Windows 中安装 vscode,vscode 中安装 Remote-SSH 插件
  6. 如下图所示添加远程连接,输入 ssh Ubuntu-204@192.168.1.100
    在这里插入图片描述
  7. 找到新添加的连接,如上图蓝框中所示(IP 地址应是 192.168.1.100),点击 IP 地址右侧的箭头( -> )来连接到你的 Ubuntu 虚拟机。注意第一次连接时会要求确认主机并输入密码。
  8. 安装必要的 vscode 插件
  9. 打开远程工作区,就可以远程开发了。

如果想免密连接,需要将 Windows 下的公钥添加到 Ubuntu 下的 ~/.ssh/authorized_keys 文件中。

远程连接踩坑

使用 vscode 打开 U-Boot、Linux 源码,并且通过 File-Save Workspace As... 创建工作区工程文件。但是使用 make clean 清除编译信息时,vscode 会闪烁一下,然后弹出:“Workspace dose not exist” 的提示,工作区也会消失。

在这里插入图片描述

这时因为 make clean 把你的 xxxx.code-workspace 当成编译产物删掉了。业界标准做法是把工作区文件放在源码目录之外

版本控制(Git)

  1. 打开源代码控制界面
  2. 输入 message - 点击 Commit
  3. 首次 Push 前,需要设置远程仓库地址。
    • 先在云端新建仓库,可以选择 Gitee 或者 Github 等云平台,获取新建仓库的地址
    • 按照下图设置远程仓库地址
      在这里插入图片描述
  4. 点击同步按钮,将本地更改上传到远程仓库。






读后有收获,资助博主养娃 - 千金难买知识,但可以买好多奶粉 (〃‘▽’〃)
千金难买知识,但可以买好多奶粉


Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐