1. 先别急着收藏:嵌入式开发者的工具清单应该按"工作流"来搭建
做嵌入式开发这些年,我最大的感受是:这个行业的工具软件永远不缺收藏,但真正每天打开、离不开的,其实就那么十几样。很多刚入行的朋友特别喜欢囤资料包、存网盘链接,电脑里躺着一堆号称"神器"的软件,可真到了要写代码、调板子、量产烧录的时候,反而不知道该怎么选。
这篇文章不是我一时兴起整理的软件列表,而是按嵌入式开发的实际工作流梳理出来的工具链全景图。我会从代码编写、编译构建、硬件调试、烧录量产、效率辅助、工程化进阶这几个环节出发,讲清楚每一类工具到底解决什么问题、为什么是它在解决、以及什么情况下你该换哪个。这样无论你是刚买了开发板准备入门,还是已经做了两三年项目想在工具链上做优化,都能找到自己需要的那一块拼图。
在正式开始之前,先说明白一件事:嵌入式开发和纯软件开发的工具选择逻辑有很大不同。纯软件的工具链相对统一,而嵌入式因为涉及芯片架构、交叉编译、硬件调试器、BootLoader、产线烧录这一整套链路,工具的选择往往被芯片平台和团队协作方式提前框定了一大半。所以下面的介绍我不会简单地说"这个好那个差",而是把每个工具的适用场景和取舍逻辑讲清楚,你照着实际项目情况去选就行。
这篇清单我会持续维护,凡是我在实际开发中真正用过、并且觉得值得推荐的工具,都会慢慢补充进来。如果你也有私藏的好工具,欢迎在同行群里交流互换,嵌入式的工具链本身就是一代代工程师互相抄作业抄出来的。
2. 从IDE选型说起:先看你做的是哪个层次的嵌入式
IDE是每个嵌入式开发者进入项目的第一道门。我不太赞成网上那种"某某IDE最强"的论调,因为嵌入式开发的层次差异太大了——你是做Cortex-M的单片机裸机开发,还是跑嵌入式Linux做应用层,甚至是在做RISC-V的底层BringUp,用的IDE完全是两码事。选IDE的第一步,不是问"哪个好",而是问"我的芯片平台和开发方式是什么"。
2.1 单片机开发:Keil MDK、IAR、STM32CubeIDE三选一
在ARM Cortex-M这个主战场,80%的开发者绕不开这三款:Keil MDK(现在叫Keil Studio,但大家习惯叫Keil)、IAR Embedded Workbench、STM32CubeIDE。我给个直观的对比,方便你快速定位自己的需求。
| 对比项 | Keil MDK | IAR EWARM | STM32CubeIDE |
|---|---|---|---|
| 适用芯片 | ARM Cortex-M/A系列为主 | ARM、RISC-V、AVR等 | STM32全系列 |
| 编译器 | armcc(AC5)/ armclang(AC6) | IAR C/C++ Compiler | arm-none-eabi-gcc |
| 代码补全 | 弱,基本靠手打 | 中等 | Eclipse系,中等偏上 |
| 资源占用 | 低,老电脑也流畅 | 低 | 高,建议16GB内存起步 |
| 许可证 | 商业收费,评估版受限 | 商业收费,评估版受限 | 免费、开源 |
| 核心优势 | 教程多、资料多、上手快 | 代码密度小、优化质量高 | 免费、CubeMX配置无缝集成 |
如果你是刚开始学STM32,Keil是绕不开的选项——不是因为它最好,而是因为你在网上搜到的教程、例程、老师傅的工程模板,十有八九是基于Keil的。这种生态粘性在嵌入式里非常恐怖,哪怕它界面老旧、代码补全约等于没有,你也得先学会用它。
如果你做的是量产产品,且对Flash占用和代码执行效率有硬性要求,IAR值得重点关注。同样的代码,IAR编译出来的bin文件经常比GCC系小5%到10%,在芯片Flash选型卡得很紧的项目里,这个差距就是真金白银。代价是IAR的正版授权价格不低,界面风格也和主流IDE差异大,团队新成员学习成本偏高。
如果你是ST平台且想省掉CubeMX和IDE之间来回倒腾的麻烦,STM32CubeIDE是个很好的选择。它把引脚配置、时钟树、中间件集成到了一起,生成代码后直接编译调试,不用像Keil那样先CubeMX生成再导入工程。缺点是Eclipse内核太吃内存,工程大了之后索引和编译都偏慢。
2.2 嵌入式Linux开发:VSCode或CLion,别再守着老Eclipse了
做嵌入式Linux(跑着系统、用文件系统、应用层C/C++开发)的朋友,工具选择和单片机开发完全不同。你根本不需要Keil,更不需要IAR,你需要的是一个能高效写代码、方便交叉编译、能远程到板子上调试的通用IDE。
我个人现在的主力方案是VSCode + Remote SSH + CMake Tools + C/C++插件。工作流是这样的:把VSCode远程连接到Linux开发机或板卡上,代码在本地编辑、在远端编译运行,调试用GDB或gdbserver。这套方案的体验已经很接近现代IDE了,关键是免费、生态插件多、跨平台一致性好,换电脑之后同步一下配置就能恢复工作环境。
JetBrains全家桶用户可以考虑CLion,它对CMake工程的支持比VSCode更完善,重构、调试、代码导航都更智能。配合一个叫STM32CubeMX集成的插件,CLion也能做单片机开发,我身边有不少搞底层固件的同事就是从Keil迁到CLion的。
那为什么我不建议用Eclipse CDT做嵌入式Linux呢?不是不能用,而是Eclipse的索引机制和现代工程结构配合得越来越吃力,尤其是碰到大型代码仓库和复杂CMake嵌套,卡顿和误报会让人失去耐心。除非团队里已经有一套成熟的Eclipse工程遗产,否则没必要从零开始选Eclipse。
2.3 顺带回答一个常被问到的问题:VB6.0能编程嵌入式硬件吗
在嵌入式相关热词里看到"vb6.0可以编程嵌入式硬件吗"这个问题,我觉得有必要专门说两句。VB6.0不能用来开发单片机或Linux板卡的固件程序,这是肯定的——它编译不出来ARM指令集的机器码,也没有对应的交叉编译器。
但如果你把"编程嵌入式硬件"理解成"和嵌入式硬件交互、做上位机控制软件",那VB6.0在十几年前确实是很多老工程师的选择。它配合MSComm串口控件,写个简单的上位机去控制单片机、采集传感器数据,完全不复杂。现在再做上位机,我更推荐用Python + pyserial、C# WinForm或者Qt,开发效率更高,界面也更好看。但如果你维护的是老设备的老上位机代码,那我只能说——VB6.0至今还能在很多工控老机器上跑,这种遗产代码的生命力远超你的想象。
3. 编译构建与版本管理:工具链和构建脚本是项目的骨架
选定IDE之后,紧接着就是编译环节。很多人以为编译就是点一下IDE里的Build按钮,但在嵌入式项目里,交叉编译工具链、构建系统、版本管理这三样东西,决定了你的项目能不能稳定复现、能不能多人协作、能不能从一个小Demo长成一个正经产品。
3.1 交叉编译工具链到底怎么选
交叉编译是嵌入式的核心概念:你的代码是在x86主机上编译的,但运行目标却是ARM、RISC-V或者其他架构的芯片,所以必须用一套"目标架构"的编译器来生成机器码。工具链选不对,后面全是坑。
裸机MCU开发(Cortex-M、RISC-V MCU)最通用的是arm-none-eabi-gcc,名字里的"none"表示没有操作系统,"eabi"表示嵌入式应用二进制接口。ST官方的STM32CubeIDE内置的就是这套编译器,你也可以单独安装后配合Makefile工程使用。RISC-V MCU则对应riscv64-unknown-elf-gcc。
嵌入式Linux板卡开发(比如基于Cortex-A系列跑Linux)要的是aarch64-linux-gnu-gcc(64位ARM)或arm-linux-gnueabihf-gcc(32位ARM,带硬件浮点)。注意这里的交叉编译工具链名字里带的是"linux-gnu",说明它依赖目标板上的Linux系统库,和你编译出来的应用是运行时绑定关系。
这里有个非常容易踩的坑:编译器版本和SDK依赖不匹配。芯片厂商的SDK往往是针对特定GCC版本验证的,你图新装了个更高版本的工具链,编译时可能报一堆莫名其妙的错误,最后定位到是GCC版本升级导致的行为差异。我的建议是:优先用芯片厂商SDK自带的工具链或官方推荐的版本,别在这方面追新。等工程跑通了,再考虑升级工具的收益。
3.2 CMake还是Makefile:我建议直接上CMake
我见过太多老工程师守着Makefile不放,理由是"写了十几年了没必要换"。但近几年芯片厂商的新SDK(比如STM32CubeMX生成的工程)都已经默认支持CMake了,嵌入式项目的构建系统正在经历从Makefile到CMake的迁移。
Makefile的优势是轻量、直觉、写起来快,但一旦项目规模上来,模块一多、依赖一复杂,Makefile的维护成本是指数级上升的。CMake的跨平台能力强、可以生成各种IDE工程(包括VSCode、CLion、Eclipse)、支持模块化组织和条件编译,而且通过CMakePresets可以很方便地管理多套编译配置(Debug/Release、不同板卡变体)。
如果你现在还在用Keil这种自带工程的IDE,那构建系统其实是IDE帮你包好的,你大概率感知不到CMake和Makefile的区别。但一旦你开始做Linux嵌入式、做持续集成(CI)、做自动化测试,CMake基本是必选项。我现在的建议是:新项目一律用CMake,老项目如果重构成了麻烦,那就继续用现有的Makefile,不必为了技术时髦而折腾。工程上"跑得好好的就别乱动"也是一种智慧。
3.3 Git在嵌入式里的正确用法:不止是提交代码
嵌入式项目管理代码,很多人只把Git停在"提交-拉取"这个层面,但实际项目里会碰到不少嵌入式特有的问题。
首先是大的二进制文件:固件包、SDK压缩包、编译产物、字体资源,动不动几十上百MB。直接塞进Git仓库,仓库体积会迅速失控。解决办法是使用Git LFS(Large File Storage),把大文件用指针替换提交,真正的内容存在LFS服务器上。我在一个带UI资源的项目里就吃过这个亏,早期没上LFS,仓库克隆一次要下载几个GB,后来迁移到LFS才彻底解决。
其次是子模块管理:很多嵌入式项目依赖芯片厂商的SDK库、中间件源码,你把整个SDK复制进自己仓库里,既臃肿又难升级,用git submodule或者Android式的repo工具做多仓库管理会更干净。SDK子模块有独立版本,主工程锁定子模块版本,再配合带tag的发版策略,团队协作会舒服很多。
最后是提交前检查:我建议在Git的pre-commit钩子里挂上cppcheck静态检查或者代码格式化工具。这样做有一个实际好处——很多格式问题、明显错误能卡在提交之前,不用等到代码评审时被人反复挑刺。别觉得这些是纯软件工程的概念,嵌入式团队上了这套流程,Review代码时的体验会好一个档次。
4. 硬件调试与诊断:真正拉开差距的软件工具
写代码只是嵌入式开发的一部分,真正考验水平的,是你出了问题之后能不能快速定位。这一段是整套工具链精华中的精华,也是我觉得最值得花时间投资的环节。
4.1 调试器软件生态:OpenOCD与J-Link全家桶
单片机调试器的软件生态,基本被两大阵营瓜分:开源的OpenOCD(Open On-Chip Debugger)和SEGGER的J-Link全家桶。
OpenOCD本身不挑调试器,ST-Link、CMSIS-DAP、J-Link它都能驱动,配合GDB做调试。使用上,一条命令就能启动调试服务:
openocd -f interface/stlink.cfg -f target/stm32f1x.cfg启动后默认监听3333端口,然后用GDB连接:
arm-none-eabi-gdb build/firmware.elf (gdb) target remote localhost:3333 (gdb) load (gdb) continueOpenOCD的优点是免费、开放、脚本化能力强,适合在CI环境里做自动化烧录和测试。缺点是配置门槛高,不同开发板的cfg文件要自己调,出问题时要查的文档也比较专业。
J-Link这边就简单粗暴了,SEGGER提供了一整套配套软件:J-Flash用来烧录,J-Link RTT Viewer用来做实时日志输出,SystemView用来做RTOS级别的可视化跟踪调试。
这里我要特别推荐RTT Viewer。传统调试单片机打日志,要么用串口——但串口往往被占用或波特率有限制,要么用ITM/SWO——但需要额外的引脚连接。RTT的本质是在调试器和芯片之间通过JTAG/SWD接口跑一个"内存通道",日志输出速度极快,而且完全不需要额外接串口线。固件里接上SEGGER RTT库,在RTT Viewer里就能实时看到printf输出。我做过一个高速电机控制的项目,PWM占空比调节周期是微秒级,串口日志完全跟不上,RTT输出几乎不影响实时性,这个工具直接拯救了当时的调试工作。
4.2 串口工具与逻辑分析仪:日志和波形两手抓
串口基本上是嵌入式调试的生命线,选一个好的串口工具能大幅提升幸福感。Windows下我常用MobaXterm,它本身是一个终端工具,但内置了串口连接功能,不用再单独装一个串口助手。老牌的SSCOM、XCOM也各有拥趸,前者功能全、后者界面干净。如果你需要把串口数据画成波形,**VOFA+**是个好东西,支持多种数据协议,能把传感器数据实时可视化,调PID参数时尤为好用。
除了串口,逻辑分析仪是排查时序问题的利器。硬件上一个几十块的Saleae逻辑分析仪克隆版就能覆盖大部分调试场景,软件配合原厂Logic软件或者开源的PulseView,可以解析UART、SPI、I2C、CAN等常见协议。我处理过一个I2C通信偶发卡死的问题,靠示波器看了一天没头绪,换逻辑分析仪抓了整段时序才发现是从机在第9个时钟周期的ACK信号被拉低超时导致的。软件协议解析功能在这种场景下比裸看波形高效得多。
4.3 嵌入式Linux板卡上的远程调试与现场排查
如果你做的是嵌入式Linux项目,调试工具又换了一套。远程调试最典型的组合是gdbserver + gdb:在板子上跑gdbserver,主机上用arm-linux-gdb连接,就可以像本地调试一样打断点、看变量。
现场排查问题不用IDE,我更依赖命令行工具的trio组合:strace跟踪系统调用、top / htop看CPU内存占用、cat /proc/interrupts看中断触发情况。查网络问题用tcpdump + Wireshark:板子上tcpdump抓包保存为pcap文件,拷贝到电脑上用Wireshark分析,链路层面什么问题都藏不住。
还有一个经常被忽略的命令行工具是devmem,它可以直接读写物理内存地址,在调试寄存器映射和外设驱动时非常有效。比如怀疑某个GPIO寄存器的值不对,手头又没接调试器,直接用devmem读一下对应地址就知道状态了。
5. 烧录与量产:交付环节才是最考验工具成熟度的地方
很多人学嵌入式只到"板子能跑"就停了,但实际工作中,固件的烧录、升级、量产这一整套流程,才是真正考验工具链是否成熟的地方。
5.1 开发阶段的烧录方式选择
调试阶段的烧录,最省事的是在IDE里直接点下载,Keil配合ST-Link、IAR配合J-Link都是开箱即用。但如果你的工程用CMake构建,想在命令行里完成烧录,那就需要掌握几个命令行工具。
ST单片机可以用STM32CubeProgrammer的命令行模式:
STM32_Programmer_CLI -c port=SWD mode=UR -w build/firmware.hex -v参数解释一下:-c port=SWD mode=UR表示使用SWD接口并以用户模式连接,-w指定要烧写的固件文件,-v表示烧录后校验。UR模式(under reset)在芯片被读保护或连接不稳定时很管用。
J-Link用户则用J-Flash做图形化烧录,也可以用它内置的命令行模式JFlashLite做快速烧写。J-Flash对量产批量烧录很友好,可以保存烧录配置,产线操作员只需要点两下鼠标就能完成烧录和校验。
5.2 产线批量烧录:序列号、MAC地址和校准数据
量产环节和开发调试有很大不同:产线上几百块板子等着烧录,每一块可能还需要烧入不同的序列号、MAC地址、校准参数。如果还靠人工一个个点J-Flash,效率太低且容易出错。
更高效的做法是用自动化脚本,比如在产线工位上运行一条STM32CubeProgrammer命令,烧录完公共固件后,再通过命令行参数把序列号写入Flash指定的偏移地址:
STM32_Programmer_CLI -c port=SWD mode=UR -w build/firmware.hex -v STM32_Programmer_CLI -c port=SWD mode=UR -s 0x080FF000 -v 0xA5A50101 0x4D594300第一条命令烧录公共固件,第二条把序列号等数据写到片内Flash的指定扇区。这样产线操作员只需要扫描枪扫一下工单的二维码,脚本自动生成序列号参数并完成烧录,整个过程由自动化脚本驱动,人为犯错的空间就小多了。
另外,产线烧录时一定要注意烧录校验。-v参数就能触发写后校验,虽然会让烧录时间增加一点,但相比出货后才发现固件损坏的返工成本,这点时间完全是值得的。
5.3 OTA升级与BootLoader烧录
量产之后还有升级需求,现在越来越多的产品走OTA远程升级。这时就涉及BootLoader的设计。开源方案里MCUboot是比较成熟的选择,支持固件签名校验、A/B分区切换,安全性和可靠性都比自己从零写一个BootLoader要强。
有些小资源MCU不适合跑MCUboot这么大的框架,那就自己写精简BootLoader,但不管用什么方案,都建议在BootLoader里保留一个"强制升级模式"的入口——比如上电时检测某个GPIO引脚电平,为低则进入BootLoader等待升级,否则跳转到App运行。这个机制在产线烧录和现场返修时非常实用,能救回很多一台变砖边缘的设备。
6. 效率与辅助工具:提升嵌入式开发幸福感的小东西
工具链讲完主流程,再来说说那些不直接参与编译调试、但能让你每天工作顺畅度提升一个档次的软件。这些工具单个看起来不惊人,组合起来才是真正的生产力。
6.1 VSCode插件:把VSCode变成嵌入式IDE的关键拼图
如果你像我一样用VSCode做嵌入式开发的主力编辑器,下面几个插件是我机器上必装的:
- C/C++:微软官方插件,提供IntelliSense、调试和代码浏览能力,基础中的基础。
- Embedded IDE:这个插件专门面向嵌入式开发,支持Keil工程导入、GCC工具链配置、烧录调试一键执行,极大弥补了VSCode在嵌入式集成上的短板。
- Cortex-Debug:配合OpenOCD或J-Link在VSCode里调试Cortex-M内核的利器,能看寄存器、外设、RTOS任务状态。
- CMake Tools:CMake工程的不二选择,配置编译套件、构建、运行测试都很方便。
- Remote - SSH:远程连接Linux开发机或板卡,把"本地写代码、远端编译调试"工作流做到极致。
- GitLens:查看代码历史和作者信息,多人协作时快速定位某行代码是谁改的、为什么改。
- Todo Tree:在代码里搜索TODO、FIXME等标记并在侧边栏集中展示,项目里遗留问题一目了然。
以前我开发STM32还得在Keil和VSCode之间来回切换,现在用Embedded IDE插件直接在VSCode里搞定编辑、编译、烧录、调试,Keil基本只用来查看某些老工程的代码了。
6.2 代码阅读与比对的几个利器
嵌入式开发经常要面对不是自己写的代码:芯片厂商的SDK、同事的历史工程、第三方的协议栈。这时候代码阅读工具的差距就很明显了。
Windows下老牌的是Source Insight,订阅成本不高,代码索引和跳转比大多数IDE都快,阅读几百万行的大仓库也不卡。开源免费替代是SourceTrail,功能和Source Insight类似,在GitHub上维护得不错,适合预算敏感的个人开发者。
代码比对方面,Beyond Compare是绕不开的标准答案。目录同步、文本比对、十六进制比对都很强大,尤其在对比两个版本固件源码差异、核对生成配置是否正确时极其高效。虽然它是付费软件,但我个人觉得这笔钱花得值。
6.3 终端、截图、文件搜索,小工具也有大作用
终端工具上,Windows下我推荐Windows Terminal + MobaXterm组合:前者负责本地命令行体验,后者负责串口和SSH远程。Windows系统自带的cmd和PowerShell在串口调试上的体验还是差了一些。
文件搜索用Everything,Windows下几乎是秒出结果,早期局域网共享盘上的SDK包、驱动文件、文档查找效率会提升一个级别。
截图我用Snipaste,贴图、标注方便,在记录Bug、写问题描述时效率特别高。它不只是截图工具,还能把截图钉在屏幕上作参考——对照寄存器数据表和代码写驱动的时候,这个功能能省去大量来回切换窗口的时间。
7. 进阶玩法:静态分析、测试与代码生成的工程化之路
工具链用顺之后,接下来应该考虑工程化能力的提升。这一章的内容不是必须,但如果你所在团队在往正规化、高质量方向走,或者你自己想摆脱"野路子"的标签,这部分迟早要用到。
7.1 静态分析工具:让代码问题在编译前就被发现
编译器能帮你查语法错误,但查不出逻辑隐患。cppcheck是我用得最多的开源静态分析工具,可以在不运行代码的情况下发现空指针解引用、内存泄漏、越界访问等问题。用法简单:
cppcheck --enable=warning,style,performance,portability src/如果团队预算充足,商用方案Coverity和PVS-Studio的检测能力和误报控制做得更好,但小项目用cppcheck配合理配置已经足够。
值得提醒的是,静态分析工具不可能完全不报误报,关键在于团队怎么对待这些报告。我建议尽量把检查规则嵌入CI流程,而不是靠人定期手动跑一下,否则很快就会被遗忘。
7.2 单元测试框架与覆盖率统计
嵌入式开发想做单元测试,最大障碍是代码依赖硬件寄存器。常见的解法是靠mock硬件层,把代码编译到开发机(x86)上运行测试,硬件操作全部用mock替换。
框架方面,C语言用Unity + CMock或CppUTest,C++用GoogleTest。以CppUTest为例,可以在PC上编译运行测试,配合gcov/lcov统计代码覆盖率,在CI上生成覆盖率报告。
gcc -fprofile-arcs -ftest-coverage test_foo.c foo.c -o test_foo ./test_foo lcov --capture --directory . --output-file coverage.info genhtml coverage.info --output-directory html可能有人会说:嵌入式代码依赖太多硬件外设,怎么测?我的观点是,恰恰因为依赖硬件,才更需要把核心逻辑和硬件操作解耦。能把算法逻辑、状态机、协议解析这些纯软件部分用单元测试覆盖起来,已经能解决大部分返工问题了。
7.3 从Simulink到STM32的自动代码生成:MBD开发模式
如果你做的是电机控制、电力电子、飞控这类对算法要求极高的领域,一定听过Model-Based Design(MBD)。在热词里也看到了"基于Simulink自定义目标系统与STM32的嵌入式控制代码自动生成研究",这确实是目前工控圈很热的开发方式。
流程大致是这样:在Simulink里建立控制算法的模型框图,仿真验证通过后,用Embedded Coder自动生成C代码,再集成到STM32工程里编译烧录跑起来。核心价值在于算法层面的验证在仿真阶段就完成了,大幅缩短了手写代码引入bug带来的调试周期。
但MBD不是银弹。自动生成的代码可读性不如手写,调试时需要对照模型理解生成逻辑;而且用Simulink做MCU代码生成,license成本不低。我个人的建议是:算法复杂度高、传统手写Matlab/C原型转换容易出错的场景才值得上MBD,简单的中断逻辑和状态机用不上这套重型工具链。
7.4 深挖Bug的一把利刃:反汇编与逆向工具
最后说一个比较"硬核"的进阶工具:反汇编。当编译优化开得太高、调试器看到的变量值全是"optimized out"的时候,你就需要打开反汇编窗口,直接看编译出来的汇编代码来判断程序到底在干什么。
Linux下可以用objdump -d firmware.elf查看反汇编,也可以用Ghidra做深度的逆向分析。Ghidra是美国国家安全局开源的逆向工具,功能非常强大,但学习曲线陡峭。嵌入式开发中我用到它的场景主要是:分析不明来源的固件、排查某个崩溃地址对应的是哪段代码逻辑、以及理解C代码在特定优化下的汇编执行路径。不常用,但关键时候是能救命的技能。
在调试严重问题时,我还有一个经验:先怀疑编译器优化,再怀疑自己的代码。我曾经在O2优化等级下遇到过一个诡异的问题——某个全局变量的值在某次中断触发后莫名其妙丢失,排查了半天才发现是编译器把它优化到了寄存器里,而中断处理函数和主函数的执行流程之间破坏了寄存器的预期关系。解决办法就是在变量声明前面加volatile关键字。这类问题,纯粹靠看C代码是看不出来的,必须结合反汇编确认编译器的实际行为。
语文功底结业的土办法:SVN时代的类比已经过时,Git LFS才是大文件管理的正确解法。这句话扯远了,还是再分享一个小技巧作为收尾吧。
如果你正在准备嵌入式岗位的面试,或者整理自己的学习路线,建议把工具链的掌握程度当作一项硬技能来对待:不光会用,还要能说清楚"为什么选它""它和替代品的差异是什么""某个工具在特定场景下的坑在哪里"——面试官问到的可能性极高,而且这是一个比背八股文更能体现工程经验的话题。
这篇工具清单我会长期维护,还在持续探索好用的新工具。每次换开发环境、进新项目,我都会重新审视一遍这个清单,确认哪些工具真的值得留下。你对哪个环节的工具选型有疑问,或者有什么私藏的好工具,欢迎来找我交流。