☰
ARMCC 5.06安装配置全攻略:从环境对齐到工程验证
2026/11/4 14:03:46 网站建设 项目流程

简介:ARMCC 5.06 是 ARM 公司随 Keil MDK 提供的嵌入式 C/C++ 编译器,专为 ARM 架构优化代码生成,在基于 Cortex-M 内核的 STM32 开发中应用广泛。对于依赖旧版工具链的存量项目、需要复现历史编译结果的工程,或仍在维护经典 MDK 工程的嵌入式开发者而言,这一版本具有不可替代的实用价值。压缩包共 651 个文件,约 78.75MB,以 l、b 等编译器库与二进制组件、h 头文件、cc 源文件为主,另含 exe 可执行程序、s 汇编文件、map 映射文件及一批 C++ 标准库头文件,基本覆盖编译、链接与运行所需的完整组件。目前已有 5158 人学习下载,说明其在旧工程维护场景中仍有稳定需求。借助包内编译器与配套库、头文件,读者可完成工程配置、按优化级别编译链接并生成可执行固件,配合调试器排查问题,适合需要还原特定编译环境或研究 ARMCC 代码优化的开发者参考。

1. 装 ARMCC 5.06 这件事,翻车往往发生在“装完”之后

接手一个老项目,工程目录里躺着.uvprojx,双击打开 Keil MDK 提示编译器缺失,编译按钮灰着,或者一编译就报cannot open source input file "core_cm3.h"。这类场景在维护早期 STM32 工程时太常见了——工程是用 ARMCC 5.06 建的,而新装的 MDK 默认只带 ARM Compiler 6,两套编译器对 C 标准的容忍度、内联汇编语法、启动文件写法都不一样。装不好会怎样?轻则一堆 warning 刷屏,重则链接阶段报L6235E之类的错误,查半天发现是编译器版本对不上。这篇笔记写给两类人:刚接手旧工程、需要把 ARMCC 5.06 装回去的开发者,以及想搞清楚 MDK 里编译器版本怎么切换、路径怎么配的熟手。下面按“环境先列清、再一步步装、最后能验证跑通”的顺序走。

2. 环境与版本先对齐:ARMCC 5.06 到底装在哪、配什么

2.1 先确认你手上是哪种 MDK,别装错位置

ARMCC 5.06 不是一个独立安装包就能搞定的东西,它通常以“Legacy Support”或独立编译器包的形式存在,最终要落到 MDK 的安装目录下。第一步不是急着双击安装程序,而是先确认当前 MDK 的版本和安装根目录。常见做法是打开 Keil uVision,菜单Help → About uVision看版本号,再看Project → Manage → Project Items → Folders/Extensions里ARM Compiler那一栏指向的路径。

我一般会先在命令行确认目录结构,避免图形界面里看走眼:

# 查看 MDK 安装根目录下的 ARM 编译器目录结构 ls -d "/c/Keil_v5/ARM/"*/ 2>/dev/null # 典型输出会包含 ARMCC、ARMCLANG、ARMCC5 之类的目录名

这段命令在 Git Bash 或 WSL 下执行,作用是列出ARM目录下所有子目录。逻辑很简单:ARMCC 5.06 的实体通常是一个名为ARMCC或ARMCC506的文件夹,里面包含bin、include、lib三层。如果你看到的是ARMCLANG,说明当前 MDK 主推 AC6,ARMCC 5.06 需要额外补装。参数上没什么可调的,关键是路径别带空格和中文——这是后面所有配置能生效的前提。

提示:MDK 安装路径里出现空格(比如Program Files)时,部分旧版编译器调用会解析失败,建议统一装在C:\Keil_v5这类短路径下。

2.2 版本对照:5.06 和 5.06u 系列别混用

ARMCC 5.06 有几个小版本变体,工程里Options for Target → Target页显示的编译器版本字符串要和实际目录对得上。下面这张表是我整理过的常见对应关系,装之前先对一眼:

工程里显示的版本实际目录名常见写法适用场景
ARM Compiler 5.06ARMCC多数 Cortex-M3/M4 老工程
ARM Compiler 5.06 update 6ARMCC506带 FPU 配置的工程
ARM Compiler 5.06 update 7ARMCC506需要较新头文件支持的工程

表格里“目录名常见写法”不是绝对的,不同来源的安装包解压后命名会有差异,判断依据是目录内bin\armcc.exe的版本输出。装完后可以用一条命令验证:

# 直接调用 armcc 查看版本,确认是 5.06 系列 "/c/Keil_v5/ARM/ARMCC/bin/armcc.exe" --version # 期望输出包含 "ARM Compiler 5.06" 字样

这条命令绕开了 uVision 图形界面,直接问编译器自己。逻辑说明:--version是 ARMCC 的标准版本查询参数,输出里会带 build 号和日期。如果提示找不到文件,说明目录名或路径不对,回到上一步重新核对。参数上不需要额外加-v之类,ARMCC 不认。

