ARTICLE DETAIL

资讯详情

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

Keil MDK V5.33升级全攻略:从备份到工程迁移避坑指南

Keil MDK V5.33升级全攻略:从备份到工程迁移避坑指南 搞嵌入式开发这些年每次遇到Keil MDK要升级我第一反应都是先看看手上几个项目的编译器版本、芯片型号和调试环境能不能平滑过渡。这次把主力版本从V5.26切到V5.33从备份、安装、Pack部署到老工程迁移整个过程踩了不少坑也整理出一套比较顺手的流程。这篇文章就是一次完整的升级复盘把V5.33的升级理由、标准操作步骤、迁移要点和问题排查都串起来给准备升级或者正在升级的朋友一条可以直接照着走的路。1. 升级前先问自己V5.33到底值不值得升1.1 V5.33相比老版本到底改了些什么V5.33属于MDK 5.x中期比较稳的一版。它跟V5.26、V5.27这些老版本相比大方向上的变化主要体现在四个方面。第一新一代Cortex-M内核的器件支持更完善了。V5.33加强了对Armv8.1-M架构处理器的支持特别是Cortex-M55这类带Helium技术的核心版本低了根本没法正常建工程和调试。如果你手上只有STM32F1、F4这些常规项目这个优势可能感觉不明显但一旦接了新平台的新项目版本门槛就摆在那里不升不行。第二编译器工具链的默认选项变了。V5.33把默认编译器切到了AC6armclang同时保留了AC5armcc的选项。这个细节对老工程影响非常大。很多以前用MDK 4或者MDK 5早期版本建的工程都是拿AC5编译的代码里多多少少会用到一些armcc特有的语法、内联汇编写法。到了V5.33以后AC6成了“默认推荐”虽然性能上确实比AC5有优势但对老代码来说从AC5切到AC6并不是一次无感升级需要单独评估。第三Pack管理机制和CMSIS版本做了同步更新。V5.33内置的CMSIS版本比老版本新事件记录器、RTX相关的RTE组件也有更新。旧工程如果用了很老的CMSIS版本升级后Pack会被自动替换成新版本这时候就要注意外设库或者驱动代码是否兼容。第四调试器和仿真器相关的组件做了不少修复。官方Release Notes里列了一堆和ULINK、J-Link适配相关的修复项我实际使用中确实发现V5.33在调试器的连接稳定性上比V5.26好一些尤其是长时间挂仿真的时候很少出现假死。不过这里要说明白V5.33并不是“非升不可”的版本。后面还有5.34、5.35、5.36但5.33胜在发布至今已经有一段时间社区反馈比较充分网上能查到的问题基本都有解属于一个相对稳的升级目标。对于从5.20、5.26这种老版本一路用过来的开发者V5.33算是一个体验提升比较明显的版本。1.2 先判断你的项目适不适合现在升升级之前先对照自己的情况做一个快速判断能省掉后面很多麻烦。如果你是下面这几类情况建议直接升新项目要用到V5.33才开始支持的MCU型号开发环境不支持就是硬伤。你还在用特别老的MDK版本比如5.20以下IDE本身有不少已知问题升级到V5.33整体体验会好很多。你要用新版CMSIS驱动或者新版中间件比如新的RTX版本、新的事件记录器组件老版本MDK根本带不动。如果是下面这些情况建议缓一缓手上是维护中的老项目代码量很大而且一直用AC5编译包含大量内联汇编或者编译器相关的特殊语法。这种项目盲升到AC6编译错误可能多到让你怀疑人生。项目正处于交付或者验收的关键节点。升级环境这种事情容易引入不可控变量最好在项目收尾后再动。公司统一限制了软件版本或者正版授权只覆盖了特定版本号。这种流程类问题先和团队确认清楚再升。我个人的建议是不管你是哪种情况升级前都要留好后路。后面会详细讲怎么备份这个步骤千万别省。2. 升级前的准备备份、授权与安装包挑选2.1 先做这三项备份工程、配置与Pack文件很多人升级前只会备份一下工程源码其实远远不够。实际升级过程中最容易出问题的反而是“环境配置”和“Pack版本”这类东西。我习惯在升级前把下面三样东西都准备好。工程备份是最基本的。MDK自带Backup功能位置在File菜单下的Backup Projects它会自动把当前工程需要的源码文件、配置文件和资源都打包出来。不过我更推荐手动复制整个工程文件夹因为很多工程会引用相对路径之外的文件比如放在上级目录的共用库或者配置文件手动整体复制能保留完整的目录结构更稳妥。第二样是Keil的全局配置文件TOOLS.INI。这个文件通常在安装目录下比如C:\Keil_v5\TOOLS.INI里面记录了当前MDK安装的组件路径、Pack路径、默认的编译器版本等关键信息。升级前把它复制一份存到别的盘万一新版本安装后MDK找不到原来的Pack目录直接对比这个文件就能定位问题。第三样是Pack目录。MDK的Device Pack和CMSIS Pack默认安装在系统用户目录下具体路径是C:\Users\你的用户名\AppData\Local\Arm\Packs。这个目录可能有好几个GB建议直接压缩成一个压缩包存到备份盘。如果你需要完全恢复到升级之前的状态有了这个目录基本就能还原。2.2 授权确认升级会不会影响License很多人在升级前最担心的就是授权失效。其实在同一台机器上安装同一品牌的更新版本大部分情况下授权是可以延续使用的。但有一条需要注意Keil的License是绑定电脑硬件信息的如果你换了主板、重装了系统或者从一台机器转移到另一台机器授权就可能需要重新激活。我建议在升级前先打开MDK的License Management窗口把当前的License信息截图保存重点看License ID Code和授权类型。如果你的授权是评估版或者有明确的有效期升级后要及时检查是否还在有效期内。如果升级后发现提示License无效先别慌大部分情况在License Management里重新输入一次License ID Code就能恢复正常。如果不行就得走官方渠道确认授权状态。2.3 安装包从哪里下载官方渠道与离线包的取舍安装包推荐从官方渠道下载。MDK的正式安装包是一个几百MB的exe文件官网下载页面有Standalone Pack和MDK Core安装包之分。这里不要混淆MDK Core才是IDE主体Standalone Pack是单独的芯片支持包。实际下载中经常碰到的两个问题一是官方下载服务器响应慢下载速度不稳定二是公司网络限制了大文件下载。这时候可以选择离线安装包的方式。离线包可以在网络好的环境里先下载好再拷贝到开发机上安装能省很多时间。这里说个正经建议尽量不要从来路不明的网盘链接下载MDK安装包。一方面无法保证文件完整性安装到一半出问题排查起来非常痛苦另一方面也容易踩到捆绑软件或者旧版本冒充新版本的坑。我见过同事从某个分享链接下载了一个号称V5.33的安装包结果打开还是个V5.23的。来源不可靠的包浪费的时间远远超过省下来的下载时间。3. 安装与Pack部署一次装对的完整流程3.1 安装前必做的系统检查与软件冲突排查开始安装之前先把系统环境检查一遍。这里说的检查不是过场是真的能避免掉大部分坑。操作系统方面V5.33支持Windows 7及以上系统64位系统用得最稳定。磁盘空间注意留出至少2GB的余量这还只是MDK Core本身后面要装Pack的话建议再留出2到3GB。安装路径是一个大坑不要装到带空格或者中文的路径下比如C:\Program Files这种就属于带空格的路径虽然很多情况下也能用但后面一旦涉及命令行编译、脚本调用、版本控制工具集成带空格的路径就会频繁出问题。推荐直接用默认的C:\Keil_v5。杀毒软件和系统防护也是个容易被忽略的点。MDK的License工具和调试器驱动有时候会被杀毒软件误判导致激活失败或者调试器连不上。如果你机器上有比较敏感的防护软件安装前可以把Keil的安装目录加入白名单装完以后再改回来也行。软件冲突方面最常见的就是机器上已经装了老版本MDK。这个其实不用卸载可以在安装时选择不同的目录实现多版本共存。但要注意Keil全局配置TOOLS.INI只会指向其中一个版本后安装的版本会覆盖之前的配置。所以我前面建议备份TOOLS.INI这一步就是为了这个场景准备的。非要共存的话建议装在C:\Keil_v5.33这种新目录老版本保留在原来的C:\Keil_v5不动。3.2 安装V5.33的标准流程与组件选择安装过程本身不复杂但组件选择是有关键技巧的。运行安装包以后一路Next到组件选择界面这里有几个选项需要留意Core必选这是MDK的主体。Device Family Packs可选项对应具体芯片厂商的Pack。比如你只做STM32就选STM32F1系列对应的Pack。如果不确定可以在安装完成后通过Pack Installer单独安装这里选不选都不影响后续操作。CMSIS建议选上V5.33自带的CMSIS版本比较新很多驱动和中间件会依赖它。MDK Middleware、File System、Network等按需勾选不用全选。安装组件选择的原则是少而精别一股脑全装上。装一堆用不到的组件不仅占用空间还可能造成不同Pack之间的版本冲突。后面需要用哪个Pack再去Pack Installer里单独装这个习惯能让你少处理很多莫名其妙的兼容性问题。安装完成后第一次启动MDK会提示激活。如果你是正版用户打开License Management输入自己的License ID Code点Add License就行。如果之前已经激活过同一台机器的老版本这里通常是自动识别的直接打开就能用。3.3 Pack部署没有Pack等于白装MDK装好只是第一步装完对应芯片的Pack才算是真正“准备好”。很多新手装了MDK以后打开软件发现器件列表里根本找不到自己要用的单片机型号其实就是因为没装对应的Device Family Pack。Pack部署有两种方式。一种是线上方式打开Pack Installer在Packs窗口里找到对应厂商和芯片系列点击Install就行。这种方式需要有网络而且官方服务器偶尔比较慢。另一种是离线方式从官网下载对应的.pack文件然后直接双击运行或者通过Pack Installer的File菜单里的Import选项导入。离线方式在大规模部署环境、或者多台电脑之间同步开发环境的时候特别方便。这里分享一个我自己常用的技巧如果你有多台开发机只需要在一台上装好所有Pack然后把C:\Users\你的用户名\AppData\Local\Arm\Packs目录整个拷贝到其他机器的相同位置就能省去重复下载安装的过程。这个操作非常实用尤其在公司和家里两台电脑之间同步环境的时候。Pack安装完以后打开MDK新建工程如果能正常看到单片机型号就说明Pack部署成功了。4. 老工程迁移避坑编译器选择与路径配置4.1 打开工程与选择编译器版本AC5还是AC6把老工程迁移到V5.33第一步就是打开工程文件。这里有个细节老版本MDK创建的工程文件后缀可能是.uvprojx这个格式V5.33是兼容的双击就能正常打开。但如果你还有更老的.uvproj工程打开时MDK会提示是否需要转换成新格式选“是”就行。转换过程中MDK会自动生成新的工程文件同时保留原文件备份这种设计比较友好。工程打开以后右键工程名进入Options for Target在Target选项卡里可以看到ARM Compiler选项。这里就是AC5和AC6切换的地方。V5.33默认显示的是Use default compiler version实际默认编译链是AC6。针对老工程我的建议是如果你的工程一直用AC5变得好好的那就尽量保持AC5不要为了尝鲜去切AC6。切换编译器是一场工程级的迁移不是改个选项那么简单。但如果你发现下拉列表里报错误信息提示“Compiler is not installed”那说明当前安装的MDK里没有包含AC5编译器。这种情况要么回到安装管理器里补装AC5支持要么就得踏踏实实把工程迁移到AC6。4.2 Include Paths、宏定义与项目配置最容易翻车的地方升级后最常见的编译报错就是找不到头文件比如fatal error: xxx.h: No such file or directory。这个问题的根源基本都是Include Paths配置丢失或者使用了绝对路径。老工程在低版本MDK里配置的include路径如果使用的是类似C:\Users\xxx\Documents\Project\Lib这样的绝对路径到了新环境里路径完全失效编译器自然找不到头文件。解决办法是在Options for Target的C/C选项卡里点击Include Paths后面的省略号把所有外部库的路径重新配置一遍。这里强烈推荐一个习惯把所有include路径改成相对路径。使用相对路径后整个工程文件夹无论拷贝到哪个盘都能正常编译。相对路径的写法其实很简单.\ 表示当前工程文件所在目录 ..\ 表示上一级目录 .\RTE\ 表示当前目录下的RTE子目录即使你的工程结构比较复杂只要理清楚工程文件所在目录和引用库之间的层级关系用相对路径表达并不难。改完之后把整个工程文件夹复制到U盘换台电脑打开测试一下能编译过就说明路径配置万无一失。宏定义这块也要检查一遍。很多芯片厂商的库代码依赖特定的宏定义比如STM32标准外设库需要定义USE_STDPERIPH_DRIVER和具体的芯片型号宏。升级后如果这些宏丢了源文件里会多出一堆条件编译错误。打开工程后先到C/C选项卡的Define输入框里对照旧工程的配置重新填写一次这个步骤很多人容易忽略但影响非常大。4.3 从AC5切到AC6前必须知道的事如果你的工程确实需要从AC5切到AC6有几个关键差异最好提前了解。AC6基于LLVM/Clang架构语言标准默认是C11而AC5默认是C90。这就导致很多在AC5下用了非标准语法的代码在AC6下直接报错。最常见的差异包括内联关键字从__inline变成了inline第三方库里经常能看到这两种写法混用。内联汇编语法完全不同AC6支持的是GCC风格的汇编写法和AC5的armcc语法有很大区别。如果你的代码里大量使用了内联汇编迁移工作量会比较大。部分编译器内置宏的名称和语义发生了变化比如__CC_ARM在AC6下不再定义取而代之的是__ARMCC_VERSION和相关Clang风格的宏。结构体对齐、位域等内存布局相关的处理AC6的规则和AC5在一些边界场景下会有差异需要逐个确认。基于这些差异我的经验是如果工程依赖第三方老库而第三方库没有提供AC6支持那么建议保留AC5。只有当你确认自己代码以及所有依赖库都能满足AC6的编译要求之后再做切换。5. 升级后高频问题排查编译报错与调试失灵5.1 编译阶段最常出现的报错与处理升级到V5.33以后编译阶段的报错类型其实比较集中很多问题处理一次以后基本就不会再遇到。第一个高频问题是链接错误L6218E: Undefined symbol。这个报错的意思是说某个函数或者变量在编译的时候没有找到定义。升级后碰到这个错误最常见的原因是某些库文件没有被正确链接进来或者宏定义丢失导致条件编译跳过了某个源文件。排查思路是看报错信息里具体是哪个Symbol然后去工程里查这个Symbol所在的源文件是否被包含在编译范围内。第二个高频问题还是头文件找不到。除了前面说的路径问题还有一种可能是某个第三方库的源码文件其实没有复制到新工程目录下。有些工程会把库放在工程目录之外比如D:\SharedLib拷贝工程的时候只拷贝了工程文件夹库目录被落下了。遇到这种就要检查工程引用的所有外部文件是否都完整。第三个问题是旧的库工程兼容性报错例如某个源文件提示“Unknown opcode”或者编译器版本不支持的指令。这类问题通常出现在AC5向AC6切换的场景中处理办法要么调整语法要么退回AC5。我把几个常见报错整理成了一张速查表方便遇到问题时直接对照。报错信息可能原因处理建议fatal error: xxx.h: No such file or directoryinclude路径配置问题检查Include Paths建议改用相对路径L6218E: Undefined symbol xxx库文件未参与链接或宏定义丢失检查源文件是否被加入工程确认Define配置Arm Compiler 5 is not installed当前MDK未包含AC5编译器回退使用AC6或者通过旧版MDK获取编译器target uses ARM-Compiler V5.06 which is not available工程指定了AC5版本但机器上没有安装对应版本的AC5组件或切换AC6armlink: Error: L6220E: Execution region overflowROM超限检查芯片内存型号与工程配置精简代码或换大容量芯片5.2 调试器与下载器问题排查升级完成后工程编译通过并不代表一切顺利很多人会在调试器连接这个环节卡住。V5.33的调试器配置和旧版本相比界面和默认选项有一些调整但总体思路没变。如果你遇到调试器连接不上先按顺序排查下面几个点。第一调试器驱动是否正常。无论用J-Link、ST-Link还是DAP-Link升级MDK后最好去设备管理器里看一眼调试器是否被系统正常识别。有时候MDK升级不会动驱动但Windows更新可能悄悄替换了驱动版本。如果设备管理器里出现黄色感叹号重新安装对应调试器的官方驱动就行。第二MDK的Debug选项配置是否正确。打开Options for Target的Debug选项卡右边是调试器选择区域确保选了对应的调试器型号同时勾选了Run to main这个选项。如果你用的是J-Link还要检查Interface是不是选对了SW还是JTAG取决于目标板的接线方式。第三Flash Download设置里的编程算法是否正确。这个问题非常隐蔽。升级后有时候Flash Download里的Programming Algorithm列表是空的或者默认算法和你的芯片不匹配。点开Flash Download的Settings在Flash Download页面里Add你的芯片对应的算法比如STM32F1系列通常选择STM32F1xx Flash 256KB这个选项。如果没有添加正确的算法下载时会报错Programming failed但编译和链接都完全正常很容易让人一头雾水。5.3 License异常与本地化环境问题最后一类高发问题主要集中在License和环境路径上面。升级后打开软件提示License失效这种情况先到License Management里重新输入License ID Code试试。如果还是不行检查一下电脑的硬件信息是否发生了变化比如更换了网卡、硬盘或者主板。Keil的授权和硬件绑定比较敏感硬件一变就需要重新激活。中文路径和中文用户名是另一个高发问题。如果工程放在中文路径下MDK偶尔会出现无法创建中间文件、调试时无法加载镜像等情况。系统用户名如果是中文Pack安装路径里会带上中文目录某些老版本的第三方工具会因为这个原因崩溃。这类问题最好从源头解决把工程路径改成纯英文有条件的话创建一个英文用户名的专用开发账户。6. 我这个月用下来的心得与建议6.1 多版本共存与回滚预案的实战经验升级前我一直担心回不去旧版本所以试用了一段时间以后我对多版本共存的现状做了一个总结如果不是特殊情况不建议在同一台机器上长期共存两个版本。后安装的版本会覆盖Keil全局的TOOLS.INI配置导致两个版本互相干扰。打开旧版时提示找不到组件打开新版时发现配置被旧版覆盖这种来回折腾最消耗耐心。我比较推荐的方案是升级前给系统创建一个还原点或者用磁盘分区工具把当前的开发环境整体镜像备份。一旦新版环境出现无法解决的问题直接回滚到还原点比安装完旧版再手动恢复一堆配置要快得多。6.2 三个提升日常使用效率的小技巧这几个小技巧是我平时用MDK觉得最省事的这里一并分享出来。第一离线Pack同步。如果你有多台电脑在配置好一台环境后把Packs目录直接拷贝到其他电脑的对应位置省去一次一次在线安装。需要注意的是拷贝时最好关闭MDK防止文件占用导致拷贝不完整。第二用相对路径管理工程。这算是一个老生常谈的问题但真的非常值得坚持。全部改成相对路径以后工程可以随意拷贝、改名、挪位置都不需要重新配置路径。我和同事之间同步代码的时候基本不会再因为路径问题浪费时间。第三善用工程备份功能。MDK自带的File - Backup Projects会生成一个日期标记的备份包代码改到一半出了大问题直接用这个备份回退非常方便。它的压缩机制做得不错比手动复制更省空间而且会带上工程相关的配置信息。6.3 我的最终建议升但要有章法这次升级折腾下来我的体会是升级本身不难难的是升级前有没有把工程、Pack、License这三件事安排明白。如果你手上有生命周期比较长的老项目不要在项目交付前一周临时升级。真想升级最好在项目收尾后或者新项目启动前留出半天左右的缓冲时间专门处理环境迁移。这样即使遇到问题也不会影响交付节点。V5.33整体用下来确实比老版本顺手无论编译速度还是调试器稳定性都有提升。只要做好备份、按部就班地处理Pack和编译器配置大部分升级问题其实都是有解的。如果你正在准备升级希望这篇文章能帮你少走一些弯路。
返回列表