ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Arm Compiler 5.05 update 1 安装与配置全指南:从版本校验到最小工程验证

Arm Compiler 5.05 update 1 安装与配置全指南:从版本校验到最小工程验证

简介:Arm Compiler 5.05 update 1(build 106,r5p5-01rel1,2014年12月3日发布)是面向嵌入式开发者的经典ARM编译器Windows版本,主要服务于使用Keil MDK进行ARM Cortex-M等芯片固件开发、需要指定旧版编译工具链的工程师与学习者,可解决新版编译器兼容性差异、工程需锁定ARMCC 5.05版本的问题。资源包共3个文件,以msi安装数据、exe安装引导程序为主,另附一份html说明文档,压缩包约80.56MB,解压后运行setup.exe即可完成安装,并可在Keil的Manage Project Items中通过Folders/Extensions选项卡将该编译器目录添加为可选工具链。目前已有890人学习下载,适合需要复现旧工程编译环境、对照版本差异或维护历史项目的读者获取,安装包与说明文档齐备,便于快速定位安装路径与配置入口。

1. 装 Arm Compiler 5.05 update 1 之前,先把版本号读对

很多人第一次装 Arm Compiler 5.05 update 1(build 106)时,栽的不是技术坑,是版本号没读明白。标题里三个数字各有含义:5.05 是主版本,update 1 是补丁级别,build 106 是这一补丁的具体构建号。我见过有人把 5.05 和 5.06 的补丁混着装,结果链接脚本里的--scatter参数行为对不上,编译能过、烧录跑飞,查了两天才发现是编译器版本和工程配置不匹配。这套工具链在嵌入式圈子里太常见了,大量老工程、芯片厂商的启动文件和库都是按 AC5 的语法和 ABI 编的,装错版本或者装完没配好 license,轻则报Error: C9555E,重则整个工程编不过。这篇笔记面向的是手里有一份 AC5 安装包、需要在 Windows 上把它跑起来的开发者,从环境要求一路写到装完怎么验证,中间该避的坑我都标出来。

2. 环境准备与安装包校验:装之前先确认这三件事

2.1 操作系统与依赖环境对照

Arm Compiler 5.05 update 1 是 32 位工具链,官方支持的是 Windows 7 到 Windows 10 的 32/64 位系统。我在 Windows 11 上装过,能跑,但安装器偶尔会弹兼容性提示,忽略即可。真正需要注意的是下面这张对照表里的几项,装之前逐条确认,能省掉后面一半的排错时间。

项目要求说明
操作系统Windows 7 SP1 / 8 / 10(32 或 64 位)Windows 11 可运行,安装器可能提示兼容性
磁盘空间安装目录预留 2 GB 以上含 examples 和库文件
权限管理员权限安装器要写注册表和系统目录
依赖运行库Microsoft Visual C++ 运行库缺了会在启动armcc.exe时报缺少 DLL
路径字符全英文、无空格中文路径是编译报错的经典来源

路径这一条我要多说一句。安装目录我一般固定用C:\Keil_v5\ARM\ARMCC或者D:\Tools\ARMCC5,绝不放在「桌面」「下载」这类中文目录下。AC5 的很多内部脚本对非 ASCII 路径处理得不好,编译时可能报找不到头文件,但文件明明就在那儿,这种玄学问题排查起来非常费劲。

2.2 安装包完整性校验

拿到安装包先别急着双击。AC5 的安装包通常是一个自解压 exe 或者一个目录,里面包含setup.exe、license相关文件和sw子目录。校验分两步走:先看文件大小是否和来源标注一致,再用哈希对一遍。常见做法是打开 PowerShell 算 SHA256:

# 计算安装包的 SHA256,和来源提供的值比对 Get-FileHash -Algorithm SHA256 "D:\Install\ARMCC5_05_u1_b106.exe"

Get-FileHash的-Algorithm参数指定哈希算法,SHA256 足够。算出来的值和来源给的一致,说明包没在下载过程中损坏。我踩过一次坑:安装包下到 90% 断了,文件大小看着差不多,双击安装到一半报CRC error,重下才解决。所以校验这步别省。

如果拿到的是解压后的目录,重点确认sw\目录下有armcc、armlink、armar这几个可执行文件,缺任何一个都说明包不完整。

2.3 安装前的清理动作

如果机器上之前装过别的版本 AC5,或者装过 Keil MDK 自带的编译器,先做清理。打开注册表编辑器,定位到HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\ARM,看看有没有残留的编译器注册项;再看环境变量里有没有指向旧版本的ARMCC5_HOME或PATH条目。残留的旧路径会让新装的编译器被「抢先命中」,你明明装的是 5.05 update 1,armcc --version却报出 5.06,这种翻车我遇到过不止一次。

