ARTICLE DETAIL

资讯详情

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

ARM Compiler 5.06安装配置全攻略:解决Keil5老工程编译报错

ARM Compiler 5.06安装配置全攻略:解决Keil5老工程编译报错 玩嵌入式的人多少都有过这种体验从同事U盘里拷来一个“绝版”老工程Keil5 一打开编译键按下去满屏 error 不说最气的是连编译器都没加载出来。尤其是提示 ARM Compiler 5.06 not found、Target uses ARM-Compiler 5.06 which is not available 这种新手大概率当场懵住第一反应就是重装 Keil结果重装完问题还在。其实问题不在 Keil 本体而是工程指定的编译器版本没装上。这篇就把我在实际安装配置 ARM Compiler 5.06 时踩过的坑以及一套可以直接照抄的完整流程写出来。内容包括为什么老工程依赖它、从哪里下载、怎么在 Keil5 里选对版本、装完怎么验证还有那些“看起来和编译器无关但实际就是编译器导致”的故障。适合刚接触 Keil5 的新手也适合被老工程折磨过想一次性解决问题的老哥。1. 为什么老工程离不开 ARM Compiler 5.061.1 先搞清楚 Keil 和编译器是两回事很多人把 Keil 当成一个“能编译单片机的软件”实际上 Keil 只是一个集成开发环境IDE里面装了什么编译器、什么芯片包决定了它能编译哪些工程。Keil MDK 官方自带 ARM Compiler 6简称 AC6但很多老工程、旧例程、网上下的标准外设库工程默认用的都是 ARM Compiler 5简称 AC5尤其是 5.06 这个版本被大量工程写死在配置里。你用 AC6 打开一个当年用 AC5 写的工程轻则一堆 warning重则直接大量 error。这不是代码写得不好而是两代编译器的语法标准和优化逻辑完全不同。AC6 基于 LLVM 架构默认更严格、更激进AC5 则更加“迁就”老代码。所以老工程要在现代 Keil5 里正常编译最省事的办法不是去改代码而是把对应的 AC5 编译器装回去。1.2 AC5 和 AC6 的核心差异简单说AC5 是 ARM 经典编译器当年的产物支持 C90/C99很多 2015 年前后的固件库、DSP 库、启动代码都围绕它优化过。AC6 是后来基于 Clang/LLVM 的新一代编译器支持 C11 等新标准编译速度快、优化能力强但带来的问题是对旧代码的兼容性明显变差。举个实际例子ST 标准外设库StdPeriph_Lib里的很多赋值语句、结构体初始化写法在 AC5 下编译零警告切到 AC6 后直接报错说“变量不能用于常量初始化”。再比如一些老驱动里用了编译器内置关键字或特定函数声明方式AC6 下也要重新适配。对于只想把老工程跑起来、看现象的同学完全没有必要去改造代码装 AC5 才是正路。1.3 哪些工程必须用 AC5结合我自己的经验下面这几类工程几乎离不开 AC5ST 官方标准外设库 V3.5 及更早版本的例程。网上流传的大量开发板例程尤其是 2018 年以前发布的。使用旧版 DSP 库、旧版 FatFS、旧版 LWIP 移植的工程。某些第三方闭源库或只提供了 AC5 预编译文件的工程。学校教材、视频课程配套的老工程包。这类工程有一个共同特点作者在写代码时根本没考虑过未来要切 AC6所以工程文件里就是写死 AC5。你非要强行用 AC6 编译就要处理语法兼容、宏定义差异、启动文件匹配等一系列问题费时费力不讨好。2. 下载与准备工作2.1 安装前先确认 Keil 本体状态动手装编译器之前先把 Keil5 本身弄干净。我这里说的“干净”不是指重装而是要确认以下几点第一Keil 版本不能太老。ARM Compiler 5.06 在 MDK 5.20 以上版本都能安装但如果你还在用 MDK 5.10 之类的远古版本建议先升级。第二检查 Pack Installer 是否正常。打开 Keil 后点击菜单栏的 Pack Installer 按钮看能不能正常显示和下载。第三确认你当前安装的是 MDK 版本而不是 C51 版本。这两个是独立安装包一个用于 ARM 单片机一个用于 8051 单片机千万别搞混。有一个很典型的坑有人安装了 Keil C51然后打开 ARM 工程发现 Target 选项卡里根本没有 ARM Compiler 的选项或者选项是灰的。其实这不一定是你没装编译器而是因为当前 Keil 版本是 C51 的根本不支持 ARM 工程。C51 和 MDK 是可以共存安装的但需要分别安装到不同目录或用官方兼容模式处理否则就会出现各种“看起来是配置问题实际是版本装错”的假象。2.2 版本选择为什么认准 5.06 update 7 build 960ARM Compiler 5 系列的最后更新是 5.06 update 7版本号里对应的 build 是 960。网上搜“arm compiler 5.06 update 7 (build 960)”能搜到一堆资源但我不建议随便去不知名网站下载原因后面细说。为什么具体到 build 960因为这是 AC5 系列最后一个稳定版本后续官方不再更新。老工程在写的时候用的可能就是早期某个 update 版本但 5.06 update 7 基本能兼容所有基于 AC5 的工程。与之相比AC5 早期版本比如 5.03、5.04存在一些已知编译 bug也没必要特意去找来安装。认准 update 7 build 960这是最稳的选择。2.3 下载渠道与安装包类型下载渠道有两条路优先走官方在 Keil 软件内部操作打开 Pack Installer找到 Add Software Packs在里面搜 ARM Compiler点击 Install。这种方式最省心会自动匹配你当前的 Keil 版本。去官网下载离线安装包在 Arm Keil 官网的 Pack 下载页面搜索 ARM Compiler下载.pack 文件后双击导入。很多人喜欢去第三方网站下载但我的经验是这类工具类软件被改包的情况非常多。有的下载完是多层压缩套娃有的是绑定全家桶还有的直接是病毒伪装。你要是装完编译器发现电脑变卡、后台弹广告大概率是下载源有问题。老老实实用官方渠道最多慢一点但安全干净。3. 安装与配置完整流程3.1 在 Keil 内部一键安装 ARM Compiler 5.06最推荐的方式是在 Keil 内部安装流程很简单打开 Keil5点击菜单栏的 Pack Installer 按钮快捷键是 AltP。在弹出的 Pack Installer 窗口中点击左侧的 Add Software Packs 分类。在右侧列表中找到 ARM Compiler 5.06 update 7 (build 960)点击 Install。等待下载安装完成期间尽量不要关闭 Keil 或电脑休眠。安装完成后打开任意工程在 Options for Target 的 Target 选项卡里把 ARM Compiler 下拉框切到 5.06点确定即可。这个方式的优点是版本匹配做得好不需要手动处理路径问题。安装完成后编译器默认放在 Keil 安装目录的 ARM/ARMCC 下你可以用文件管理器确认一下看到 armcc.exe 就说明装好了。3.2 使用离线 pack 包安装如果你的电脑网络条件不好或者公司内网访问不了官网那就用离线包方式。先从官网下载 ARM Compiler 5.06 的.pack 文件下载完成后直接双击Keil 会自动识别并导入。如果双击后没有任何反应别急着删文件可以尝试右键用 Keil 打开或者把.pack 文件改名为.zip 后缀手动解压。解压后你会看到里面是一个标准的 ARM Pack 目录结构包含 ARM/ARMCC 文件夹等把它放到 Keil 安装目录的 ARM/PACK/ARM/ 路径下然后再重启 Keil 尝试编译。但这里要提醒一句手动放 pack 是应急手段新手如果对目录结构不熟悉建议先采用一键安装或离线双击导入。手动放包一旦路径不对Keil 没有报错但编译器就是找不到排查起来更费劲。3.3 许可证与激活问题装好了编译器之后还要保证 Keil 本身有合法的使用许可。ARM Compiler 安装成功不等于你可以无限编译MDK 工程在编译时会校验许可证没有有效许可证会直接报错比如 Product/Feature 相关提示。如果你已经有正版许可证在 Keil 的 File - License Management 里确认状态正常即可。如果是刚装的 Keil需要输入正版 License ID Code (LIC) 完成激活。网上流传的“注册机”“破解补丁”我强烈不建议碰很多这类工具本身捆绑木马而且新版 Keil 会检测异常授权装完没几天又被封得不偿失。判断 Keil 激活是否成功最直接的办法是新建一个简单 ARM 工程试编译能正常出.axf 文件就说明没问题。3.4 验证编译器是否真正生效装完 AC5 后很多人忘了切编译器版本结果编译时发现还是用 AC6 编译报错场景依旧。验证方法有两种第一种在 Keil 里打开工程菜单栏 Project - Options for Target - Target看 ARM Compiler 下拉框。如果下拉列表里能看到“ARM Compiler 5.06”说明已经安装成功选中它即可。第二种直接用命令行验证。打开 CMD进入编译器目录执行版本命令cd C:\Keil_v5\ARM\ARMCC\bin armcc.exe --version如果输出类似 ARM Compiler 5.06 update 7 (build 960) 的信息说明编译器没问题。注意这只是验证工具本身最终工程能不能编译通过还要看工程配置是否正确。4. 工程配置三板斧4.1 在 Options for Target 里指定编译器版本进入 Options for Target快捷键 AltF7在 Target 选项卡中间偏右的位置有一项 ARM Compiler下拉菜单里可以看到当前 Keil 能识别到的所有编译器版本。这里有两种选择逻辑选择 Use latest installed version表示让 Keil 自动使用最高版本编译器如果你装的是 AC6 和 AC5 共存它会默认选 AC6。选择 Use installed version然后手动指定 ARM Compiler 5.06这是处理老工程最稳妥的方式直接锁定 AC5。很多老工程打开后报错“Target uses ARM-Compiler”但你的 Keil 明明已经装了 AC5就是因为这个下拉框还停留在 AC6 上。手动切过去重新编译大概率问题就消失了。4.2 芯片包缺失导致的问题别赖编译器有时候编译报错并不是编译器的问题而是芯片包Device Family PackDFP没装。比如打开 STM32 工程如果 Target 选项卡里的 XTAL 晶振频率灰色不可选说明当前没有正确选择 Device或者对应芯片包没装。解决方法是打开 Pack Installer在 Packs 选项卡里找到对应厂商和芯片系列比如 Keil.STM32F1xx_DFP点击 Install。装完之后再回到 Options for Target - Device选择你的芯片型号XTAL 就能正常编辑了。这个坑非常隐蔽因为它和编译器安装流程交叉在一起很多时候你刚装完 AC5又被芯片包缺失的问题卡住误以为 AC5 没装好白折腾半天。4.3 老工程迁移时的三个检查点老工程在另外一台电脑或新 Keil 环境下打开除了编译器版本还要检查三个关键点第一启动文件和分散加载文件是否存在。很多老工程用相对路径引用 startup_xxx.s 和 .sct 文件工程目录一搬家就找不到路径报错信息通常是 cannot open file。确认这些文件还在工程目录下必要时在 Options for Target 的 Linker 选项卡里重新指定。第二宏定义是否完整。STM32 标准库工程一般需要 USE_STDPERIPH_DRIVER 这样的宏如果在 C/C 选项卡的 Define 里丢了编译时会报一堆函数未声明。第三路径中不要有中文和空格。这是个老生常谈但很多人不重视的问题编译器在处理带中文路径时容易出幺蛾子建议把工程放到纯英文目录。5. 常见问题与排查技巧实录下面把我实际遇到的问题和排查思路整理成速查表方便你对照参考现象可能原因解决办法编译报错 Target uses ARM-Compiler 5.06 which is not availableAC5 未安装或 Keil 未识别按第 3 章方式安装并切换编译器Target 选项卡里 ARM Compiler 下拉框没有 5.06 选项编译器安装失败或安装位置不对用离线包重装确认 ARM/ARMCC/armcc.exe 存在工程能编译但烧录失败 / Flash 算法缺失芯片包 DFP 未安装完整Pack Installer 中安装对应芯片系列 DFPTarget 选项卡的 XTAL 灰色不可编辑Device 未选中或芯片包缺失在 Device 选项卡选择芯片确认 DFP 已安装老工程出现大量语法错误编译器版本还是 AC6切到 AC5必要时勾选 C99 Mode编译时提示找不到 .sct 或启动文件工程路径变更导致相对路径失效重新指定启动文件和分散加载文件路径杀毒软件弹出 armcc.exe 风险提示杀毒软件误报将 Keil 安装目录加入杀毒软件白名单5.1 报错“ARM Compiler 5.06 not available”的深坑这个报错出现概率极高但原因未必是“没安装”这么简单。我遇到过一种情况是Keil 重装后AC5 编译器文件确实还在磁盘上但 Keil 没有正确识别路径导致提示 not available。这时候不用重新下载只需要检查注册表或 Keil_TOOL 相关环境变量是否指向了正确的安装路径。另一种情况是 Keil 升级时把 AC5 当作“仅保留工程所需”的次要组件处理了因为老工程被打开的次数不多Keil 的一些自动整理操作可能把编译器文件移到备份目录。如果你确定装过 AC5 但现在识别不到可以在 ARM/ARMCC 路径下找一下多半文件还在只是 Keil 没扫到。5.2 编译通过但一 full chip erase 就黑屏这个就更有意思了有同学反映“编译器装好工程也能编译但下载程序后板子没反应全片擦除后连固件都烧不进去”。排查了一圈最后发现是 Flash Download 里的编程算法没选对。老工程切到新 Keil 环境下Debug 设置里的 Flash Download 可能默认了错误算法比如 STM32F103 大容量型号选了 F1 系列通用算法但芯片实际是 512KB 容量算法列表不一致导致烧写异常。解决方法是Options for Target - Debug - 右侧 Settings - Flash Download 选项卡勾选 Reset and Run然后在 Programming Algorithm 列表里手动添加与芯片型号匹配的算法。这个和编译器安装没关系但如果你刚装完 AC5 后遇到容易误认为是编译器的问题。5.3 用 Windows 用户目录名称是中文导致编不过如果你电脑的用户名是中文而 Keil 安装目录或工程路径又恰好放在用户目录下编译器在解析路径时可能直接罢工。这个问题在 AC5 上比 AC6 更敏感因为 AC5 对路径字符集的容错性不如新版编译器。解决思路有两条一是把 Keil 安装目录和工程目录放到非中文路径下比如 D:\Keil_v5、D:\Project二是如果已经装在 C:\Users\张三\Keil_v5建议重装到纯英文目录。别怕麻烦早改早解脱。5.4 网上搜到的下载站藏毒问题再强调一次下载安全。很多人习惯在搜索引擎里搜“arm compiler 5.06 update 7 (build 960) 下载”点进去看到醒目的下载按钮就点了结果下载下来是个压缩包解压后还要扫码加群才能看到真正的下载链接。这类资源站十有八九是引流或捆绑站真正拿到手的文件是不是原版谁也不敢保证。稳妥方案就是坚持官网路径进入 Arm Keil 官网的 Pack 下载页搜索 ARMCompiler 5.06 update 7下载.pack 文件。如果你的网络能正常访问官网整个过程也就两三分钟何必去赌第三方资源的可信度。6. 那些年我踩过的编译器坑说句实在话ARM Compiler 5.06 这个老版本我现在每台工作电脑上都留着。平时开发新项目用 AC6 没毛病编译快、代码密度也不错但一遇到老工程、旧开发板、网上流传的例程包AC5 几乎成了刚需。有一次帮同事调一个 2016 年的 LPC1768 工程他用的是新版 Keil默认 AC6 编译光是处理 warning 就耗了半天。后来我给他装了 AC5把编译器下拉框切过去一个代码都没改编译直接通过。从那以后他就学乖了桌面常备 AC5 离线安装包遇到老工程先看编译器版本再动手。另外分享一个小技巧如果你只需要临时验证一个老工程能不能跑不用特意把整个工程迁到新环境直接在 Options for Target 里切到 AC5确认宏定义和芯片包没问题大概率一次过。等你确定要长期维护这个工程再考虑做代码层面的 AC6 适配比如结构体初始化改法、特殊函数声明改法、启动文件替换等等。两步走效率最高。还有一点Keil 版本升级别太勤。MDK 5.36 之后的版本和 AC5 的兼容性其实已经不如老版本那么“无缝”了因为官方把重心完全转移到 AC6 上。如果你长期依赖 AC5建议保持在一个稳定版本号不要看到新版本就升级不然哪天装完新 Keil 发现 AC5 兼容性出了问题你都不知道该回滚还是换机子。最后说个实用的小经验装完 AC5 后最好用命令行走一遍 armcc --version 做验证同时把 Keil 安装目录加入杀毒软件白名单这一步能省掉很多后续的灵异问题。别问我怎么知道的被杀毒软件误删 armcc.exe 导致编译器突然消失这种事我真的遇到过不止一次。
返回列表