ARMCC 5.06安装配置全攻略:从环境对齐到工程验证
简介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 主推 AC6ARMCC 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都强制走一遍“命令行问版本 → 全量重编译 → 板上跑最小例程”这三步哪怕工程看起来能编过也不跳过——血泪经验是跳过第三步的工程往往在客户现场第一次上电才翻车。希望帮到你。本文还有配套的精品资源点击获取