清理完重启一次资源管理器,让环境变量刷新,再进安装流程。

3. 安装与 License 配置:把编译器真正激活

3.1 执行安装器与目录选择

双击setup.exe,安装向导第一步是选择安装类型。这里选Custom,不要选Typical,因为 Typical 会顺带装一些用不上的示例和文档,占空间还拖慢后续查找。自定义安装时只勾选ARM Compiler和Utilities两项即可。

安装路径按 2.1 节的规则填全英文路径。向导走到 license 配置页时会停下来,这一步是整篇最容易卡住的地方,单独放到下一节讲。

安装完成后,安装器会在开始菜单生成一个ARM Compiler 5.05的程序组,里面有一个ARM Compiler 5.05 Command Prompt快捷方式。这个快捷方式本质上是一个预设好环境变量的 cmd 窗口,后面验证版本就用它。

3.2 License 配置的两种方式

AC5 的 license 配置有两种常见做法,选一种即可。

第一种是环境变量方式,适合单机固定使用。在系统环境变量里新增:

# 变量名 ARMCC5_LICENSE_FILE # 变量值,指向 license 文件所在路径 C:\Keil_v5\ARM\ARMCC\license.dat

ARMCC5_LICENSE_FILE是 AC5 认的变量名,值必须是 license 文件的完整路径,不能是目录。配完要重新打开命令行窗口才生效,因为环境变量在进程启动时读取。

第二种是安装器内置的 license 向导,在安装过程中或安装后从开始菜单启动License Management,把 license 文件导入。这种方式会把信息写进注册表,适合多用户共用一台机器的情况。

两种方式不要同时配,否则可能出现 license 冲突,报License error: 1.2。我一般只用环境变量方式,卸载重装时清理干净,不留注册表尾巴。

3.3 验证编译器是否被正确识别

装完先别急着编工程,用命令行确认编译器本身是活的。打开ARM Compiler 5.05 Command Prompt,执行:

armcc --version

正常输出应该包含ARM Compiler 5.05 update 1 (build 106)字样。如果报'armcc' 不是内部或外部命令,说明 PATH 没配好,回到 3.1 节检查安装是否完整;如果报 license 相关错误,回到 3.2 节检查变量名和路径。

再补一条检查链接器:

armlink --version

armlink和armcc版本号必须一致,都是 5.05 update 1 build 106。我见过只更新了编译器没更新链接器的情况,编出来的镜像段地址错位,烧进去直接不启动。两个都确认过,才算安装这步真正完成。

4. 工程侧配置:让老工程认出新编译器

4.1 在构建系统中指定编译器路径

AC5 装好后,工程侧要显式指向它。以常见的 Makefile 工程为例,把编译器前缀和路径写死:

# 指定 AC5 工具链路径,注意用正斜杠或双反斜杠 ARMCC_DIR = C:/Keil_v5/ARM/ARMCC/bin CC = $(ARMCC_DIR)/armcc.exe AS = $(ARMCC_DIR)/armasm.exe LD = $(ARMCC_DIR)/armlink.exe AR = $(ARMCC_DIR)/armar.exe # 编译选项:Cortex-M3 内核,小端,优化等级 -O1 CFLAGS = --cpu Cortex-M3 --littleend -O1 -c --apcs=interwork

--cpu参数必须和你的目标芯片内核一致,填错会报指令集不支持的错;--apcs=interwork是 ARM 和 Thumb 指令互调的开关,老工程基本都要带;-O1是优化等级,调试阶段建议用-O0,发布再切-O1或-O2。路径里用正斜杠是为了避免 Makefile 把反斜杠当转义符。

如果是 Keil MDK 工程,在Options for Target的Target页把ARM Compiler下拉框选成Use default compiler version 5,再在Folders/Extensions里确认编译器根目录指向新装的路径。

4.2 处理新旧版本语法差异

从更老的 AC5 版本或者从 AC6 迁过来的工程,常遇到两类语法问题。第一类是内联汇编写法,AC5 用__asm块,AC6 用__asm关键字加不同语法,混用会报错。第二类是__align和__packed这类扩展关键字,AC5 认,但某些新版本头文件里改成了__attribute__写法。

遇到这类报错,不要急着改工程源码,先确认是不是头文件版本和编译器版本不匹配。常见做法是把芯片厂商提供的启动文件startup_xxx.s和系统文件system_xxx.c换成与 AC5 配套的版本,而不是硬改语法。我一般会在工程里单独建一个toolchain/ac5目录放这些适配文件,切换编译器时整目录替换,不动业务代码。

4.3 编译选项的取舍

