Arm Compiler for Embedded 6.22 新特性与嵌入式开发指南
1. Arm Compiler for Embedded 6.22 版本概览
Arm Compiler for Embedded 6.22 是 Arm 公司于 2024 年 3 月 19 日发布的嵌入式 C/C++ 编译工具链的最新版本。作为专为裸机软件、固件和实时操作系统(RTOS)应用开发设计的高级工具链,它延续了 Arm 在嵌入式开发工具领域的领先地位。
这个版本最值得注意的特点是它并未通过安全相关开发的认证。如果你的项目涉及功能安全要求(如 EN 50128、IEC 61508、IEC 62304 或 ISO 26262 等标准),或者使用 Automotive Enhanced 处理器,Arm 强烈建议考虑使用 Arm Compiler for Embedded FuSa 的 LTS(长期支持)和认证版本。
1.1 产品定位与技术特点
Arm Compiler for Embedded 是 Arm 架构下最先进的嵌入式编译工具链,具有以下核心优势:
- 架构支持全面性:提供对最新 Arm 架构特性和扩展的最早、最完整和最准确支持
- 处理器兼容性广:支持所有最新的 Arm 处理器,包括尚在开发中的型号
- 优化能力强大:通过先进的优化技术和优化库,帮助开发者满足苛刻的性能目标和内存限制
工具链与主流 Arm 集成开发环境(IDE)完美兼容,包括:
- Arm Development Studio
- Keil MDK 版本 5
- Keil MDK 版本 6
1.2 主要更新内容
6.22 版本带来了多项重要更新:
架构支持扩展:
- 新增 Armv9.5-A 架构支持
- 增加对 A-profile 架构 2023 年扩展的支持
- 支持 Armv8-R AArch64 无硬件浮点支持的实现
处理器支持新增:
- Neoverse V3AE
- Cortex-A720AE
- Cortex-A520AE
- Cortex-R82AE
- Cortex-M52
编译功能增强:
- 新增
#pragma message <message>预处理指令支持 - 增加
-fstack-usage编译器选项生成堆栈使用信息文件 - 改进
operator new的内存分配失败处理行为
- 新增
1.3 组件构成
Arm Compiler for Embedded 6.22 包含以下核心组件:
工具链组件:
- armclang:基于 LLVM 和 Clang 技术的编译器和集成汇编器
- armar:用于收集 ELF 目标文件的归档器
- armlink:链接器,组合对象和库生成可执行文件
- fromelf:镜像转换工具和反汇编器
- armasm:仅用于旧版 Arm 架构的遗留汇编器(新项目建议使用 armclang 集成汇编器)
运行时库:
- Arm C 库:嵌入式系统的运行时支持库
- Arm C++ 库:基于 LLVM libc++ 项目的库
文档资源:
- 用户指南
- 参考指南
- Arm C 和 C++ 库及浮点支持用户指南
- 错误和警告参考指南
- 迁移和兼容性指南
- 发布说明
2. 版本差异与重要变更
2.1 与前版本的显著区别
6.22 版本相比前代 6.21 版本有几个关键改进:
浮点支持扩展:
- 新增对 Armv8-R AArch64 无硬件浮点支持的目标配置选项
- 针对 Cortex-R82AE、Cortex-R82 等处理器提供了专门的编译选项组合
A-profile 架构特性支持:
- 多项 A-profile 架构特性支持级别从 Alpha/Beta 升级为正式支持
- 包括 FEAT_CPA、FEAT_FP8、FEAT_SME_F8F16 等重要特性
安全相关改进:
- 修复了多项与分支保护(BTI、PAC)相关的代码生成问题
- 改进了指针认证和返回地址签名相关的编译器行为
2.2 关键修复内容
编译器(armclang)修复:
SVE 指令集支持相关:
- 修复了 32 位元素 FMMLA 指令的错误检测问题
- 修正了 SVE2 目标下可能出现的"error in backend"错误
MVE 相关修复:
- 解决了 MVE-I 仅支持整数时的代码生成问题
- 修复了多个 MVE 内部函数(vgetq_lane_, vmovl等)的代码生成错误
其他重要修复:
- 修正了 AArch64 大端目标下的浮点类型代码生成问题
- 解决了与 setjmp/longjmp 相关的分支保护问题
- 修复了 Neon 内部函数(vld2q_dup_*系列)在 AArch32 下的错误
链接器(armlink)修复:
- 修正了处理包含 A 或 T 类型符号的 symdefs 文件时的警告问题
- 解决了 LTO 链接时可能出现的符号保留错误
库和系统头文件修复:
- 修正了 math_errhandling 常量的定义
- 修复了多个 Neon 内部函数的返回类型定义
- 改进了无硬件浮点支持目标下的双精度除法精度
- 优化了 setjmp/longjmp 在 Shadow Call Stack 下的行为
3. 使用建议与注意事项
3.1 版本选择考量
虽然 6.22 版本提供了许多新特性,但需要注意:
非安全认证:此版本未通过功能安全认证,不适合安全关键型项目开发。
遗留状态:该版本已被后续版本取代,成为遗留版本。对于新项目,建议考虑使用更新的版本。
长期维护:如果项目有长期维护需求,建议使用 FuSa 版本的 LTS 发布系列。
3.2 新特性使用建议
Armv9.5-A 架构支持:
- 使用
-march=armv9.5-a选项启用 - 注意 AArch32 状态下的支持是新加入的
- 使用
新增处理器支持:
- Cortex-M52 提供了多种配置组合:
# 完整功能支持 -mcpu=cortex-m52 # 无 MVE 支持 -mcpu=cortex-m52+nomve # 无 PACBTI 扩展 -mcpu=cortex-m52+nopacbti
- Cortex-M52 提供了多种配置组合:
无硬件浮点的 Armv8-R AArch64:
- 需要特殊配置:
--target=aarch64-arm-none-eabi -mcpu=cortex-r82+nofp -mabi=aapcs-soft - 链接器需配合
--cpu=8-R.64 --fpu=SoftVFP选项
- 需要特殊配置:
3.3 已知问题与规避方案
浮点模式问题:
- 使用
-ffp-mode=full时,包含_Float16类型变量的程序可能生成错误代码 - 临时解决方案:避免在此模式下使用
_Float16类型
- 使用
C++标准支持:
- 注意 C++98 和 C++03 标准将在未来版本中被移除支持
- 建议逐步迁移到更新的 C++标准
加密扩展默认值:
- 某些处理器的加密扩展特性不再默认启用
- 需要显式指定如
+crypto,+sve2-aes等特性修饰符
4. 安装与系统要求
4.1 下载与获取
Arm Compiler for Embedded 6.22 可通过以下方式获取:
独立下载:
- 使用 Arm Product Download Hub (PDH) 中的 ACOMPE 产品代码
- 提供针对不同主机平台的安装包
集成开发环境包含:
- Arm Development Studio
- Keil MDK 5
- Keil Studio for VS Code
4.2 系统要求
支持的主机平台:
| 主机架构 | 操作系统 | 环境 |
|---|---|---|
| x86_64 | RHEL 9/8/7, Ubuntu 22.04/20.04 | 独立安装或 Arm Development Studio |
| x86_64 | Windows Server 2022/2019, Windows 11/10 | 独立安装或集成到开发环境 |
| AArch64 | Ubuntu 20.04 LTS | 仅限独立安装 |
重要限制:
- 不支持 x86_32 Windows 主机平台
- Linux 主机平台最低需要 glibc 2.15
- 禁止直接安装到 Arm Development Studio 安装目录
- Keil MDK 5 授权仅限 x86_64 Windows 平台使用
5. 迁移与兼容性
5.1 从旧版本迁移
加密扩展变更:
- Cortex-X4、Cortex-A720 等处理器的加密扩展不再默认启用
- 需要显式添加
+crypto等特性修饰符
operator new 行为变更:
- 无异常模式下内存分配失败时行为变化
- 现在会打印错误信息并引发 SIGABRT
- 如需旧行为,需修改代码使用
nothrow版本
检查校验和算法变更:
- 安装目录中的 checksums.txt 改用 SHA256 算法
- 相关校验工具需要相应更新
5.2 长期兼容性规划
C++标准支持:
- C++98 和 C++03 将在未来版本中移除
- 相关编译器选项(
-std=c++03等)将不再支持
工具链进化:
- 持续增加对新架构特性的支持
- 逐步淘汰老旧架构和过时特性
对于需要长期维护的项目,建议:
- 使用 FuSa 版本的 LTS 发布系列
- 定期评估工具链更新需求
- 建立完整的测试验证流程确保兼容性
6. 技术支持与反馈
Arm 欢迎用户提交缺陷报告和改进建议。对于 6.22 版本需要注意:
支持政策:
- 这不是 LTS 版本,后续缺陷修复和增强将根据维护政策考虑
- 没有长期支持承诺
问题报告:
- 建议通过供应商或使用工作/学术邮箱提交问题
- 应包含完整错误信息、预处理后的源代码和重现步骤
替代方案:
- 对于关键项目,考虑使用 Arm Compiler for Embedded FuSa
- 咨询销售代表了解授权选项
对于嵌入式开发社区来说,虽然 6.22 版本提供了许多新特性,但其遗留状态和非安全认证的性质意味着它可能更适合非关键项目的短期使用。在实际项目中选择工具链版本时,需要仔细评估项目需求、维护周期和安全要求,做出最适合的技术决策。