2.3 环境变量与路径:三个容易写错的地方

装好目录只是第一步,真正让工程认到编译器,靠的是 MDK 内部的路径注册,而不是系统环境变量。很多人习惯去改PATH,这在 MDK 场景下反而容易帮倒忙。正确的做法是在 uVision 里通过Project → Manage → Project Items → Folders/Extensions指定ARM Compiler的根目录,让 MDK 自己去拼bin、include、lib。

我一般会额外检查两个地方:一是工程.uvprojx文件里<TargetOption>下的<TargetArmAds>节点,看uAC6字段是 0 还是 1;二是Options for Target → C/C++页的Include Paths里有没有残留旧机器的绝对路径。前者决定用 AC5 还是 AC6,后者决定头文件能不能找到。常见做法是先把uAC6置 0,再清掉所有带盘符的 include 路径,改成相对路径..\..\Libraries\CMSIS这种写法,换机器才不会翻车。

3. 安装落地:从解压到工程认到编译器的完整步骤

3.1 放置编译器目录并校验完整性

拿到 ARMCC 5.06 的安装包后,先别急着往 MDK 根目录里覆盖。我的习惯是先解压到一个临时目录,确认结构完整再移动。一个完整的 ARMCC 5.06 目录至少包含bin、include、lib三个子目录,bin下要有armcc.exe、armlink.exe、armar.exe三个核心可执行文件。

# 解压后先看目录结构,确认三件套齐全 cd /tmp/armcc506 find . -maxdepth 2 -type d | sort # 期望看到 ./bin ./include ./lib 以及可能的 ./sw ls bin/armcc.exe bin/armlink.exe bin/armar.exe

第一段find用来确认目录层级,-maxdepth 2防止输出太深干扰判断。第二段ls是硬校验,三个文件缺一个都别往下走——armlink缺失会在链接阶段才报错,那时候排查成本高得多。确认无误后,把整个目录移动到C:\Keil_v5\ARM\ARMCC,如果已有同名目录,先改名备份成ARMCC_bak,别直接删,这是后悔药。

注意:移动前关闭 uVision,否则目录被占用会导致部分文件复制失败,而且失败时不一定有提示。

3.2 在 uVision 里注册编译器路径

目录就位后,打开 uVision,进Project → Manage → Project Items,切到Folders/Extensions标签页。这里有一行ARM Compiler,点右侧的...按钮,选中刚才放好的ARMCC目录。选中后,下方会显示解析出的版本号,确认是 5.06 系列再点 OK。

这一步的底层逻辑是:uVision 把编译器根路径写进全局配置(通常在TOOLS.INI或注册表项里),后续每个工程打开时按这个路径去找armcc.exe。所以如果换了 MDK 安装位置,这一步要重做。常见坑是选了ARM根目录而不是ARMCC子目录,结果 uVision 找不到bin,表现为编译时提示Tool path not found。

配置完成后,回到工程的Options for Target → Target页,把ARM Compiler下拉框切到Use default compiler version 5或显式选V5.06。如果下拉框里没有 5.06 选项,说明上一步路径没注册成功,回去重选。

3.3 工程级参数:C/C++ 与汇编选项的取舍

编译器认到之后,真正决定能不能编过的是工程参数。老工程迁移过来,最容易出问题的是C/C++页的Misc Controls和Define。ARMCC 5.06 对 C99 的支持是部分开启的,如果代码里用了//注释之外的行内声明,需要加--c99。我一般会在Misc Controls里补上:

--c99 --gnu -DUSE_STDPERIPH_DRIVER -DSTM32F10X_MD

这段不是 shell 命令,是填进Misc Controls输入框的编译器参数串。逐项说明:--c99开启 C99 模式,老工程里结构体指定初始化器依赖它;--gnu放宽一些 GNU 扩展语法,CMSIS 头文件里偶尔会用到;两个-D是标准外设库的宏开关,具体型号按工程实际改,STM32F10X_MD对应中容量器件,选错了会在启动文件里报重复定义。参数之间用空格分隔,别加逗号。

汇编页Asm标签下,如果工程带.s启动文件,确认Define里没有和 C 页冲突的宏。ARMCC 5.06 的汇编器对__MICROLIB的处理和 AC6 不同,微库开关建议在Target页勾选Use MicroLIB,而不是在汇编参数里手动加。

3.4 链接脚本与分散加载的兼容处理

老工程常用.sct分散加载文件,ARMCC 5.06 的armlink对它的语法要求比 AC6 宽松,但反过来,从 AC6 工程拿过来的.sct直接喂给 5.06 可能报L6221E。判断方法看Options for Target → Linker页,取消勾选Use Memory Layout from Target Dialog,手动指定.sct路径。

; 典型 STM32F103 的 .sct 片段,确认 LR_IROM1 起始地址和大小 LR_IROM1 0x08000000 0x00010000 { ER_IROM1 0x08000000 0x00010000 { *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) } RW_IRAM1 0x20000000 0x00005000 { .ANY (+RW +ZI) } }

