做嵌入式开发,桌面上的IDE来来去去,但Keil这个老伙计始终绕不开。无论你是刚拿起STM32的初学者,还是已经搞了十几年单片机的老工程师,总有一个阶段必须跟它打交道。很多新手第一次接触Keil时最头痛的就是版本:MDK、C51、C251、C166,光看名字就劝退,再加上注册激活、芯片支持包、调试器驱动、汉化与卸载这些乱七八糟的坑,一天踩下来心态直接崩。这篇文章把我从装第一版Keil到现在踩过的所有坑整理出来,从版本选择、安装包获取、激活方式到高频报错和调试技巧,一次性讲透,适合所有准备入坑和正在被Keil折磨的人。
1. 先搞清楚Keil到底有几个版本,别再下错了
1.1 MDK、C51、C251、C166到底什么关系
Keil这个品牌底下其实有好几套完全独立的工具链,它们共用同一个Uvision界面,但是编译器内核和芯片支持完全不一样。很多人拿着C51的安装包去编译STM32,折腾半天一脸懵,就是没搞懂这个关系。
| 版本 | 支持的芯片内核 | 典型应用场景 |
|---|---|---|
| Keil C51 | Intel 8051及各种增强型51 | STC89C52、AT89S52、传统51教学与工控 |
| Keil C251 | 8051扩展的251系列 | 华邦W77/W78等,现在基本绝迹 |
| Keil C166 | C166/XE166家族 | 老一代汽车电子,已经很少人用 |
| Keil MDK-ARM | Cortex-M/R以及部分Cortex-A | STM32、GD32、NXP、瑞萨RA等32位MCU,主流中的主流 |
MDK-ARM现在完整的叫法是Keil MDK,内部又分AC5和AC6两代编译工具链。AC5是老牌的ARMCC,稳定但不再更新,AC6是基于Clang的ARMCLANG,新版本Keil默认走AC6。很多老工程拿到新Keil上编译报一堆警告,多半就是AC5到AC6切换造成的语法差异。
1.2 怎么判断自己该装哪个版本
判断方法其实很简单:看芯片内核。用51内核的,装C51;用Cortex-M/R内核的,装MDK-ARM。两者可以共存,也经常需要共存——实验室里上一秒还在调STC89C52,下一秒切到STM32F103,是再常见不过的事。
我的建议是分开装,目录也别放一起。C51装到C:\Keil_C51,MDK装到C:\Keil_MDK。有人会把C51和MDK装到同一个目录共用Uvision,这样打开一个IDE就能切换工具链,听起来很爽,但实际用起来经常出问题,尤其是Pack管理器和License管理组件互相干扰。踩过几次坑之后,我宁可桌面上放两个图标,也不想再在共用目录的坑里浪费时间。
2. 安装前准备:安装包、芯片支持包与目录规划
2.1 安装包从哪来,如何确认靠谱
安装包优先从Keil官网下载,这是最稳妥的来源。官网会区分MDK-ARM、C51、C251这些大版本,下载页面也能看到较新的版本号,比如常见的MDK 5.37、5.38等。社区和网盘里流传的各种“全部版本安装包合集”,也确实能解决老版本下载不到的问题——有些公司指定版本开发,官网不提供旧版下载,只能找这种渠道。
但网盘资源有个隐患:容易被二次打包。下载后第一件事就是核对文件大小和哈希值,官网或者发布者的原始校验信息比对一下。如果安装包体积和官方差很多,或者解压时杀毒软件疯狂报警,建议直接删掉重找。安装包这种东西,出了问题影响整个开发环境,不值得冒险。
2.2 芯片支持包和Keil本体是两回事
很多新手第一次接触Keil,容易被“Pack”这个概念搞晕。简单理解,Keil本体是一个编辑器加编译器的壳,它本身并不知道STM32F103C8T6有哪些寄存器、Flash有多大、怎么初始化。这些信息全部来自芯片支持包,也就是Device Family Pack,简称DFP或者Pack。
没有对应的Pack,你在Device列表里就找不到这颗芯片,工程就建不起来。所以装完Keil之后,紧接着要安装对应芯片的Pack。现代Keil打开工程时如果发现缺少Pack,会弹窗提示或者直接用Pack Installer去找,这一步看起来自动化,却也是新手翻车的高发地——自带的Pack Installer访问国外服务器经常超时,卡在下载界面半天没反应。
2.3 建议的目录规划和环境变量
安装时目录里尽量不要出现中文和空格,这个老生常谈,但总有人图省事直接装在“D:\软件\Keil”下面。Keil对路径中的空格和中文支持并不完善,编译某些老工程时会出莫名其妙的问题,什么找不到文件、无法打开头文件都有可能是路径引起的。
Pack的默认安装位置一般放在C盘,具体路径由环境变量CMSIS_PACK_ROOT决定。默认通常是C:\Users\用户名\AppData\Local\Arm\Packs,或者Keil安装目录下的ARM\PACK。如果C盘空间吃紧,可以在安装前就修改环境变量,把Pack目录指到D盘或者E盘。操作方法是:右键此电脑 -> 属性 -> 高级系统设置 -> 环境变量 -> 新建,变量名填CMSIS_PACK_ROOT,值填目标目录,比如D:\Keil_Packs。建好之后再把原来Pack目录下的内容整个复制过去,重启Keil就会从新目录加载。
3. 完整安装与激活流程实录
3.1 安装步骤拆解
以MDK-ARM为例,完整的安装过程其实很简单,关键是几个容易忽略的细节。
第一步,右键安装包,以管理员身份运行。这一步不做,后续写入C盘和注册表有可能权限不足,导致一些很诡异的故障。
第二步,一路Next到选择组件。Keil的安装组件里包含几个可选项,比如Segger的J-Link驱动、ARM的GCC工具链等。我的做法是全选,因为J-Link驱动后面调试基本用得上,与其之后再单独装,不如装Keil时一并带上。
第三步,选择安装目录。按前面说的,C51和MDK分开装,路径不要带中文空格。
第四步,填用户信息。这里随便填公司名和邮箱都行,不要写成中文即可。
安装完本体后,打开Pack Installer安装需要的芯片Pack。如果自动下载失败,就手动到官方Pack下载页找到对应芯片的.pack文件,下载后双击,Keil会自动导入。
3.2 激活与注册的完整流程
Keil MDK不激活的话,只能以评估模式运行,编译代码有32KB的大小限制,学习或做稍微大一点的工程完全不够用。所以很多个人开发者都会走社区通用的激活方式,也就是注册机。
这里先说明一句:注册机只建议用于个人学习与项目评估,商业产品和公司项目请购买正版授权,这既是对版权的尊重,也能保证工具链的长期稳定更新。
激活流程大致是:
- 打开Keil,点菜单栏File -> License Management,会看到一个许可管理窗口。
- 窗口里有当前电脑的CID码,一长串字符,先完整复制下来。
- 打开注册机,Target那一栏选择对应的工具链。ARM系列选ARM,51系列选C51,选错生成出来的许可没法用。
- 把CID粘贴到注册机对应位置,点Generate生成激活码。
- 把激活码复制回Keil的License Management窗口中,点击Add LIC即可。
整个过程不需要联网,Keil的License校验是本地完成的。有一个很常见的坑:注册机是破解软件,会被Windows Defender或者第三方杀毒直接删除,下载后要在杀毒软件里加白名单,或者暂时关闭实时防护再运行。用完之后记得恢复防护。
另一个高频问题就是“注册机时间过期了怎么办”。这种一般不是注册机真的过期,而是电脑系统时间被改了,或者许可证校验时发现系统时间比生成许可时晚。先把系统时间改成当前正确时间,再重新用注册机生成一次许可就好。千万别为了延长试用期去改系统时间,Keil的校验机制对时间很敏感,改来改去只会把自己绕进去。
3.3 如何正确卸载Keil
卸载Keil看似简单,直接控制面板卸载就行,但很多人卸载完重新安装,发现还是乱,就是因为没删干净。
正确顺序是:
- 先到控制面板或者设置里卸载Keil本体。
- 手动删除安装目录,比如C:\Keil_MDK,因为卸载程序通常会残留大量文件。
- 删除Pack目录,包括默认路径下的Arm\Packs,如果你设置了CMSIS_PACK_ROOT环境变量,把对应目录也删掉。
- 打开注册表编辑器,搜索Keil、ARM、Uvision等相关关键字,删除残留项。这里不要乱删系统项,只找与Keil相关的。
- 删掉环境变量CMSIS_PACK_ROOT。
- 重启电脑再安装。
不彻底清理的后果就是:重装后旧版本的Pack和插件还在,版本冲突、License验证失败等问题接踵而来。反正卸载这种事,做一次到位,后面能省很多事。
4. 芯片支持、第三方芯片与Pack管理
4.1 Pack Installer硬件错误怎么处理
“pack install 硬件错误”这个关键词在搜索里出现频率很高,不少人在Pack Installer里点安装,报错提示五花八门,什么http错误、下载失败、无法解析服务器地址。说白了,大部分是网络问题,Keil的Pack服务器在海外,国内访问不稳定是常态。
解决方案也简单:
一是手动下载Pack文件。到Keil官网的Pack列表页面,找到芯片厂商和对应系列,下载.pack文件到本地,然后双击安装。Keil会直接识别并导入。
二是把.pack文件改名成.zip,用解压工具解压,然后把解压后的文件夹手动放到Pack目录下。注意目录结构要与Keil的预期一致,通常是厂商名\芯片系列\版本号这样的层级。
三是用国内芯片厂商提供的一键安装包。ST、GD32、瑞萨这些大厂都提供了自己的Pack或工具链整合包,从官网下载安装更方便,还能避开Keil服务器的问题。
4.2 STC、GD32、瑞萨RA等常用芯片支持方法
不同芯片厂商在Keil上的支持方式差异很大。
STC是老51用户最常用的。STC的芯片在Keil C51里默认不直接出现,需要用STC-ISP软件把型号导入。操作是:打开STC-ISP,找到“Keil仿真设置”或者“添加型号和头文件到Keil”的按钮,选择你的Keil C51安装目录,软件会自动复制STC的器件数据库和头文件。导入完成后新建工程,Device列表里就能看到STC系列了。注意导入目标是C51目录,如果选成MDK目录,会发现没有任何反应。
GD32是国产ARM里非常火的一类MCU,Clinux风格和STM32很接近。GD32官网提供了自己的Pack文件,下载后双击安装,就能在Keil MDK的Device列表里找到GD32F1、GD32F3、GD32F4这些系列。部分型号和ST同封装兼容的,理论上也可以用STM32的Pack建工程,但为了芯片内部资源定义准确,还是建议用官方Pack。
瑞萨RA系列的玩法不太一样。RA系列使用瑞萨的RASC(RA Smart Configurator)来配置引脚和外设,生成代码后再导入Keil MDK编译。使用流程是:先安装RASC,在其中新建工程选择MCU型号,配置时钟、串口、GPIO等,然后选择生成Keil工程(有些版本是生成EWARM或者Keil两种),生成后会得到一个带工程文件的文件夹,用Keil打开即可。这里有个兼容性要求:RASC版本对Keil版本有最低要求,生成工程时如果Keil版本太老,会编译不过。建议把Keil MDK保持在一个较新的版本上。
4.3 更改Pack包路径的两个场景
修改Pack路径的需求一般出现在两种情况:一是C盘空间不够,想把Pack挪到大容量盘;二是多电脑开发,想把已经下载好的Pack同步到一个共享目录,省得每台电脑重新下载。
使用CMSIS_PACK_ROOT环境变量就能解决。具体操作前面已经写过,这里补充一个容易踩的坑:改完环境变量后,Keil不会自动帮你迁移原来的Pack目录,你得手动把旧的Pack文件夹整个拷贝到新路径下。另外,Pack目录里有时候会有.lock这类临时文件,拷贝前先关闭Keil,否则文件占用会导致拷贝不完整。
还有一种做法是直接把Keil的安装目录整体搬到其他盘,再用环境变量指定。这个方法理论上可行,但牵扯到注册表、启动程序等一堆东西,运气不好Keil直接起不来。我实际的建议是:Pack路径用环境变量管理,Keil本体老老实实装到目标盘,不要二合一折腾。
5. 调试实战:这些功能比你想的更有用
5.1 Debug模式怎么看结构体变量
调试时想看结构体,这个问题几乎每周都有人在群里问。操作其实很简单,Debug运行后,在View菜单打开Watch窗口,我一般习惯开Watch1和Watch2两个窗口,一个看全局状态,一个看局部变量。
然后在Watch窗口的空白行直接输入结构体变量名,比如myStruct,回车。左边会出现一个三角箭头,点开就是结构体的各个成员,成员名和值一目了然。如果结构体是数组,还可以右键选择“Expand All”一次性展开所有元素,比手动一个个点快得多。
如果输入结构体名后显示“not in scope”或者“Cannot access”,那说明当前断点停在的位置不在这个变量的作用域内,或者变量被编译器优化掉了。解决办法是把断点移到使用这个结构体的函数内部,或者将优化等级调低。在Options for Target -> C/C++里把Optimization改成Level 0,调试体验会明显改善,代价是代码体积变大、运行变慢。这本来就是调试和优化的固有矛盾。
5.2 调用栈、堆栈监控与软件仿真
看堆栈和调用栈是调试复杂问题的利器。Debug状态下按Ctrl+F11或者菜单View -> Call Stack Window,就能看到当前函数的调用关系,从main一级一级到当前断点位置,每一层函数的参数和局部状态都能看到。程序跑飞或者进HardFault时,这个窗口能帮你快速定位到是哪个函数调用链出了问题。
堆栈使用量可以通过编译生成的.map文件查看。在工程输出目录找到.map文件,用文本编辑器打开,搜索“Stack”或者“Maximum Stack Usage”,能看到每个函数的栈用量和全局最大栈深度。如果实际栈用量接近你分配的值,就要小心栈溢出了。Keil的Target页里可以修改Stack大小,默认一般是0x400也就是1KB,做复杂应用时经常不够,我通常至少开到0x800。
软件仿真功能也很实用。在Options for Target -> Debug选项卡里选择Use Simulator,就可以脱离硬件在电脑上模拟运行。仿真模式下的好处是能看到UART虚拟输出、IO翻转时序、变量变化情况,适合在硬件还没到位时先验证程序逻辑。但注意,软件仿真对延时函数的模拟不算精确,特别是依赖芯片实际时钟频率的部分,最好在Target设置里把晶振频率改成与硬件一致,否则你看到的延时时间和真实时间差出很多倍。
5.3 Proteus与Keil联合调试
Proteus和Keil联调是很多做51、STM32仿真项目的经典组合。联调的意义在于:Keil负责编译和调试代码,Proteus负责模拟硬件电路,两者通过一个虚拟调试接口对接。
联调的大致流程是:
- 安装Proteus,安装时确保包含VDM相关调试组件。
- 在Keil工程Options for Target -> Debug里,选择“Proteus VSM Simulator”作为调试器。
- 在Proteus中打开电路设计,放置对应MCU,把Keil生成的.hex文件加载到MCU属性里,或者通过联调接口直接关联。
- 先点击Proteus的运行按钮,工程会进入仿真状态。
- 回到Keil,点击Start Debug Session进入调试,就可以一边看电路现象一边看代码执行。
实际操作中要注意:Keil和Proteus都要以管理员身份运行,否则两个程序之间的通信端口可能被系统拦截。另外,Proteus版本和Keil版本的位数最好一致,32位和64位混用偶尔会出现找不到调试器驱动的问题。这类联调最适合教学和方案验证,真机调试仍然是最终手段,因为Proteus的模拟模型和真实芯片外设行为总有差异。
5.4 FreeRTOS在STM32F103C8T6的移植要点
FreeRTOS在STM32F103C8T6上的移植,很多人喜欢手工复制port文件,其实用Keil自带的RTE环境最省事。新建工程后,在工程界面右键选择Manage Run-Time Environment,展开RTOS -> FreeRTOS,勾选Core里的CMSIS 2和Heap里的Heap_4,Keil会自动把FreeRTOS源码和移植层文件加进工程。
需要注意的配置有几点:
第一,FreeRTOS的SysTick中断优先级必须设置为最低。在FreeRTOSConfig.h中配置configPRIO_BITS和configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY,否则会影响系统调用的原子性,跑一段时间就会出现诡异的任务卡死。
第二,堆大小configTOTAL_HEAP_SIZE要根据任务数量设置。STM32F103C8T6只有20KB RAM,不够大,我的习惯是先给个8KB,不够再加。调这个参数的路子就是看vApplicationMallocFailedHook有没有触发,一旦触发说明堆不够。
第三,C8T6内部Flash只有64KB,如果开优化后编译还超限,可以检查一下是否启用了不必要的组件比如Trace. 实际工程中C8T6跑小型FreeRTOS应用是够用的,但别塞太满,否则后续迭代没有空间。
移植完成后,调试FreeRTOS任务时,可以在Call Stack窗口里看到任务栈的调用关系,还能借助FreeRTOS的插件查看任务列表,这个在Keil MDK 5.37之后做得比以前好用不少。
6. 高频报错排查速查与典型修复
6.1 十多个常见报错对照
把群里和论坛里出现频率最高的几类报错整理成表格,方便直接对照:
| 报错提示 | 可能原因 | 处理办法 |
|---|---|---|
| Target not created / 找不到芯片 | 未安装对应DFP芯片包 | 到Pack Installer或官网安装芯片对应Pack |
| No ULINK Device Found | 调试器驱动未装或连接异常 | 检查USB连接、目标板供电,Debug设置中选择正确调试器 |
| Error: Flash Download failed | Flash算法未配置或芯片锁定 | Options -> Debug -> Settings选择Flash Download算法 |
| error R6002 | 运行库或浮点链接异常 | 勾选Use MicroLIB,确认FPU选项 |
| 进程无法分配更多内存 | Keil 32位程序内存耗尽 | 关闭多余插件和Project,减少Watch窗口数量 |
| cannot open file .axf | 编译失败导致没有产物 | 先看编译过程的真正报错并解决输出文件生成问题 |
| file has been changed outside | 文件被外部工具修改 | 选择Reload重新加载 |
| obsolete command line option | 旧工程命令行选项不被新编译器支持 | 检查Target设置中的编译器命令,更新为新版参数 |
表格里有些问题是连锁反应,最常见的是编译失败导致没有生成.axf文件,然后下载时又报找不到.axf,新手很容易被后面这个报错带偏,花了很久去查下载配置,其实根源是源码编译不过。遇到任何下载类报错,先回到编译输出窗口看有没有Error,先把编译问题解决掉。
6.2 “无法分配更多内存”与“error R6002”这类难缠问题
“该进程已终止,因为它无法分配更多的内存”这句报错在Keil里见过的人不少。Keil的Uvision是32位程序,32位程序在Windows下默认只能访问约2GB的虚拟地址空间。工程很大、打开的文件很多、Watch窗口塞满了表达式、再挂一两个外部插件,内存很容易崩。
处理思路按顺序来:
- 关闭不需要的工程,或者把当前工程里没有用到的文件从工程中移除,减少文件索引和解析量。
- 关闭Astyle、CppCheck这类通过外部命令调用的工具,不要在Keil内频繁触发。
- 减少Debug模式下Watch窗口里的变量数量,尤其是数组和结构体,它们会一次性加载大量数据。
- 如果工程实在太大,考虑用IAR或者命令行编译作为备选方案,或者把工程拆成静态库分模块编译。
error R6002这个报错在MDK中不算特别高发,但遇到了就非常莫名其妙。它通常是浮点支持未正确链接导致的,常见的触发场景是使用printf打印浮点数,但工程没有启用浮点库。解决路径是:在Options for Target -> Target页确认FPU选项与芯片一致,Cortex-M4F/M7必须选择成单精度;在C/C++页勾选Use MicroLIB;如果还不行,检查启动文件里是否定义了FPU相关宏。AC5切AC6之后遇到R6002,优先去查编译器版本兼容性。
6.3 no ULINK Device Found与工程路径变更问题
No ULINK Device Found这个报错,字面上看是Keil没找到ULINK调试器,但在国内环境下,大部分人用的其实是J-Link、ST-Link或者CMSIS-DAP,却还在用默认的ULINK设置。所以第一步永远是:Options for Target -> Debug,右侧把调试器从ULINK改成你实际用的那个;再点Settings,看有没有识别到调试器型号。
如果设置没问题,还是找不到设备,按这个顺序排除:目标板有没有供电,杜邦线有没有接错,SWDIO/SWCLK两根线有没有接反,调试器驱动有没有装好,最后再怀疑调试器硬件坏了。USB线和前置USB口供电不足也经常导致这类问题,换成主机后置USB口或者带屏蔽的线能解决一部分奇怪故障。
工程文件夹被改名后报错,这个问题多数是因为工程里有绝对路径引用。比如你在外部用资源管理器把工程目录从ProjectA改成了ProjectB,但.uvprojx里的输出目录、源码路径还记录着老路径,Keil找不到就报错。解决办法是在Options for Target -> Output和Listing页重新指定输出目录,并检查所有源文件的引用。如果担心这类问题,建议在工程创建时就把所有路径设置为相对路径,Settings里尽量不勾选绝对路径选项。改动外部目录名之前,最好先在Keil里关闭工程再改,改完再用Keil打开重新编译,能少很多麻烦。
7. 界面汉化、代码规整与效率工具
7.1 汉化包的正确用法
用汉化包把Keil Uvision界面改成中文,是很多新手的第一需求。操作本身不难:从对应版本的汉化包下载站点或者社区找匹配版本,把汉化文件替换到Keil安装目录下的UV4文件夹里。替换前把原文件备份,避免汉化包出问题时回不去。
但我要给个建议:Keil的英文界面其实没有多少单词,来回就是Build、Debug、Options、Flash这些。使用汉化包反而有两个问题:一是杀毒软件经常误报,要加白名单;二是Keil版本更新后汉化文件不匹配,可能出现菜单错乱甚至打不开。我的做法是:英文原版 + 记住几个常用快捷键,效率反而更高。如果只是为了给同事演示方便,可以装汉化,但别装完就彻底不管了。
7.2 Astyle让代码自动对齐
写代码不排版是很多人的坏习惯,代码一长,缩进混乱,看着想砸电脑。Astyle是一个代码格式化工具,可以自动处理大括号对齐、缩进、空格等风格问题。它能在命令行下运行,也能集成到Keil的菜单里。
Keil集成Astyle的常用操作是:把astyle.exe放到某个固定目录,然后在Keil菜单Tools -> Customize Tools Menu里添加一个命令。Command填astyle.exe的路径,Arguments填格式化参数和当前文件变量,比如“-A1 -s4 --style=allman !E”。这里的!E是Keil的变量,代表当前编辑文件路径。配置好后,点一下菜单项,当前文件就被格式化了。
格式化参数建议统一:缩进4空格,Allman风格,也就是大括号单独占一行。这是嵌入式Linux内核和很多大厂嵌入式团队的标准风格,看着清爽,团队成员之间切换代码也没有“排版冲突”。最狠的一点是,每次格式化完对比一下git diff,你会发现自己原来写过那么多多余的空格和坏缩进。
7.3 CppCheck静态检查
CppCheck是一个开源的C/C++静态分析工具,它能找出编译不报错但逻辑上有问题的代码,比如数组越界、空指针判断、资源泄漏、无效的运算符优先级等。我对它的定位是“编译器的补充”,因为编译器只关心语法正确性,不关心你的代码写得多愚蠢。
CppCheck集成的思路和Astyle类似:在Tools里添加一条命令,Command指向cppcheck.exe,Arguments写成“--enable=all --inconclusive --std=c99 !E”,输出的警告会显示在Output窗口,点击可以跳到对应行。实际项目里,CppCheck能发现不少潜在bug,比如数组索引写错、switch缺少break、malloc后没释放。虽然不能替代人工review,但可以作为一道自动化的质量关卡。
7.4 Keil Community与替代方案选哪个
Keil官方这些年也出了免费或者低门槛的版本,像MDK Community Edition,主要用于非商业和个人学习,功能上对一般小工程已经够用。但社区版的许可条款限制比较多,项目规模、商业用途都有约束,公司里使用还是要谨慎核对授权。
如果你只是被Keil的旧界面和编译速度折磨到想换,替代方案也不少。STM32CubeIDE是ST官方出的免费IDE,内嵌了GCC和CubeMX,做STM32项目很顺手,尤其是外设初始化代码生成那一步,比在Keil里手写方便太多。PlatformIO则适合喜欢VSCode的人,插件生态丰富,工程管理能力强,对ESP32、STM32等主流平台支持都很好。
不过说句实在话,嵌入式行业对Keil的依赖不只是IDE本身,还有几十年的工程生态和芯片厂家的配套资料。你做STM32时换到CubeIDE还好,做瑞萨RA、做老51、接手祖传工程的时候,绕来绕去最后还是得回到Keil。与其想着彻底替代,不如把Keil当作一个必须掌握的基础工具,把它调教顺了,其他IDE都是锦上添花。
我个人后来养成的习惯是:Keil负责编译调试,代码编辑器用别的顺手的工具,格式化交给Astyle,静态检查交给CppCheck,版本管理用Git。把这些工具串起来之后,Keil实际只承担编译和调试这两个最核心的职责,它的很多老化和别扭的地方也就不那么明显了。新装的机器上,我一般会先把Keil、Astyle、CppCheck这铁三角装齐,然后才开始建工程,后面能省掉无数琐碎的重复劳动。学习和摸索这些工具搭配的过程,其实也是从“会用Keil”到“顺手用好Keil”的分水岭。