ARTICLE DETAIL

资讯详情

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

Arm Compiler 5.06 update 7部署与排障:从armcc到registered ignored警告

Arm Compiler 5.06 update 7部署与排障:从armcc到registered ignored警告 简介Arm Compiler 5.06 update 7 (build 960) Lin32 是 ARM 官方发布的面向 Linux 32 位平台的 C/C 编译器更新版适用于嵌入式开发、物联网设备及高性能计算场景帮助开发者在 ARM 架构上完成高效稳定的代码编译与优化。资源包共 2 个文件以 sh 安装脚本和 html 说明文档为主整体约 97.92MBsh 文件用于快速安装部署html 文件详细记录版本更新内容、修复问题与已知限制。目前已有 2961 人学习下载。该版本优化了编译算法和多核支持并扩展 ARMv8-A 64 位指令集能力可显著加快构建速度、提升代码质量结合说明文档开发者能提前了解兼容性变化规划升级路径从而降低集成风险尤其适合希望充分挖掘 ARM 处理器性能的专业开发者。1. 一个老工具还值得折腾吗AC5.06 update 7 的定位与困境1.1 AC5和AC6到底断在哪很多人在选Arm Compiler版本时会陷入一个纠结明明Arm官方已经全面转向AC6为什么我一搜“arm compiler 5.06”还是有一堆人在找安装包答案其实很简单——那些代码是拿armcc写的不是拿armclang写的。AC5的核心编译器是armccAC6的核心是armclang基于LLVM/Clang。这两者之间的差异远不止换了个名字armcc在C语言扩展上偏好“嵌入式风格”关键字比如__forceinline、__asm、__packedarmclang更习惯于Clang/LLVM的__attribute__((...))风格编译选项的语法也不一样AC5里你写--cpu Cortex-M4AC6里要写成-mcpucortex-m4就连分散加载文件、启动文件、链接脚本的处理方式都有差异。如果你的老项目从一开始就用AC5构建固件已经量产平时只做小修小补那贸然换到AC6的代价可能是一个大工期的代码迁移。我在实际中见过太多“新编译器编译不过老代码”的求助帖更现实的选择就是把AC5.06这个版本稳定地部署起来继续维护老产线。这也就是为什么Arm Compiler 5.06 update 7 (build 960) 这种“老掉牙”的版本搜索热度始终不低。1.2 update 7 (build 960) 的版本地位5.06这条线基本是AC5的“绝唱”update 7又是这条线里的后期维护版本。简单说update 7是在5.06功能冻结后继续修了一段时间bug的产物它对Cortex-M0/M0/M3/M4/M7等核心的支持都比较成熟很多芯片厂商提供的SDK和算法库也默认基于这个版本编译。build 960则是这个update的具体构建号同一update下可能有不同build它们之间的差异通常不在功能层面而是构建时的修正和补丁集合不一样。对维护老项目的人而言版本锁定比“追新”更重要。你的构建环境里一旦用了某个特定版本后续的固件迭代最好一直沿用同一个编译器。比如你现在安装的是Arm Compiler 5.06 update 7 (build 960) Lin32那正式发布固件时最好也是这个版本否则可能因为编译器优化策略变化导致代码行为漂移。那些线上反馈的奇怪问题很多时候不是逻辑改出来的而是工具链版本不一致改出来的。2. 文件名里藏着环境要求build 960 与 Lin32 的读法2.1 一条安装包名到底告诉了你什么把“Arm Compiler 5.06 update 7 (build 960) Lin32”拆分来看Arm Compiler是产品名5.06是大版本号update 7是小版本号build 960是构建号Lin32是宿主平台标识。最后这个字段最容易被人忽略但恰恰是最容易出问题的。Lin32表示这是面向32位Linux系统的版本。与之对应的还有Windows上常见的Win32版本、面向64位Linux的Lin64版本。如果你在一台64位Linux服务器上装了一个Win32的安装包那无论如何都是跑不起来的反过来在32位系统上装64位包也不行。很多CI构建服务器的管理员图省事随便下了一个平台的包丢上去armcc一跑就报错那基本就是平台没选对。安装包名的其他部分也要留意。比如“update 7”和“build 960”这种组合老手通常会直接记成“5.06u7 b960”在论坛求助和写脚本时都这么缩写。如果你是在公司内部的软件分发系统里查找安装包用这个缩写去搜往往比全名更好使。另外同系列的安装包可能会有不同操作系统的变体比如ARM Compiler for Embedded 6.21.msi这种Windows安装程序和Lin32的压缩包完全不是一回事。下载前先确认你的构建机是Linux还是Windows是32位还是64位避免装到一半才发现体系结构不匹配白折腾一遍。2.2 在64位Linux主机上运行Lin32版的前置准备现在的Linux发行版基本都切到64位了很多服务器甚至连32位运行库都不再默认安装。这时候你把Lin32版本的armcc解压出来运行时会遇到一个非常经典的假象明明文件在权限也对一执行却提示“bash: ./armcc: No such file or directory”。这个报错其实是忽悠人的真正原因不是文件不存在而是内核找不到armcc依赖的32位动态链接库。解决办法是在Ubuntu/Debian系的系统上安装32位兼容库一般装这几个就够了sudo apt update sudo apt install -y libc6-i386 lib32stdc6 lib32gcc-s1装完以后用ldd检查一下armcc的依赖是否都满足如果还有标着“not found”的库缺什么补什么。CentOS/RHEL系则对应装glibc.i686、libstdc.i686、zlib.i686这一类包。这一步看似琐碎但CI容器里如果拿的是精简镜像往往就是栽在这里。3. 让armcc从命令行跑起来目录、环境变量和License3.1 部署目录与PATH规划安装AC5不像装常规软件那样有漂亮的安装向导更多时候你拿到的是一个压缩包解压后手动组织目录。我的习惯是把工具链放到一个不带空格的路径下比如/opt/arm/ARM_Compiler_5.06u7。老一代编译器对路径里的空格和中文处理不好放到带空格的目录里后面写Makefile、CMake或者CI脚本时容易踩到转义相关的坑。解压完成后工具链的bin目录里会有armcc、armlink、armasm、armar、fromelf等一批二进制。把它们加入PATH的意思是让你在任意目录下都能直接执行armcc而不用每次写绝对路径export PATH/opt/arm/ARM_Compiler_5.06u7/bin:$PATH这条建议写进~/.bashrc更推荐写进项目的构建环境初始化脚本里。这样团队其他成员拿到同一套脚本构建环境就能完全复现。我见过太多项目文档里写着“安装编译器”却没人记录安装路径在哪、PATH怎么配的最后新同事入职光是配环境就花了两天。把这个环节固化到脚本里实际上是省所有人的时间。3.2 License配置armcc --vsn 一测便知AC5必须有许可证才能编译不像AC6的社区版那样可以免费使用。License可以是节点锁定的license文件也可以是网络浮动license。运行环境里需要配置两个关键变量ARMLMD_LICENSE_FILE指向license文件路径或端口服务器地址ARM_PRODUCT_PATH指向安装根目录。配置完成后最简单有效的验证方式是执行armcc --vsn。正常情况下你会看到类似这样的输出Product: ARM Compiler 5.06 Component: ARM Compiler 5.06 update 7 (build 960) Tool: armcc [4d35ad] Target: ARM Embedded Processor License: ...如果license没配好armcc会把license错误信息直接打在屏幕上。常见情况是FlexNet服务没起来、license文件过期或者环境变量指向了错误的路径。我处理过的一个案例是license文件放在了一个被自动清理的临时目录重启服务器后license丢失构建直接挂掉。这个教训之后我把license文件固定放在/opt/arm/licenses下并在构建脚本里加了一行存在性检查文件丢了第一时间报错而不是等到链接阶段才莫名失败。4. 排查实录registered arm compiler ignored 是怎么没的4.1 这个warning通常在什么场景出现搜“arm compiler 5.06”的人大概率会在某个阶段被一句警告折磨过*** warning: registered arm compiler ignored, version needs to be 5 or higher。这句警告一般出现在Keil MDK、DS-5这类IDE的编译器注册界面里或者使用IDE构建时的输出窗格中。为什么会这样本质上是IDE的编译器版本校验逻辑没找到它认为可用的AC5。很多项目在.uvprojx工程文件里明确写了“使用AC5”但你的MDK里注册的编译器可能是AC6.21。或者你只在电脑上装了ARM Compiler for Embedded 6.21.msi根本就没装AC5.06 update 7那IDE自然找不到满足条件的编译器。少数情况下即使装了AC5如果安装路径带中文、带空格或者路径指向了一个空目录也会触发同样的警告。这里也提醒一下这句警告本身不是编译器报错它只是IDE的版本注册提示。你真正要做的不是去屏蔽警告而是把注册环境弄对。4.2 我的排查链路遇到这个问题我是按下面这个顺序排查的基本每次都能定位。第一步先在命令行里执行armcc --vsn确认编译器本体可用License没问题。如果这里就报错后面IDE里做什么都会失败。第二步回到IDE的编译器管理界面确认AC5的实际安装路径被正确注册。在MDK中路径通常在“Project → Manage → Project Items → Folders/Extensions”这一层里面会列出所有已注册的ARM编译器。第三步检查是否安装了AC5插件包。MDK 5.38之后默认不捆绑AC5需要去Pack Installer里找到“ARM Compiler 5.06 update 7 (build 960)”并单独安装。第四步确认环境变量和PATH没有把armcc指向别的版本。有时候系统里同时装了AC5和AC6PATH顺序不对IDE或构建脚本调到的其实是AC6的armclang版本校验自然不通过。这个链路走下来绝大多数“registered arm compiler ignored”都能解决。还有一个容易忽略的点如果你的工程是旧版本MDK创建的打开后会自动关联老的编译器路径换机器之后路径对不上也会出现这个警告。这时候不要逐个文件改直接重新指定编译器路径通常更省事。4.3 在Linux构建脚本里遇到类似提示怎么办不要以为这个警告只属于Windows IDE在Linux构建环境里也会以日志形式出现。比如CMake或Makefile脚本中通过armcc --vsn的输出判断编译器版本捕获到的是5.06字符串但脚本判断逻辑写了“version 5”结果正常但如果脚本是去匹配“armclang 6.x”这种模式AC5就会被当成无效编译器。处理方式很简单明确你的项目到底应该用armcc还是armclang然后让构建脚本只认对应的输出特征。AC5环境里armcc --vsn输出的第二行会包含“5.06 update 7”字样脚本里用这个关键字判断最稳。不要试图同时兼容两条编译器路线那样只会让脚本变得越来越不可预测。5. 用最小工程跑通编译、链接、导出固件5.1 冒烟测试从C文件到目标文件安装部署完毕别急着把庞大的老工程拖进来编译先拿一个最小的C文件做冒烟测试。这里的关键是同时测试编译选项和CPU型号识别是否正常。比如我经常用一个这样的hello.c#include stdint.h volatile uint32_t counter; int main(void) { counter; for (;;) { counter; } }然后执行armcc --c99 --cpu Cortex-M4 --apcsinterwork -O2 -o hello.o hello.c这一步通过后file hello.o应该显示这是ARM目标文件。如果连这步都失败说明不是工程的问题而是工具链本身没装好回到前面的章节重新检查License和库依赖。5.2 链接与固件导出目标文件编译出来只走了一半你还需要用armlink完成链接再用fromelf把AXF转成烧录用的bin。链接时的核心是分散加载文件scatter file和入口函数设置下面是个最小示例armlink --scatterapp.sct --entryReset_Handler hello.o startup.o -o app.axf fromelf --bin --outputapp.bin app.axfapp.sct里定义了Flash和RAM的布局Reset_Handler是复位向量入口具体名字取决于你的启动文件。用AC5链接时要注意它和AC6的命令行风格完全不同直接拿armclang那套-Wl,...参数是行不通的。这一步能通过说明工具链的完整链路已经打通接下来再把真实的工程文件加进来基本就不会再有环境层面的幺蛾子了。5.3 我踩过的几个细节有几个细节我在项目里是实实在在踩过的。第一AC5的--split_sections虽然能减小最终镜像体积但会让链接时间明显变长小规模工程没必要开。第二使用MicroLIB时要在编译和链接侧都保持一致的选项否则会出现链接器找不到__use_no_semihosting相关符号的怪问题。第三AC5默认生成的调试信息格式偏DWARF2而AC6是DWARF4如果你用J-Link或OpenOCD做调试某些调试器对DWARF格式版本比较挑剔固件能跑但源码单步会错位遇到这种情况别急着查硬件先看看调试器是否支持你选用的格式。还有一点如果项目里混合了C和C代码AC5的C编译命令是armcc --cpp不要误以为是armclang。这类命令细节在长期维护里特别容易混我习惯在构建脚本顶部写一段注释把当前工程锁定的工具链版本和常用命令贴上去下次维护时就不需要再去翻历史记录。最后再说点实在话。维护老工具链这件事拼的不是你会不会用最新编译器而是你有没有把环境细节固化下来。我自己经历过一次因为license路径变更导致整个CI构建失败最后翻了半小时日志才找到原因也经历过一次build 960不同小版本编译产物行为不同导致一个线上问题定位了一整天。所以每次部署AC5我都会把armcc --vsn的完整输出、license文件路径、安装目录、PATH设置这四样东西写进项目的README。下次不管是你自己还是同事遇到registered arm compiler ignored这类问题照着手册比对一遍环境就能快速定位省下的时间远比当初写文档花的时间多。本文还有配套的精品资源点击获取
返回列表