尧图精选

VSCode嵌入式开发插件推荐:Cortex-M、RTOS与Linux配置实战

🕒 发布时间:2026/10/1 13:50:42 📁 来源:尧图网络
嵌入式开发这行有个很明显的特点工具链本身几十年没大改过但承载工具链的编辑器在最近几年被彻底换了一遍。我入行时用的是 Keil MDK 加 Source Insight 再加一个串口助手三四个窗口来回切一个变量定义要跳三次才能找到。现在带新人第一件事就是把 VSCode 装好把几个核心插件配起来让他从第一天起就在一个界面里完成编译、烧写、调试、看寄存器、翻源码、查日志。VSCode插件推荐的内容网上很多但大部分是通用开发向的真正贴嵌入式开发场景的整理反而零散。这篇就把我自己这几年在 Cortex-M 裸机、RTOS、以及嵌入式 Linux 驱动开发这三条线上实际装过、删过、留下来长期使用的插件连同配置方法和踩过的坑一次性讲清楚。先说适合谁看。如果你刚开始接触嵌入式还在纠结到底用 Keil 还是 VSCode这篇能帮你判断值不值得花时间迁移如果你已经用 VSCode 写代码但 IntelliSense 一直飘红、调试器连不上、在十万行的内核源码里找不到北这篇里的配置片段可以直接抄如果你在做嵌入式 Linux 方向需要远程编译、看设备树、做系统裁剪后半部分专门讲这块。全文不涉及任何具体芯片的商业推广只讲工具怎么配、为什么这么配。1. 嵌入式开发为什么把主力编辑器换成了 VSCode我最早对 VSCode 是抗拒的。理由很实在Keil 双击工程就能编译烧写VSCode 得自己写 tasks.json、launch.json、c_cpp_properties.json三个 json 文件能劝退一半人。但真正让我转向的是两个场景。第一个场景是接手一个跑了七八年的老项目代码里全是#ifdef和手写寄存器我需要快速搞清楚某个中断服务函数到底被谁调用、某个全局变量在哪里被改。Keil 的查找功能在这种规模下基本瘫痪而 VSCode 的全局符号跳转加上 GitLens 的 blame 视图十分钟就理清了脉络。第二个场景是同一个人要同时维护 STM32 的裸机工程和一块跑 Linux 的板子上的驱动两套工具链两套调试方式只有 VSCode 能用一个界面同时容纳。从工程管理角度看迁移还有一个隐藏收益整个.vscode目录可以进 Git 仓库。以前 Keil 的.uvprojx是二进制偏 XML 的格式多人协作时冲突解决起来很痛苦而且每个人的窗口布局、断点、书签都在本地换台电脑就得重配一遍。VSCode 把编译命令、调试参数、代码索引规则全部文本化新同事 clone 下来直接就能跑这是团队协作上实打实的差别。当然代价也要说清楚。VSCode 本身不懂 ARM 架构也不认识 ELF 文件它所有的嵌入式能力都来自外部工具链加插件。也就是说arm-none-eabi-gcc、openocd、arm-none-eabi-gdb这些东西该装还得装VSCode 只是把它们串起来的那根线。理解了这一点后面配置出问题时排查思路就很清晰先确认命令行下工具能跑通再去看插件配置。1.1 从 Keil、IAR 到 VSCode 的迁移动机迁移这件事不同阶段的团队动机完全不一样。个人开发者看中的是免费和跨平台Linux 下也能写 STM32小团队看中的是版本管理和远程协作大厂看中的是可定制能把公司内部的编译脚本、代码规范检查、CI 流程全部接进来。还有一个被低估的点是编辑器本身的迭代速度代码折叠、多光标、命令面板、正则替换这些基础体验老牌 IDE 确实落后了一代。但我不建议所有人无脑迁移。如果项目用的是厂商高度定制的芯片比如一些专用 SoC官方 IDE 里集成了图形化配置工具和私有烧写算法那用官方 IDE 反而更快。我自己的做法是分场景快速验证和量产烧写用官方工具日常写代码、读代码、调试、管版本用 VSCode。两套并行不冲突。1.2 插件不是越多越好我的三条筛选标准插件装到五十个以上之后VSCode 的启动会明显变慢扩展宿主进程占内存能到 1GB 以上而且会出现插件之间抢同一个语言服务的情况最典型的就是两个 C 语言服务同时跑索引互相打架。所以我给自己定了三条筛选标准。第一条插件必须解决一个我每周至少遇到一次的具体痛点。比如 Bookmarks 解决的是在几万行代码里来回跳转我每天都在用而某些代码统计类插件我一个月可能点开一次那就没必要常驻。第二条任何会主动扫描整个工作区的插件都要先看它的排除配置能不能改。嵌入式工程的Drivers/CMSIS目录动辄几万个文件如果某个插件把它全索引一遍风扇立刻起飞。这类插件要么配置排除目录要么干脆换成用的时候再临时启用。第三条优先选官方或大厂维护的。嵌入式的插件生态里有一批个人维护的扩展作者弃坑之后新版 VSCode 一升级直接报错你还得去翻 issue 找降级方案非常费时间。下面这张表是我目前长期留着的主力清单后面几节会逐个展开配置细节。插件名称主要用途常驻建议C/C代码索引、跳转、语法检查必装Cortex-DebugARM 芯片在线调试、寄存器查看必装Makefile Tools / CMake Tools构建系统集成生成编译数据库按构建方式二选一Serial Monitor串口收发、日志查看必装GitLens代码溯源、提交历史推荐Bookmarks大工程里设书签快速跳转推荐Todo Tree汇总 TODO/FIXME 标记推荐Error Lens错误直接显示在代码行尾推荐Remote - SSH / WSL远程开发、Linux 环境下编译按需Hex Editor查看 bin、hex 固件按需clang-format统一代码风格推荐AI 补全类生成样板代码、解释陌生代码按需2. 地基三件套编译、调试、索引先打通装插件的顺序很重要我的建议是先打通文本层面再打通执行层面最后才去装那些锦上添花的东西。原因在于如果 IntelliSense 没配好几万个符号全是红色波浪线你会觉得这个编辑器根本没法用实际上只是c_cpp_properties.json里少了一个宏定义。先把地基三件事做好后面的插件才有意义。这三件事分别是让编辑器知道你的编译器在哪、头文件在哪、定义了哪些宏这是索引让编辑器知道怎么调用你的构建脚本这是编译让编辑器知道怎么连上调试探针、加载符号表、停在 main 函数这是调试。三者环环相扣索引错了跳转就错编译命令不对断点就无效。2.1 C/C 插件与 IntelliSense 正确配置姿势新手最常见的失败模式是这样装完 C/C 插件打开工程满屏波浪线#include stm32f1xx_hal.h报找不到文件。打开c_cpp_properties.json一看includePath 是空的因为插件默认只认识系统头文件路径。手动一个个加目录能累死人正确的做法是生成compile_commands.json让插件直接从编译命令里反推所有路径和宏。CMake 工程生成这个文件最省事配置时加一个开关就行cmake -B build -DCMAKE_EXPORT_COMPILE_COMMANDSONMakefile 工程用bear或者compiledb包装一下编译命令bear -- make -j8 # 或者 compiledb -n make -j8生成之后c_cpp_properties.json里只需要指过去{ version: 4, configurations: [ { name: STM32, compilerPath: /usr/bin/arm-none-eabi-gcc, cStandard: c11, cppStandard: c17, intelliSenseMode: gcc-arm, compileCommands: ${workspaceFolder}/build/compile_commands.json } ] }compilerPath这一项必须指向交叉编译器而不是宿主机的gcc指向错了会导致内置类型的大小判断全部错掉比如int被当成 4 字节而某些平台上实际是 2 字节指针宽度也会算错进而让一大堆条件编译分支显示为无效代码。intelliSenseMode也要跟编译器匹配ARM 平台选gcc-arm加上-fshort-enums这类参数的情况就得在编译数据库里体现出来。注意compile_commands.json是构建产物每次改完 Makefile 或 CMakeLists 都要重新生成否则新增的源文件不会进索引。稳妥做法是把它挂到构建任务上每次编译自动刷新。2.2 Cortex-Debug把调试器接进编辑器Cortex-Debug 是这套组合里最值钱的插件它把 OpenOCD、J-Link GDB Server、pyOCD 这些后端统一封装还能直接加载 SVD 文件把外设寄存器解码成可读的位域视图。以前要在 Keil 里点开 System Viewer 才能看寄存器现在在调试侧边栏就能看到每个位叫什么名字、当前值是多少排查外设配置问题效率提升非常明显。一份典型的launch.json长这样{ version: 0.2.0, configurations: [ { name: Debug (OpenOCD), type: cortex-debug, request: launch, servertype: openocd, cwd: ${workspaceFolder}, executable: build/demo.elf, device: STM32F103C8, configFiles: [ interface/stlink.cfg, target/stm32f1x.cfg ], svdFile: ${workspaceFolder}/svd/STM32F103xx.svd, runToEntryPoint: main, preLaunchTask: build, showDevDebugOutput: none } ] }几个参数值得单独说。executable必须是带调试符号的 ELF不能是 strip 过的 bin如果编译时加了优化等级又没加-g断点会乱跳变量显示成optimized out这不是插件的问题是编译选项的问题。runToEntryPoint填main可以让程序一路跑到主函数再停省得从复位向量开始单步。svdFile是寄存器视图的关键没有 SVD 也能调试但外设寄存器就是一堆裸地址和十六进制数基本没法看。SVD 文件一般在厂商的芯片支持包里或者从开源 SVD 数据库里找。preLaunchTask指向 tasks.json 里定义的构建任务这样按 F5 会自动先编译再下载流程和商业 IDE 一致。很多人调试时改了代码忘了重新编译结果单步走的是旧版本逻辑加上这一项能避免这个低级错误。2.3 串口、终端与构建任务串口这块早些年大家用终端里的minicom或者screen现在 VSCode 有了内置的串口监视器插件收发、换行符处理、时间戳、日志保存都能在编辑器里完成还能和代码窗口并排摆放日志和代码对照着看非常舒服。配置上主要注意波特率和流控另有一个小细节是行结束符有的板子输出是\n有的是\r\n选错了日志会连成一行。构建任务放在tasks.json里除了编译本身我还习惯加两个任务一个跑arm-none-eabi-size看代码段占用一个跑objdump生成带源码混排的反汇编文件排查 HardFault 的时候直接搜索出错地址对应的指令。{ version: 2.0.0, tasks: [ { label: build, type: shell, command: make -j8, group: { kind: build, isDefault: true }, problemMatcher: [$gcc] }, { label: size, type: shell, command: arm-none-eabi-size -A build/demo.elf }, { label: disasm, type: shell, command: arm-none-eabi-objdump -d -S build/demo.elf build/demo.lst } ] }problemMatcher填$gcc之后编译报错会直接显示在问题面板里点击就能跳到出错行不用再去终端里翻输出。这一步看着不起眼但在一个包含几十个源文件的工程里能省掉大量滚动查找的时间。3. 提效类插件把重复劳动交出去地基打通之后接下来的插件都是围绕减少无谓操作来选的。嵌入式开发有个特点代码本身逻辑不算特别复杂但环境相关的重复劳动特别多翻寄存器手册、对数不清的宏定义、在汇编和 C 之间来回对照、写一堆几乎一样的初始化代码。插件能帮上忙的地方恰恰是这些重复劳动。选这类插件时我有个判断方法如果一个操作我每天要重复十次以上那就值得为它装一个插件或者写一段配置如果一周才用到一次用命令面板临时执行就够了没必要常驻。按这个标准筛下来真正长期留在我侧边栏里的没几个。3.1 代码导航与阅读类在十万行代码里不迷路首先是 Bookmarks 插件。它的作用看起来简单就是给某一行打个标记然后快捷键跳过去。但实际用起来效果远超预期。比如我在调一个电机控制算法需要同时盯着 PWM 初始化、中断服务函数、编码器读取这三处代码用书签标好Alt 加数字键一键切换比用 CtrlP 搜文件名再定位行号快太多。书签列表还能按文件分组项目结项后清空重来。第二个是 Todo Tree。它的价值在于把散落在几十个文件里的TODO、FIXME、HACK注释全部汇总到侧边栏形成一份自动维护的任务清单。硬件项目经常遇到的问题是调试时发现某个寄存器配置有疑问随手写个 TODO 就接着往下做了过两周完全想不起来。有了这个面板每次打开工程扫一眼就知道还有哪些坑没填。我还会给它加自定义标签比如DEMO标记临时调试代码HW标记需要跟硬件同事确认的地方。第三个是 Error Lens。默认的报错显示方式是画波浪线然后把鼠标悬停上去才能看提示。这个插件直接把错误信息打在行尾颜色区分错误和警告。在写寄存器位操作的时候特别有用因为那种代码经常是嵌套宏加移位语法错误和类型不匹配一眼就能看出来不用一个一个去悬停。3.2 规范与质量类格式化、静态检查、拼写格式统一这件事人少的时候无所谓人一多就是灾难。我的做法是在工程根目录放一个.clang-format文件配合 clang-format 插件保存时自动格式化。BasedOnStyle用LLVM或者Google都行关键是统一别让每个人按照自己的习惯对齐。下面这份配置是我在嵌入式项目里比较常用的折中方案既能保证可读性又不会把原有代码搅得太乱BasedOnStyle: LLVM IndentWidth: 4 ColumnLimit: 100 AllowShortIfStatementsOnASingleLine: false AllowShortFunctionsOnASingleLine: false AlignConsecutiveMacros: true BreakBeforeBraces: LinuxAlignConsecutiveMacros: true这一项对寄存器定义块特别友好几十个#define的数值会自动对齐查表的时候舒服很多。BreakBeforeBraces选Linux是因为内核风格在嵌入式圈子里接受度最高跨团队协作时阻力最小。静态检查我走的是另一条路不额外装太重的前端插件直接把cppcheck和clang-tidy挂到任务里跑输出重定向成文件。原因是这类工具的检查规则需要按项目调前期误报会非常多做成任务按需触发比让它常驻报错更实际。等规则稳定下来再考虑接到提交钩子里。Code Spell Checker 值得单独提一句。嵌入式的注释里经常混着中英文和缩写比如cnt、buf、init这些简写它默认会标红但只要把项目里的常用缩写加到自定义词典里剩下的拼写错误基本都是真的笔误。我就在注释里抓到过volitile这种拼错的关键字注释虽然不影响编译但会误导后来看代码的人。3.3 文档与协作类GitLens 主要用来做代码溯源。嵌入式项目经常出现这种情况某段初始化代码写得很奇怪注释说是按硬件要求但看起来毫无道理。用 GitLens 的 blame 看一眼是谁在哪次提交里加的再顺着提交信息找到当时的改动说明或者关联的硬件变更单往往就能搞明白原因。这个功能在接手离职同事留下的代码时几乎是救命稻草。另外推荐 Draw.io Integration它把画流程图的界面直接嵌进 VSCode文件以.drawio.svg格式保存既能直接预览又能进版本管理。嵌入式项目里画状态机、通信协议时序、内存布局图都用得上图和代码放在同一个仓库里改了协议顺手改图比单独维护一个文档目录靠谱。4. 嵌入式 Linux、驱动与内核方向的插件组合如果你的工作内容是 Linux 嵌入式驱动开发、设备树配置、系统裁剪优化这一块插件组合需要做一次比较大的调整。原因是这类开发的代码规模完全不同内核源码动辄几千万行随便打开一个文件都可能上千行而编译环境基本都在 Linux 侧。这套场景下插件选择的优先级从方便写代码变成了方便在大规模代码里定位和理解。4.1 远程开发与 WSL把编译放到 Linux 侧内核编译必须在 Linux 环境下进行这一点没有商量余地。以前的做法是在 Windows 上写代码通过共享目录或者文件同步的方式同步到 Linux 机器上编译来回折腾很容易出现文件换行符、权限、符号链接的问题。现在的做法是直接在远程机器或者 WSL 里跑 VSCode 的服务端本地只作为显示端文件、终端、调试全部在 Linux 侧编辑体验和本地完全一致。配置的关键点有三个。一是扩展要分清楚装在哪一侧C/C 插件必须在远端装装错了会出现跳转时找不到符号的情况。二是内核源码目录要配好排除规则build目录、.git目录、生成的中间文件全部排除否则搜索一次要等十几秒。三是在 WSL 场景下注意大小写敏感Windows 文件系统不区分大小写而内核代码里有大量只靠大小写区分的文件名跨系统同步会出问题所以代码必须放在 Linux 文件系统里不要放在挂载的 Windows 盘符下。{ search.exclude: { **/build: true, **/.git: true, **/drivers/gpu: true, **/arch/*/boot: true }, files.watcherExclude: { **/build/**: true, **/.git/objects/**: true }, C_Cpp.intelliSenseEngine: default }这个配置能省掉大量等待时间。内核源码里drivers/gpu、arch/*/boot这些目录跟你的板子毫无关系但文件数量巨大索引它们纯属浪费。搜索排除之后在几千万行里找一个函数名的耗时从十几秒降到一两秒。提示修改search.exclude之后建议重启一次扩展宿主部分版本的索引缓存不会立即重建尤其是从旧配置切过来的时候。4.2 设备树、内核配置与链接脚本的语法支持设备树文件是这套开发里最容易出错的部分因为它本质上是一种自定义语法的文本写错了编译器只会给出一句位置很含糊的报错。社区里有专门针对.dts和.dtsi的语法高亮扩展装上之后节点名、属性、引用、字符串、数字会分色显示节点层级折叠也正常了。实际收益是排查起来快很多比如把i2c1写成了i2c0或者把interrupts属性写在了reg前面导致解析错误颜色一乱基本就能看出来。.config文件有专门的 Kconfig 语法高亮改配置的时候能看出哪些是m模块、哪些是y内建、哪些被注释掉了。链接脚本.ld也有对应的语法支持段定义、内存区域、对齐指令都能正确高亮。这三类文件加起来可能只占整个工程的千分之几但它们是构建产物的决定性因素出问题时最需要快速定位。另外建议打开编辑器的渲染空白字符功能。Makefile 里 tab 和空格的区别是致命的Kconfig 里也有缩进层级要求肉眼看不见的空格问题用这个功能一开就现形。4.3 固件体积分析与系统裁剪优化系统裁剪优化这件事靠感觉是调不出来的必须看数据。我的做法是在任务里加一组分析命令编译完自动跑一遍把结果输出到一个文本文件里随构建一起更新。# 各段大小总览 arm-none-eabi-size -A build/app.elf # 按符号排序找出最大的几十个 arm-none-eabi-nm --print-size --size-sort --radixd build/app.elf | tail -n 50 # 按目标文件统计定位哪个模块占得最多 arm-none-eabi-size -t build/obj/*.o | sort -k1 -n -r | head -n 30这三条命令配合起来用基本能定位绝大部分体积问题。-A看总览确认是代码段还是数据段超标nm排序找出体积最大的单个函数或者数组常见的元凶是没加const的大数组、被内联展开的浮点运算、以及链接进来但没用的库函数按目标文件统计则能看出是哪个模块整体偏大方便决定是不是要把某些功能做成可选编译。裁剪的时候有个经验先看数据段再看代码段。因为代码段超标通常可以通过开优化等级解决而数据段超标往往意味着有大的静态数组或者缓冲区是设计层面的事改起来更根本。我之前遇到过一个案例flash 用了 92%看起来是代码问题结果一查数据段里躺着一个几百字节的查找表改成用公式实时计算之后flash 和 RAM 同时降下来了。5. AI 插件怎么用才不添乱AI 辅助编码这件事在嵌入式领域的态度分成两派一派觉得补全准确率低、还容易泄露代码另一派觉得写样板代码爽到飞起。我自己用了两年多结论是AI 插件在嵌入式开发里有明确的适用边界用对了能省不少时间用错了会埋下很难查的隐患。5.1 补全、解释、生成脚本三个适用场景第一个适用场景是写重复性样板代码。比如给一个新的外设写初始化封装六个通道的配置几乎一模一样只是寄存器偏移和引脚号不同这种活交给 AI 补全改两个参数就能用。或者写一个环形缓冲区、一个简单的状态机框架这类结构高度模式化生成的代码质量通常不错。第二个场景是解释陌生代码。接手一个用了实时操作系统的老项目看到一堆任务创建、信号量、消息队列的代码让 AI 帮忙梳理一下任务之间的依赖关系和同步点比人肉读快很多。要注意的是它给出的解释只能作为线索最终还得回到源码和手册去验证尤其是涉及中断优先级和临界区的地方。第三个场景是生成配套脚本。嵌入式的开发流程里有一堆零散脚本把 bin 转成 hex、算 CRC 追加到固件尾部、批量解析串口日志画个曲线、从 map 文件里提取特定段的信息。这些事情让 AI 生成 Python 脚本非常高效而且就算写错了也很容易发现因为脚本的运行结果是直接可见的。5.2 不能交给 AI 的部分有几类内容我坚决不用 AI 生成。第一类是寄存器位域操作特别是那些带保留位、需要读改写、或者写 1 清零的寄存器。AI 生成的代码看起来很像那么回事但经常把位域宽度算错或者漏掉写保护解除的序列这种错误在编译阶段完全看不出来只有跑起来才会偶发异常排查成本极高。第二类是时序相关的代码比如某根引脚需要拉高之后延时多少微秒再拉低、某个外设上电需要一个固定的稳定等待时间。这些数值必须回到数据手册确认AI 给出的经验值没有意义因为它不知道你用的是哪个批次的芯片、外部晶振是多少。第三类是中断和安全相关的逻辑包括中断优先级配置、临界区保护、看门狗喂狗时序、以及固件升级的完整性校验。这类代码一旦有细微问题表现是偶发死机或者随机重启用调试器都很难抓。我的做法永远是手写写完自己再审一遍。还有一点是代码合规问题。有些公司的项目禁止把代码片段发送到外部服务用 AI 插件之前一定要确认清楚必要的话用本地部署的模型或者干脆只在写个人项目和验证脚本时使用。这一点不是技术问题但踩了就是大麻烦。6. 常见问题与排查实录配置环境这件事成功的样子只有一种失败的样子千奇百怪。我把这几年遇到过、也被别人问过的问题整理成一张表大部分情况下照着查就能定位。6.1 问题速查表现象可能原因处理方式头文件全部飘红compile_commands.json 未生成或路径不对重新生成并检查路径确认 compilerPath 指向交叉编译器跳转跳错位置索引使用了宿主机的宏定义检查 compile_commands.json 里的宏是否完整调试器连不上OpenOCD 配置的文件与芯片不匹配确认 interface 和 target 两个配置文件检查探针驱动断点显示为空心圆圈优化等级过高或缺少调试信息调试构建加-O0 -g确认 ELF 未被 strip变量显示 optimized out编译优化把变量优化掉了降低优化等级或把变量声明为 volatile串口日志乱码波特率不匹配逐个确认芯片时钟、分频系数、串口工具设置搜索卡顿索引包含大量无关目录配置 search.exclude 和 files.watcherExclude保存时格式化失效未安装格式化工具或未指定路径确认 clang-format 可执行文件在 PATH 中远程开发跳转失效扩展装在了本地而非远端在远端重新安装语言类扩展寄存器视图空白未配置 SVD 或被设备型号字符串写错确认 svdFile 路径检查 device 字段拼写6.2 几个踩过的坑第一个坑是编译数据库的时效性。我遇到过好几次明明代码改了跳转还是旧的查半天最后发现是compile_commands.json没更新新增的源文件根本没进索引。后来我干脆把它挂到构建任务的依赖里每次 build 完自动刷新一遍再也没出过这个问题。第二个坑是调试构建和发布构建混用。有一次调一个偶发问题反复单步都对烧到板子上就复现。折腾了一下午才发现我用的是-O0编译出来的 ELF 在调试实际烧进去的是-O2的 bin两者行为在不同优化等级下本来就可能不一样。现在的习惯是每个构建配置单独指定输出目录build/debug和build/release物理隔离避免混。第三个坑是探针固件版本。某些调试探针的固件版本和 OpenOCD 版本之间存在兼容性矩阵升级了 OpenOCD 之后连接反而失败。这种情况的典型表现是连接时提示目标电压异常或者识别不到芯片 ID但换一个工具试又是好的。遇到这种先怀疑版本组合别急着怀疑硬件。第四个坑跟 WSL 的文件系统有关。我一开始把代码放在/mnt/d/下面编译速度慢得离谱而且文件监听经常失灵改了代码触发不了重新构建。后来把代码挪到 WSL 的原生文件系统里编译时间直接缩短到原来的三分之一。原因是跨文件系统的 IO 开销很大加上文件变更事件不能跨系统传递这两点叠起来就是这个效果。7. 开箱即用的配置模板.vscode 目录怎么建一个人配环境是个人效率问题一个团队能快速配好环境是协作效率问题。我的做法是在项目根目录维护一个完整的.vscode目录包含四个文件随代码一起进版本管理。extensions.json用来声明推荐扩展新人 clone 之后打开工程编辑器会提示此工作区推荐以下扩展一键安装{ recommendations: [ ms-vscode.cpptools, marus25.cortex-debug, ms-vscode.vscode-serial-monitor, ms-vscode.cmake-tools, eamodio.gitlens, xaver.clang-format, alefragnani.bookmarks, gruntfuggly.todo-tree ] }settings.json用来统一团队的工作区设置这里不需要把所有个人偏好都塞进去只放跟项目相关的部分{ files.encoding: utf8, files.eol: \n, files.trimTrailingWhitespace: true, files.insertFinalNewline: true, editor.formatOnSave: true, C_Cpp.default.compileCommands: ${workspaceFolder}/build/compile_commands.json, search.exclude: { **/build: true, **/Drivers/CMSIS: true } }tasks.json和launch.json前面已经给过完整示例这里要强调的是路径统一用${workspaceFolder}变量而不是绝对路径。我见过有人把C:/Users/某某某/project/...提交上去结果所有同事打开都是红的这种问题排查起来非常浪费时间。还有一个细节是编码和换行符。嵌入式项目里经常需要混用 Windows 和 Linux 工具如果文件编码是 GBK在 Linux 侧编译会直接报错换行符是 CRLFshell 脚本会报没有那个文件或目录。统一成 UTF-8 加 LF 能避免这一类问题前面settings.json里那两行就是干这个的。我个人在团队里推这套模板的体会是第一次配置确实要花一两个小时把编译数据库、调试配置、排除规则都调顺。但这笔时间只花一次之后每个新人进来都是 clone 加一键装扩展当天就能进入写代码的状态。比起让每个人自己摸索、出问题各自排查这个投入回报率非常高。另外有一点要提醒配置模板做完之后别急着锁死新工具链版本、新芯片平台都会带来新的配置项每隔几个月回头看一眼tasks.json把已经不适用的旧任务清掉保持干净比不断往里加东西更重要。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →