ARM 编译器 Arm Compiler for Embedded 6 相关工具链简介
Posted SOC罗三炮
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ARM 编译器 Arm Compiler for Embedded 6 相关工具链简介相关的知识,希望对你有一定的参考价值。
目录
1, Introduction to Arm® Compiler 6
1,8 Application development ,ARM程序开发流程
1, Introduction to Arm® Compiler 6
Arm Compiler 6 是 Arm 中用于 Arm Cortex® 和 Arm Neoverse™ 处理器的最先进的 C 和 C++ 编译工具链。Arm Compiler 6 与 Arm 架构一起开发。因此,Arm 编译器 6 经过优化,可为从小型传感器到 64 位设备的嵌入式裸机应用生成高效代码。
Arm Compiler 6 将 Arm 优化的工具和库与基于 LLVM 的现代编译器框架相结合。Arm 编译器 6 中的组件包括:
- armclang
- armasm
- armlink
- armar
- Arm C++ libraries
- Arm C libraries
1.1 armclang
编译 C、C++ 和 GNU 汇编语言源的编译器和汇编编译器。基于LLVM和Clang技术。Clang是LLVM的编译器前端,可以支持C和C++等编程语言。
1.2 armasm
传统的汇编编译器,针对ARM语法的汇编代码。使用armclang是针对GNU 语法的汇编文件。
1.3 armlink
armlink链接器可以将一个或多个目标文件以及一个或多个目标程序库链接,生成一个可执行的程序。
1.4 armar
归档器(archiver)可以将 多个ELF 对象收集在一起,并在归档或库中进行维护。如果不经常更改这些文件,这些已经编译好的ELF文件可以减少编译时间,因为不必每次使用它们时都从源代码重新编译。并且可以将此类库或存档传递给链接器,以代替多个 ELF 。还可以使用存档分发给第三方应用开发人员,这样就可以在不泄露源代码的情况下共享存档。
1.5 fromelf
fromelf可以将 Arm ELF 文件转换为二进制格式。它还可以生成有关输入的elf文件的文本信息,例如其反汇编、代码大小和数据大小。
1.6 Arm C++ libraries
Arm C++库是基于LLVM libc++工程:
- libc++abi 库是一个rubtime 库,提供大量的低级语言特性的实现。
- libc++ 库同样提供 ISO C++的标准库实现
如果C++编译单元是用不同的主要或次要版本的Arm编译器编译的,并且链接到单个image。那么ARM不保证该c++编译单元的兼容性。因此,ARM建议在编译C++源码时,使用单一版本的工具链。此外也支持C和C++的混合编译。
1.7 Arm C libraries
ARM的C库提供:
- 标准的C语言库特性的实现。
- 许多非标准的通用的C语言扩展
- POSIX 扩展功能。
- 使用POSIX的函数标准化。
1,8 Application development ,ARM程序开发流程
一个典型的ARM程序开发流程应该包含:
- 为主程序开发C/C++源码 (armclang)。
- 为底层硬件组件开发汇编源码,比如中断服务子程序(armclang,或者针对arm 汇编代码的armasm)
- 将所有目标文件链接成一个elf image(armlink)
- 将一个image转换成 plain binary, Intel Hex, 或者Motorola-Smeld等格式。
下图展示了一个典型的应用程序开发流程:
需要注意的是,
2,ARM 编译器 5和ARM 编译器 6的兼容性
如果用户之前使用的是ARM compiler 5,需要将code在ARM compiler 6中编译,可以参考文档:
Arm Compiler for Embedded Migration and Compatibility Guide
compiler 5和compiler6最大的区别在于compiler 5使用的是armcc,而compiler 6使用的是armclang。以下是二者工具链的对比表格:
Arm Compiler 5 | Arm Compiler for Embedded 6 | Function |
---|---|---|
armcc | armclang | Compiles C and C++ language source files, including inline assembly. |
armcc | armclang | Preprocessor. |
armasm | armasm | Legacy assembler for assembly language source files written in armasm syntax. Use the armclang integrated assembler for all new assembly files. |
Not available | armclang . This is also called the armclang integrated assembler. | Assembles assembly language source files written in GNU assembly syntax. |
fromelf | fromelf | Converts Arm ELF images to binary formats and can also generate textual information about the input image, such as its disassembly and its code and data size. |
armlink | armlink | Combines the contents of one or more object files with selected parts of one or more object libraries to produce an executable program. |
armar | armar | Enables sets of ELF object files to be collected together and maintained in archives or libraries. |
3,Compiler 6所支持的ARM 架构
Arm Compiler for Embedded 6支持以下ARM架构:
- Armv9-A.
- Armv8-A and all update releases, for bare-metal targets.
- Armv8-R.
- Armv8-M.
- Armv7-A for bare-metal targets.
- Armv7-R.
- Armv7-M.
- Armv6-M.
当编译代码时,编译器需要知道以哪种体系结构为目标,以便利用特定于该体系结构的特性。要指定目标架构,必须提供目标执行状态(AArch32或AArch64),以及目标体系结构(例如Armv8-A)或目标处理器(例如cortex-A53处理器)。
要使用armclang指定目标执行状态(AArch64或AArch32),使用强制的 --target 命令行选项:
--target=<arch>-<vendor>-<os>-<abi>
支持的目标包括:
- aarch64-arm-none-eabi
- 为A64状态产生A64的指令,如果没有指定-march 或者-mcpu 属性,则暗示-march=armv8-a
- arm-arm-none-eabi
- 为A32状态产生A32的指令,同时必须使用-march(指定架构) 和-mcpu(指定处理器)
如果想要针对某个架构的所有处理器生成通用的代码,可以使用-march 选项,使用 -march=list
可以看到全部的支持的架构。此外,如果想针对某款处理器优化你的代码,可以使用 -mcpu 选项,使用 -mcpu=list 可以看到全部的支持的处理器。
需要注意的是,--target, -march和-mcpu选项是armclang选项。对于所有其他工具,如armlink,使用 --cpu选项指定目标处理器和体系结构。
4,ARM编译器相关链接
Arm product resources | Document ID | Confidentiality |
---|---|---|
Arm Compiler for Embedded Reference Guide | 101754 | Non-Confidential |
Arm Compiler for Embedded Migration and Compatibility Guide | 100068 | Non-Confidential |
Arm Compiler for Embedded Arm C and C++ Libraries and Floating-Point Support User Guide | 100073 | Non-Confidential |
Arm Compiler for Embedded Errors and Warnings Reference Guide | 100074 | Non-Confidential |
Arm Support | - | - |
Arm Compiler for Linux | - | - |
Arm Development Studio Getting Started Guide | 101469 | Non-Confidential |
Arm Development Studio User Guide | 101470 | Non-Confidential |
Arm Compiler for Embedded Licensing Configuration | - | - |
Request a license | - | - |
Manage Arm Compiler Versions | - | Non-Confidential |
User-based licensing User Guide | 102516 | Non-Confidential |
CMSIS 5 | - | Non-Confidential |
解决方法:编译GD32F10x例程时Keil提示错误信息uses ARM-Compiler ‘V5.06 update 6 (build 750)‘ which is not available
一、问题
使用 GD32F10x_Firmware_Library_V2.2.2 固件库样例工程 Template 编译报以下错误:
*** Target 'GD32F10X_CL' uses ARM-Compiler 'V5.06 update 6 (build 750)' which is not available.
*** Please review the installed ARM Compiler Versions:
'Manage Project Items - Folders/Extensions' to manage ARM Compiler Versions.
'Options for Target - Target' to select an ARM Compiler Version for the target.
*** Build aborted.
Build Time Elapsed: 00:00:01
二、解决方法
点击 Options of Target 在 ARM Compiler 选项里面选择 ARM 编译器版本,一般选择默认的就好。
• 由 Leung 写于 2022 年 4 月 1 日
• 参考:解决KEIL中ARM编译器不能编译的问题
以上是关于ARM 编译器 Arm Compiler for Embedded 6 相关工具链简介的主要内容,如果未能解决你的问题,请参考以下文章
Keil MDK下如何设置非零初始化变量 - 基于Arm Compiler 6
Keil MDK下如何设置非零初始化变量 - 基于Arm Compiler 6
解决方法:编译GD32F10x例程时Keil提示错误信息uses ARM-Compiler ‘V5.06 update 6 (build 750)‘ which is not available
解决方法:编译GD32F10x例程时Keil提示错误信息uses ARM-Compiler ‘V5.06 update 6 (build 750)‘ which is not available