ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Keil MDK安装配置实战:授权、DFP器件包与GBK转UTF-8避坑

Keil MDK安装配置实战:授权、DFP器件包与GBK转UTF-8避坑 装 Keil MDK 这件事看起来是双击一路 Next 就能搞定的活儿但真正拿它跑过项目的人都知道装完那一刻只是开始。你会发现器件列表里搜不到手上这颗 MCU会发现中文注释一夜之间变成问号会发现编译一路绿灯但下载就是没反应也会发现多年以后同事发来的工程打开是Unknown Device。这篇就围绕 Keil_v5 MDK 的安装、授权注册、界面汉化取舍、MCU 器件包DFP配置以及一个被无数人踩过、却很少被讲透的细节——MDK 工程编码从 GBK 改到 UTF-8 的正确姿势把我这些年从踩坑里攒出来的东西一次性讲清楚。内容偏实战假设你已经拿到安装包重点在于装完之后怎么让它真正干活刚入门的朋友可以照着一步步走做过几年嵌入式的人也可以直接跳到编码和 Pack 那两节。1. 先把Keil_v5拆成三样东西再谈装1.1 uVision、编译器、器件包三层结构各管什么很多人说我装了 Keil5其实这句话里至少藏着三个独立组件。第一层是 uVision IDE也就是你平时双击打开的那个图形界面负责工程管理、编辑、下载和调试第二层是 ARM 编译器工具链命名上叫 Arm Compiler简称 AC老版本是 AC5底层是 armcc、armasm、armlink 这一套新版本是 AC6底层换成了基于 clang 的 armclang第三层是器件支持包行业里常叫 Pack 或者 DFP它决定了 uVision 的器件库里能不能找到你手上那颗芯片以及能不能生成对应的启动文件和 Flash 烧写算法。这三层是解耦的这点特别关键。IDE 大版本可以不变编译器换一代你的工程就可能报一堆语法错误编译器不换只更新 DFP器件支持列表就能多出一整年的新芯片。明白这个结构后面所有为什么装了还是用不了的问题基本都能定位到具体是哪一层缺了。我见过最典型的场景是同事把工程连同 .uvprojx 一起发过来你打开后提示找不到器件第一反应是软件装坏了其实是对方项目用的是新出的芯片你本地没装对应的 DFP。装个 Pack 的事跟 IDE 本身一点关系都没有。提示判断问题归属有个快办法。新建一个空白工程如果器件列表是空的或者缺你需要的型号问题在 Pack 层如果器件能选但一编译就报编译器相关的错问题在 AC5/AC6 层如果连菜单都点不动、界面异常才轮到怀疑 IDE 本身。1.2 MDK 与 C51 共存的两种做法以及 TOOLS.INI 的门道搞单片机的尤其是从 8051 起家的朋友经常会遇到一个需求既要写 ARM又要维护老的 8051 工程。于是就有了keil5 能不能同时支持 C51 和 MDK这个问题。答案是能但方法要选对。第一种做法是分别安装到不同目录各用各的快捷方式。最省事互不干扰缺点是切换起来麻烦而且两个 uVision 的工程文件扩展名太像容易双击错。第二种做法是把 C51 的工具链目录整体搬进 MDK 的安装根目录然后修改 TOOLS.INI让同一个 uVision 同时认到 ARM 和 C51 两套工具。原理很简单uVision 启动时会去读安装目录下的 TOOLS.INI里面用节section的方式记录每套工具链的路径和可执行文件位置。[UV2] ORGANIZATIONyour_team NAMEyour_name EMAILyour_mail [ARM] PATHC:\Keil_v5\ARM\ VERSIONV5.06 PATH1C:\Keil_v5\ARM\ARMCLANG\ [C51] PATHC:\Keil_v5\C51\ VERSIONV9.60 BOOK0C51\HLP\GS51.PDF改之前务必备份 TOOLS.INI因为它一旦写坏症状是 uVision 启动后所有工具链都消失、连编译按钮都灰掉而且报错信息往往很含糊。另外要注意安装顺序一般先装 MDK再把 C51 的目录合并进来最后手工补 TOOLS.INI 里的节。反过来操作也行但要留意两组安装程序都往同一份 TOOLS.INI 里写内容后装的会覆盖前面的某些字段。注意如果你维护的是别人交接过来的老工程别人的 TOOLS.INI 里可能有自定义路径。合并前把两份文件对比一遍别直接覆盖。1.3 版本号到底怎么挑5.36 / 5.37 / 5.38a 之后的取舍版本选择这件事我建议按团队一致性优先于新特性的原则来。同一个项目组里如果有人用 5.36、有人用 5.41最直接的后果是编译器默认版本不同生成的优化结果、警告列表甚至某些内联汇编的写法都会有差异代码评审时会出现我这儿能过你这儿报错的扯皮。从功能演进上看MDK v5.36 这一代是很多人长期停留的版本生态资料多、Pack 兼容性经过充分验证。从 v5.37 前后开始官方对授权模式做了调整为个人非商业用途提供了免费的 Community 授权通道同时 AC6 逐渐成为默认编译器AC5 在新版本里一般不再随主安装包一起装需要单独补充。具体条款和默认行为以官网说明为准我这里只讲结论如果你主要写新项目可以直接上较新的版本如果你维护的是十几年前的老代码尤其是大量使用 AC5 特有语法的工程建议保留一个 5.36 左右的版本作为老工程专用环境。使用场景建议版本策略主要理由全新项目、新芯片较新版本默认 AC6新器件 DFP 支持完整语言标准更现代老工程维护固定在 5.36 一类老版本避免 AC5/AC6 迁移带来的语法与语义差异教学、个人学习较新版本 Community 授权非商业用途下有免费通道合规且够用多人协作全组统一到同一版本号规避编译器行为差异导致的玄学 bug我的个人习惯是机器上留两个安装目录一个是主力版本一个是老版本兼容环境用快捷方式命名区分。硬盘多占几个 G但省下来的沟通成本远不止这些。2. 装之前把这几件事定下来能省掉后面一半的返工2.1 安装路径、目录权限与中文路径的连锁反应安装路径这个事几乎是所有奇怪问题的源头。MDK 本身对路径里的空格和中文有一定的容忍度但你项目里挂的工具链——尤其是第三方脚本、自定义编译前后命令、Python 脚本、代码检查工具——未必都能正确处理带中文的路径。最后表现出来的往往是命令行里跑得好好的放到 uVision 里就失败排查半天才发现是路径里有个中文目录名。我的建议很直接安装路径用全英文、无空格、层级尽量浅比如C:\Keil_v5。工程路径同样用全英文中文只出现在注释和文档里。别觉得这是洁癖路径问题是最难查的一类问题因为它不报错只是行为不对。第二个是权限。安装程序需要往 Program Files 或者根目录写文件、注册组件如果不给管理员权限可能出现装到一半提示失败但界面已经显示完成的情况残留一堆半成品。别用以兼容模式运行绕过去直接右键以管理员身份运行安装程序一次装干净。第三个容易被忽略的是防病毒软件的实时扫描。安装过程要释放大量小文件、写注册表实时扫描会让安装时间从几分钟拉长到十几分钟个别情况下还会锁住正在写入的 DLL。如果安装过程中出现莫名其妙的停滞可以临时把安装目录加入扫描排除列表装完再加回去。2.2 安装包从哪来以及离线环境怎么准备关于附安装包这件事我的态度比较明确安装包优先从官方渠道获取其次是公司内部的软件资产库。原因不是道德说教而是纯粹的风险控制——嵌入式开发机往往连着调试器、连着生产设备一台被植入东西的开发机造成的损失远超省下来的那点时间。来路不明的网盘分享、第三方整合包你无法确认里面有没有被动过手脚也无法确认 DFP 有没有被替换。不过现实里确实存在离线环境实验室断网、生产网隔离、内网不允许访问外网。这种情况下正确的准备方式是提前在能联网的机器上把三样东西下全安装程序本体、你需要的器件包.pack 文件、以及可能要用的补充编译器比如 AC5 的独立包。器件包的离线文件通常可以直接从官方的 Pack 页面或者芯片厂商的官方渠道获取命名类似Keil.STM32F1xx_DFP.2.4.1.pack。提示拿到任何 .pack 文件先看文件名里的厂商前缀和版本号再用解压工具打开看一下里面的 .pdsc 描述文件。正规包的结构很规整如果里面出现一堆来历不明的可执行文件直接丢掉。另外一个实用习惯把安装程序和对应的 Pack 一起归档命名成版本号 日期写个几十字的说明文档记录装了什么、什么时候装的。半年后重装机器时你会感谢自己。2.3 与旧版本、旧环境共存的安装顺序机器上已经有 MDK4、或者有别的厂商 IDE比如芯片厂商基于 Eclipse 做的定制 IDE再装 MDK5 时要注意几点。MDK4 和 MDK5 的工程文件格式不同前者是 .uvproj后者是 .uvprojxMDK5 打开老工程时会提示转换转换后会生成新文件原文件一般会保留。这里有个坑转换是有损的个别老工程的目标配置、分散加载文件路径、自定义的编译前后命令在转换后可能丢失或指向错误位置。我的做法是转换前先把整个工程目录做一次完整拷贝在拷贝上做转换原目录保持不动。转换后逐项对照 Options for Target 的每一个标签页重点看 Output、Listing、User 和 Linker 这几栏把路径重新指回正确位置。工程越大这一步越不能省。至于和芯片厂商定制 IDE 共存通常没什么冲突因为它们的安装目录、注册表项都不一样。唯一要注意的是调试器驱动。两家 IDE 如果各自捆绑了不同版本的调试器驱动可能出现在 A 里能连上在 B 里连不上的情况。解决办法是统一用官方最新版的独立驱动两家 IDE 都指向同一份。3. 授权与注册把合法路径走顺比什么都省心3.1 三种授权形态的差别先搞清楚自己属于哪一类MDK 的授权大体分三种形态单机授权、网络浮动授权、以及面向个人非商业用途的免费社区授权。单机授权绑定在一台机器的机器码上换机器就要重新申请网络浮动授权把许可放在局域网内的一台授权服务上同一个网段里的多台开发机按需借用适合团队规模较大、开发机流动性强的场景社区授权面向个人学习、 hobby 项目和非商业用途门槛低但有明确的使用范围限制。授权形态适用对象特点注意点单机授权个人、固定工位绑定机器码配置简单换主板、重装系统可能影响绑定网络浮动授权团队、实验室多机共享按并发数计需要内网有可长期运行的授权服务社区授权个人非商业用途门槛低联网确认使用范围有明确界定商用需另行授权判断自己该走哪条路只需要回答一个问题这个项目产生商业收益吗。有就走商业授权别在这上面省没有社区授权完全够用。中间地带的模糊情况建议直接看官方条款原文或者让公司采购去对接不要凭感觉判断。3.2 License Management 的实际操作流程单机授权的流程大致是固定的。打开 uVision进 File 菜单里的 License Management界面上会显示一个计算机标识码CID这是一串基于本机硬件信息生成的编码。把这个编码连同购买信息一起提交给官方或代理商拿到授权文件后再回到同一个界面里把授权内容添加进去。添加成功后界面下半部分的授权列表里会多出一行显示授权类型、到期时间和支持的编译器版本范围。这里有几个实操细节值得说。第一CID 是跟机器状态相关的如果你在申请授权之后、导入之前换了主板或者重装了系统CID 可能就变了授权会失效得重新申请。所以稳妥的做法是系统装好、驱动装全、确认不再折腾硬件之后再申请授权。第二添加授权时如果提示失败先确认是不是复制时带了多余的空格或换行这是最常见的原因尤其从邮件正文直接复制的时候。第三授权界面里能看到当前编译器版本是否被授权覆盖如果显示某个编译器未授权说明你的授权范围不包含它这时候不要硬试。对于网络浮动授权配置的重心在授权服务那一侧客户端只需要在环境变量或者配置文件里指向授权服务的地址和端口。这里面有个团队协作的坑授权服务的地址如果是用主机名配置的一旦那台机器改名或者 IP 变动全组的开发机都会连不上。建议直接用固定地址配置并且把这个配置项写进团队的环境搭建文档里。3.3 为什么不建议碰来源不明的激活方案这一条我想说得直白一点。网上流传的各种第三方激活方式本质上都是在绕过官方的授权校验除了合规风险之外还有非常现实的安全风险这类工具需要往 IDE 的安装目录里替换文件、注入代码而 IDE 又是你日常编译、下载、连着调试器的那台机器上的核心工具。一旦被动过手脚受影响的不只是这一台开发机。更实际的问题是不可维护。这类方式装出来的环境在升级版本、更新器件包、切换编译器的时候经常出问题而且报错信息毫无参考价值——因为出错的地方本身就不在正常路径上。你可能花两天时间查一个本来三分钟就能解决的问题。我的建议是个人学习走社区授权商业项目走正规采购。公司层面如果有预算上的顾虑可以只给实际需要的人配授权配合浮动授权把并发数压下来成本比想象中低。这部分省下来的时间随便一个项目就能赚回来。4. MCU 器件包决定能不能用这颗芯片的关键一层4.1 Pack 里究竟装了什么很多人把 DFP 理解成芯片型号列表这只说对了一小部分。一个完整的器件支持包通常包含四类内容器件描述信息也就是 .pdsc 文件里面记录了这颗芯片的内核、主频、存储布局、外设寄存器定义启动代码和系统初始化代码就是工程里常见的 startup_xxx.s 和 system_xxx.cFlash 烧写算法这是下载器用来把程序写进芯片的桥梁以及可选的中间件和板级支持包比如 USB 协议栈、文件系统、图形库的适配层。理解这一点很重要因为它解释了为什么器件能选但下载不了。下载不了往往不是芯片不在列表里而是对应的 Flash 算法没装或者装错了。也解释了为什么同一个系列的芯片DFP 更新之后工程要重新生成——寄存器定义和启动文件可能变了。还有一个常见困惑装了 DFP 之后器件列表里出现了好几条相似的型号。这通常是同一颗芯片的不同封装或者不同存储容量版本选择时要按实际焊接在板子上的那颗来别想当然选第一个。4.2 在线安装与离线导入两条路都要会走在线安装是最省事的方式uVision 里打开 Pack Installer左侧选厂商中间选器件系列右侧会列出可用的包和版本点 Install 就行。Pack Installer 会显示每个包的更新状态、依赖关系以及是否与当前工程匹配。但有几个场景必须用离线方式开发机不能上网、Pack Installer 打开后列表一直在转圈、或者你需要的是一个特定历史版本在线默认给的是最新版而最新版可能和你的老工程不兼容。离线导入有两种方式一种是在 Pack Installer 的菜单里选择导入本地文件另一种更简单直接双击 .pack 文件它会自动调用 Pack Installer 完成安装。版本选择上有条经验老工程不要盲目升级 DFP。我遇到过升级 STM32F1 的 DFP 之后原本正常的工程因为启动文件里的堆栈配置变量名变了而编译失败。所以正确的顺序是先用着能跑的版本只有当新芯片、新外设或者官方明确修复了你遇到的那个问题时才考虑升级并且升级前做好备份。提示想知道当前工程到底用的是哪个版本的包看工程目录里的 .uvprojx里面记录了每个包的名称和版本号或者在 uVision 的 Project 菜单里打开 Manage 下的包管理界面查看。4.3 Pack 根目录、版本回退与清理Pack 文件安装后落在哪里取决于你的设置。uVision 默认会把 Pack 放在用户目录下的一个固定位置类似C:\Users\你的用户名\AppData\Local\Arm\Packs这样的路径也可以在 Pack Installer 的设置里改成自定义目录。团队协作时把 Pack 目录放在一个统一的位置、写进环境搭建文档能避免同一个工程不同人打开提示缺包的情况。同一个包可以存在多个版本目录结构大致是厂商名/包名/版本号三级。这就意味着版本回退非常简单把新版目录改名或者移走让 uVision 找到旧版本即可。但有个前提uVision 是通过 .pdsc 描述文件扫描到包的直接删目录可能导致索引残留最稳妥的操作是在 IDE 里通过包管理界面卸载再手工确认目录清理干净。清理这件事值得定期做。一个用了几年的开发机Pack 目录涨到十几 G 是常事里面躺着一堆你早就换掉的芯片系列。清理时按厂商 系列分组看把确定不再用的整组删掉。注意别删掉 CMSIS 相关的核心包那是很多 DFP 的公共依赖删了会连带一批工程报错。5. 编码从 GBK 改到 UTF-8一个被讲烂但很少讲对的问题5.1 为什么改了编码设置中文反而全乱了先说清楚根因。源文件在硬盘上是字节序列编码方式决定了字节序列怎么映射到字符。一个用 GBK 保存的文件里面一个汉字通常占两个字节用 UTF-8 保存一个汉字占三个字节。uVision 的编辑器有个编码设置项它的作用是按指定的编码去解释文件里的字节而不是把文件的内容转换过去。所以当你在工程设置里把编码从 ANSI在中文环境下就是 GBK改成 UTF-8但文件本身还是 GBK 字节编辑器就会拿 UTF-8 的规则去解读 GBK 的字节结果当然是乱码。很多人的结论是MDK 的 UTF-8 有 bug其实是一步没做文件内容本身也得转。正确的顺序是先把文件内容真的转成 UTF-8再让编辑器按 UTF-8 去读。这两步缺一不可顺序反了也会有一小段时间看起来是乱的。5.2 GBK 批量转 UTF-8 的完整流程单文件转换最简单用一个支持编码转换的文本编辑器就行。打开文件在编码菜单里选转为 UTF-8这类选项然后保存。这里有个关键选择要不要带 BOM。BOM 是文件开头的一小段标记字节作用是告诉阅读器我是 UTF-8。但它会给编译器带来额外解析负担在嵌入式工具链上更容易出问题。对 MDK 工程我的建议是统一用UTF-8 无 BOM。单个文件好办一个几年积累下来的工程有几百个 .c 和 .h手工转是不现实的。批量转换的思路是把所有源文件复制一份到临时目录用命令行工具逐个转换并覆盖原文件转换前先做全量备份。转换完必须做一件事——打开几个包含中文注释和中文串的文件肉眼确认再整体编译一次逐个文件对比输出是否一致。批量转换时有两个坑要提醒。第一是文件里混着两种编码有些文件是老同事用 GBK 存的有些是新同事用 UTF-8 存的你按 GBK 全部转一遍本来正确的 UTF-8 文件就会被转坏。处理办法是先做编码探测把疑似 UTF-8 的文件挑出来单独处理。第二是字符串字面量里的中文如果这些串是要通过串口输出、液晶显示的转换后字节数变了某些按字节长度做缓冲区的老代码可能会溢出。这类地方要重点复查。注意转换完记得同步修改 uVision 的编辑器编码设置在 Edit 菜单的 Configuration 里Editor 标签页下有编码选项并且检查工程的 .uvprojx 里是否有编码相关配置残留。整个团队要统一否则下一个人提交代码时又把文件存回 GBK 了。5.3 ARMCC5 和 AC6 对多字节字符的处理差异编译器这一侧的差异也值得说清楚。AC5 这套工具链对源文件编码的处理比较宽松中文注释基本不挑中文串字面量在默认配置下也能按本地编码处理。AC6 基于 LLVM 体系默认按 UTF-8 解释源文件如果源文件还是 GBK轻则出现乱码的字符串重则编译时直接报非法多字节序列。这就形成了一个有点绕的局面老工程用 AC5 编译、GBK 编码一切正常一旦升级到 AC6编码问题就暴露出来。所以如果你打算把老工程迁到 AC6最好把源码统一转 UTF-8 无 BOM作为迁移的第一步而不是等编译器报错了再回头改。如果因为某些约束确实不能动文件编码可以尝试在 AC6 的 Misc Controls 里指定输入字符集相关的选项类似指定输入字符集为 GBK 的写法。但我要提醒的是这条路依赖具体版本的行为稳定性不如直接统一编码只能当作临时过渡手段。另外一个容易忽略的层面是操作系统。Windows 有个使用 UTF-8 提供全球语言支持的选项开启后系统默认代码页发生变化某些依赖本地编码的工具输出会变成乱码。如果团队里有人开了、有人没开会出现同样的代码我的编译日志是乱码你的正常这类现象。排查编码问题时把这一项也纳入检查清单。6. 装完之后让它真正好用起来的几处配置6.1 编译选项、优化等级与那些看着吓人的报错新装的 MDK默认编译选项对新手并不友好或者说过分宽松。我通常会在 Options for Target 的 C/C 标签页里做几件事把警告等级调到合适的水平打开把警告当错误至少在提交代码前跑一遍选择合适的 C 语言标准。至于优化等级调试阶段建议先用低优化O0 或 O1发布时再切到高优化。原因是高优化会打乱代码和源码的对应关系单步调试时跳来跳去排查问题非常痛苦。打开高优化后最常遇到的诡异现象是变量值不对。比如你把一个变量声明为普通变量但不加 volatile在高优化下编译器可能把它放进寄存器或者直接优化掉调试器里看到的值永远是初始值。这不是编译器有 bug是它合理地认为这个变量不会被外部改变。凡是会被中断修改的变量、硬件寄存器映射的变量都要加 volatile这是硬规矩。还有一类报错是链接期的。比如提示某个符号重复定义通常是因为把函数的定义写在了头文件里被多个源文件包含或者启动文件里已经有默认的弱定义你又提供了一个同名强定义。看链接器的报错要先看是谁和谁冲突再看这两个定义分别在哪别急着百度错误码。现象常见根因处理方向变量值在调试器里不变未加 volatile 或变量被优化掉关键变量加 volatile或降低优化等级符号重复定义定义写在头文件、弱符号与强符号冲突头文件只放声明函数定义放源文件编译很慢全量重编、扫描目录过大检查是否误开了全量重建精简包含路径中文串输出乱码源码编码与编译器预期不一致统一源码为 UTF-8 无 BOM6.2 调试器和 Flash 算法下载失败的高频原因都在这下载失败这件事排查顺序我固定按四步走。第一步看调试器驱动是否正常识别设备在调试器设置界面里能不能读到芯片的 ID第二步看 Flash 算法是否配置正确Options for Target 的 Debug 标签页里进入 Settings在 Flash Download 那一栏能看到下载算法列表算法要和你实际的芯片系列匹配起始地址和大小也要对第三步看连接方式SWD 和 JTAG、以及速度设置速度过高在长排线、劣质杜邦线的情况下容易握手失败第四步才怀疑代码本身比如时钟配置改错导致调试口被关掉。有一类问题特别隐蔽程序里在很早的阶段就把 SWD 引脚复用成了普通 GPIO或者把调试时钟关掉了。这种情况下第一次下载是好的程序一跑起来就再也连不上了。解决办法是让调试器用复位后立即连接的模式或者临时把调试引脚相关的初始化代码注释掉重新下载一版正常的程序把芯片救回来。Flash 算法缺失的典型报错是提示在某个地址范围找不到算法。这时候去器件对应的 DFP 里确认算法文件是否存在或者检查你是不是选错了芯片型号——选了一个容量版本不对的型号起始地址和大小自然对不上。6.3 把 Cppcheck 接进自定义工具菜单编译前先扫一遍uVision 的静态检查能力比较有限把 Cppcheck 这类开源静态分析工具接进来成本很低收益挺明显。做法是在 Tools 菜单里选 Customize Tools Menu新建一条命令命令路径指向 cppcheck 的可执行文件参数按下面这样配--enablewarning,style,performance,portability --template{file}:{line}: {severity}: {message} --languagec --stdc99 --suppressmissingIncludeSystem --inline-suppr -I . %F参数里%F是 uVision 提供的占位符代表当前编辑的文件。这样配置完在编辑器里打开某个源文件从 Tools 菜单点一下就能对它做一次检查结果直接输出到 Build Output 窗口双击还能跳到对应行。注意--enable里别一上来就开 all会有一大堆风格层面的建议反而淹没了真正重要的问题--suppressmissingIncludeSystem是为了屏蔽找不到系统头文件这类噪音嵌入式工程的头文件路径很分散这类告警意义不大。实际用下来Cppcheck 在嵌入式代码里最容易抓到的几类问题是数组越界访问的隐患、未初始化的局部变量、可疑的赋值与比较混用把写成、以及在中断服务函数里调用不可重入函数。最后这一类尤其值得关注因为它在测试阶段几乎不会暴露只在特定时序下偶发。7. 装完之后的高频故障按这条链路排查7.1 器件列表里搜不到目标芯片这是最高频的问题排查链路基本固定。先确认在 Pack Installer 里搜厂商和型号能不能找到对应的包找得到但没装装上即可。找不到说明你手上的版本太老包索引需要更新离线环境下要去官方渠道拿最新的包索引文件。装上了但器件列表里还是没有检查 Pack 根目录的路径设置是否和实际安装位置一致路径错了 IDE 扫不到。还有一种情况器件列表里有但型号是灰的不能用。这一般是包与当前编译器版本不匹配或者工程的目标配置里残留了旧版本的器件引用。处理办法是在工程设置里重新选一次器件型号让它重新生成对应的配置。我遇到过一次比较特殊的情况同事的机器上Pack 目录被放在了同步盘里结果 IDE 启动时同步还没完成扫描到的包信息不完整器件列表少了一大截。所以包目录不要放在会被后台同步的路径下这是个很容易被忽略的坑。7.2 编译能过、下载报错这种情况说明工具链是好的问题在连接或烧写环节。按前面说的顺序查调试器是否识别到芯片、Flash 算法是否匹配、连接方式和速度是否合适。还有一个容易被忽略的点是芯片是否处于读保护状态读保护开启的芯片会拒绝调试器访问需要先通过专用工具解除保护这个操作通常会擦除整个芯片动手前要确认待烧写的固件有备份。另外提醒一句关于复位方式的配置。Options for Target 的 Debug 标签页里有复位方式的选项选择复位后运行还是复位后停止会直接影响你的调试体验。调试阶段建议停在复位向量方便从头跟量产烧写时才选复位后直接运行。7.3 Pack Installer 卡住、IDE 启动变慢Pack Installer 打开后长时间转圈最常见的原因是网络不可达但程序在等超时。离线环境下的正确做法是不要依赖在线索引改用本地导入的方式安装包同时在设置里关掉自动检查更新。IDE 启动慢、打开工程慢通常和 Pack 目录的规模有关。目录里包的数量越多、扫描时间越长。定期清理不再使用的包能明显改善启动速度。另一个因素是工程本身的文件数量如果工程目录里混进了大量编译产物、日志文件也会拖慢索引。建议在工程目录外做备份不要把整个输出目录都留在源码树里。还有一个经验如果 uVision 在打开工程时频繁未响应先看看是不是工程里配置了在打开时自动执行的用户命令比如自动运行的脚本或者版本检查工具。这类配置一次配好很方便配错了就是每次打开工程都要卡上十几秒。最后分享一个小技巧是关于环境重建的。我现在给每台开发机都维护一份环境清单记录装了哪个版本的 MDK、装了哪些 Pack 及版本号、编译器版本、调试器驱动版本。重装或者换机器时照着清单走一遍十分钟就能复现出完全一致的环境比凭记忆一个个装可靠得多。这件事看起来琐碎但在多人协作的项目里它能消掉相当一部分在我这儿是好的式的扯皮。
返回列表