这段是分散加载文件内容,不是代码。LR_IROM1定义加载域起始和大小,0x08000000是 Flash 基址,0x00010000是 64KB 容量,按实际芯片改。RESET段放最前,保证中断向量表在 Flash 起始位置。如果链接报空间不足,先核对这两个数值和芯片手册是否一致,而不是急着改优化等级。

4. 避坑与排查:ARMCC 5.06 装完最常见的五个翻车点

4.1 现象:编译报 “cannot open source input file”,但头文件明明在

原因多半是Include Paths里混进了绝对路径,换机器后盘符对不上,或者路径里带了中文和空格导致解析截断。解决方式是打开Options for Target → C/C++,把Include Paths里所有带C:\或D:\的条目删掉,改成以工程文件为基准的相对路径,比如..\Libraries\CMSIS\CM3\CoreSupport。改完重新全编译,别用增量编译,增量缓存里可能还留着旧路径的依赖记录。

4.2 现象:链接报 “L6235E: More than one section matches selector”

原因是启动文件被重复包含。老工程目录里可能同时存在startup_stm32f10x_md.s和startup_stm32f10x_hd.s,两个都在工程树里,armlink匹配RESET段时发现多个候选。解决方式是展开工程树的Startup分组,只保留和芯片容量匹配的那一个,其余从工程移除(不是删文件)。移除后清理Objects和Listings目录再编译。

4.3 现象:编译通过但程序跑飞,调试器停在 HardFault

这类玄学问题在 ARMCC 5.06 下常见于微库和标准库混用。如果Target页勾了Use MicroLIB,但代码里又调用了printf走串口重定向,微库的精简实现可能和你的fputc冲突。解决方式是二选一:要么取消微库、用标准库并确保__use_no_semihosting相关桩函数齐全,要么保留微库但检查fputc重定向是否只依赖微库支持的接口。我一般倾向后者,改动小,但要在Misc Controls里确认没有重复定义__MICROLIB。

4.4 现象:换机器后 uVision 提示 “Compiler version not found”

原因是TOOLS.INI里记录的编译器路径还是旧机器的。解决方式是进Project → Manage → Project Items → Folders/Extensions重新指定ARMCC目录,或者直接编辑 uVision 安装根目录下的TOOLS.INI,找到[ARMCC]段,把PATH=改成当前实际路径。改之前备份TOOLS.INI,这个文件改坏了 uVision 可能起不来。

4.5 现象:编译速度突然变慢,每次全编译

原因是Objects目录被设到了网络盘或同步盘里,增量编译的依赖文件读写延迟高。解决方式是Options for Target → Output页把Select Folder for Objects指到本地磁盘的短路径,比如C:\build\projX。顺带把Listings也挪过去,这两个目录不需要进版本管理,加进.gitignore即可。

5. 装完怎么验证:三步确认 ARMCC 5.06 真的跑通了

装完不验证,等于没装。我习惯用三步确认,从编译器本体到工程产物逐层收口。第一步,命令行直接问编译器版本,绕开 uVision,确认armcc.exe本身可执行:

"/c/Keil_v5/ARM/ARMCC/bin/armcc.exe" --version # 输出应包含 "ARM Compiler 5.06" 及 build 号

第二步,在 uVision 里做一次全量重编译(Project → Rebuild all target files),看Build Output窗口末尾的统计行。合格的输出应该类似0 Error(s), N Warning(s),且Program Size里Code、RO-data、RW-data、ZI-data四项都有数值。如果Code为 0,说明链接阶段没真正产出,回去看Linker页的.sct配置。

第三步,把生成的.hex或.axf下载到目标板,跑一个最小验证:点亮一个 LED 或翻转一个 GPIO,用调试器看寄存器值是否按预期变化。这一步别省,编译通过不代表运行时正确,尤其是启动文件和时钟配置在 ARMCC 5.06 下的行为差异,只有跑起来才暴露。

下面这张表是我验证时对照用的检查项,照着勾一遍基本不会漏:

检查项合格标准不合格时先看哪
编译器版本输出含 5.06目录名与TOOLS.INI路径
全编译结果0 ErrorInclude Paths与启动文件唯一性
产物大小Code 非 0 且合理.sct加载域配置
运行行为GPIO 按预期翻转微库开关与时钟初始化

有个小技巧:把这三步写成一段批处理或 shell 脚本,每次换机器或升级 MDK 后跑一遍,比手动点图形界面可靠。脚本里armcc --version的返回值用grep匹配5.06,匹配不到就退出非零码,CI 里也能用。

从那以后我每次给旧工程配 ARMCC 5.06,都强制走一遍“命令行问版本 → 全量重编译 → 板上跑最小例程”这三步,哪怕工程看起来能编过也不跳过——血泪经验是,跳过第三步的工程,往往在客户现场第一次上电才翻车。希望帮到你。

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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询