AC5 的编译选项里,有几个参数值得单独说。--c99开启 C99 支持,老工程如果用了//注释和变量声明在语句中间,必须带这个;-g生成调试信息,配合--debug使用;--split_sections把每个函数单独放一个段,配合链接器的--remove能砍掉未引用代码,减小镜像体积。

这几个参数不是越多越好。--split_sections会让编译产物变多,链接时间变长,小工程没必要开。-O2以上优化在调试时会让断点跳来跳去,定位问题很痛苦,所以调试期我固定-O0 -g,发布前再切优化等级并重新回归测试。

5. 避坑与排查:五条血泪记录

5.1 报错 C9555E:找不到 license

现象是编译任何文件都报Error: C9555E: Failed to check out a license。原因通常是 license 文件路径含中文或空格,或者ARMCC5_LICENSE_FILE变量值写成了目录。解决办法是把 license 文件挪到全英文路径,变量值精确到文件名,然后重开命令行窗口。如果还不行,用License Management工具重新导入一次,看它报的具体错误码。

5.2 编译通过但运行跑飞:版本不一致

现象是工程能编过,烧录后程序不启动或进 HardFault。原因多半是编译器、链接器、启动文件三者版本不匹配。解决方法是分别执行armcc --version和armlink --version确认一致,再核对启动文件是否来自同一版本的库包。我一般会在工程里加一个构建脚本,编译前自动打印两个版本号,对不上就中止构建。

5.3 中文路径导致头文件找不到

现象是报fatal error: #5: cannot open source input file "xxx.h",但文件确实存在。原因是工程路径或安装路径含中文,AC5 内部脚本处理不了。解决办法是把工程整体挪到全英文路径,安装目录也检查一遍。这个坑最隐蔽,因为报错信息完全不提路径问题。

5.4 环境变量残留导致版本错乱

现象是明明装了 5.05 update 1,armcc --version却报旧版本号。原因是 PATH 里旧版本路径排在前面,或者注册表有残留。解决办法是清理环境变量和注册表HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\ARM下的旧项,重启命令行再验证。

5.5 安装器中途报 CRC error

现象是安装到一半弹CRC error或解压失败。原因是安装包下载不完整或被杀毒软件拦截。解决办法是先按 2.2 节校验哈希,不一致就重下;哈希一致但仍报错,临时关闭杀毒软件再装,装完再开。我遇到过杀软把armcc.exe当可疑文件隔离的情况,装完发现 bin 目录少文件,加白名单后重装才正常。

6. 装完怎么验证跑通:一个最小工程走全流程

验证不能只看--version,要编一个能跑的最小工程。我一般建一个三文件的测试工程:main.c、startup.s、link.scat,用命令行走完编译、汇编、链接三步,最后检查生成的 axf 和 hex 文件。

先写一个最简单的main.c:

/* 最小验证程序:只做一次全局变量赋值,便于观察反汇编 */ volatile int g_counter = 0; int main(void) { g_counter = 0x5A5A; while (1) { g_counter++; } }

编译命令按 4.1 节的变量展开,实际执行:

armcc --cpu Cortex-M3 --littleend -O0 -g -c main.c -o main.o armasm --cpu Cortex-M3 --littleend startup.s -o startup.o armlink --scatter link.scat main.o startup.o -o test.axf fromelf --bin test.axf --output test.bin

fromelf是 AC5 自带的格式转换工具,--bin生成裸二进制,--output指定输出名。四步都无报错,且test.bin大小在几 KB 量级,说明工具链完整可用。

接着做两项检查。第一项,用fromelf --text -c test.axf反汇编,确认main函数里能看到0x5A5A这个立即数被写进内存,证明编译优化没有把代码优化掉。第二项,把test.bin烧进目标板或者用仿真器加载test.axf,看g_counter是否在递增。两项都过,这套 AC5 环境才算真正跑通。

下面这张表是我每次装完必查的清单,照着走一遍,基本不会漏:

检查项命令或动作通过标准
编译器版本armcc --version显示 5.05 update 1 build 106
链接器版本armlink --version与编译器版本一致
License编译任意文件无 C9555E 报错
最小工程四步编译链接生成 axf 和 bin
反汇编核对fromelf --text -c能看到预期立即数
目标板运行烧录或仿真变量按预期变化

这套流程我坚持了很多年,起因是有一次赶项目,装完只跑了--version就开工,结果链接器是旧版本,镜像段地址错位,烧进去板子毫无反应,排查到凌晨才发现是版本不一致。从那以后我每次装完 AC5 都强制走一遍最小工程加反汇编核对,宁可多花二十分钟,也不在调试阶段还这笔债。希望帮到你。

本文还有配套的精品资源,点击获取

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进