0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于ARM编译器版本5的工程迁移与适配到ARM编译器版本6.12

嵌入式那些事 来源:嵌入式那些事 2023-11-12 11:17 次阅读

为了描述方便,将ARM Compiler 5简称为AC5,将ARM Compiler 6.12简称AC6.12。

在公众号中回复"arm编译器升级文档"可以获取AC5升级到AC6.12的ARM官方文档。

1、为什么要进行ARM编译器版本的更换

目前,AC5基本处于停止更新状态,如果想要使用AC5编译器编译新的ARM架构或者内核的代码,基本是不可能了,因此自然要使用ARM Compiler 6来代替之前的ARM Compiler 5。

其实,我自己觉得还有一个比较重要的原因,那就是AC6支持使用armclang编译GNU语法格式的汇编代码,这样在以后的项目开发中,可以只编写GNU语法格式的汇编代码(不必像以前一样还要再写一份符合ARM语法格式的汇编代码),这样既可以使用ARM-GCC编译工具链编译这个项目,也可以使用ARM Compiler编译这个项目,汇编代码维护更加方便了。

2、AC6.12的组成

(1).armclang:armclang编译器替代了AC5的armcc,并且具有如下优点:

  • 基于LLVM和Clang技术;

  • 支持编译GNU语法的汇编代码;

  • 高度兼容当初为GCC编译的源代码;

  • 实现包括ANSI/ISO C和C++,用于Arm架构的ABI,用于64位Arm架构的ABI以及Arm C语言扩展(ACLE)等规范。

(2).armlink:功能丰富的专用嵌入式链接器,能够将对象和库组合在一起以生成可执行文件。

(3).fromelf:镜像文件转换和反汇编功能。

(4).armar:压缩程序。

(5).armasm:ARM语法的汇编代码编译器。

(6).ARM C和C++库:ARM C库经过ARM公司的优化有很好的的性能和代码密度;ARM C++库基于LLVM libc++项目。

下图展示了ARM Compiler 6.12编译工具链的整体结构:

fc221d00-8049-11ee-939d-92fbcf53809c.png

Snipaste_2019-12-05_14-30-03

3、ARM Compiler 5和ARM Compiler 6编译工具链的差异

AC5和AC6的主要差异是AC6使用armclang代替了armcc,因此在AC6中就没有armcc这个编译工具了。并且armclang的编译参数相对于之前的armcc的编译参数也有许多不同。

下表列出了ARM Compiler 5和ARM Compiler 6之间各个工具的功能:

fc49582a-8049-11ee-939d-92fbcf53809c.png

Snipaste_2019-12-05_15-08-29

4、编译工具链升级过程

其实将AC5更换为AC6.12编译工具链,无非就是找出这两个工具链的编译参数的差异进行修改即可。当然了,基本上编译参数变化还是挺大的,这里推荐大家参考如下手册进行编译工具链升级。

参考手册:《migration_and_compatibility_guide_100068_0612_00_en.pdf》。因为AC5和AC6.12的差异主要体现在ARM Compiler 6使用armclang代替了armcc,因此这篇文章,可以重点关注Chapter 2和Chapter 3,当然了也可以通过搜索一些编译参数来快速定位。

5、我在升级过程遇到的问题

我在迁移一个项目使用AC6.12的过程中,主要还是参考《migration_and_compatibility_guide_100068_0612_00_en.pdf》文档进行参数修改,起初还算比较顺利,但是涉及到汇编代码的编译过程中死活编译会有问题。这里简单的记录下吧。我这里仍然使用armasm来编译之前的ARM语法格式的汇编代码。

修改汇编的编译参数时,一定要注意编译选项--cpreproc,该编译选项在AC5的含义是命令armasm调用armcc预处理输入的汇编源代码;在AC6的含义是命令armasm调用armclang预处理输入的汇编源代码。

我的工程,在使用AC5编译工具链时,在汇编过程中,使用的编译参数配置和armcc的编译参数配置是一样的,并且也添加了编译选项--cpreproc

升级到AC6.12之后,因为armclang的编译参数和armcc的差异比较大,自然的就不能够直接用于armasm的配置,因此我按照AC5的armasm配置作为AC6.12 armasm的配置,此时能够进行汇编,但是提示:armclang: fatal error: no target architecture given; use --target=arm-arm-none-eabi or --target=aarch64-arm-none-eabi

当时我就在想,为什么我使用armasm编译汇编代码怎么会调用armclang呢,还以为编译工程的脚本有问题,检查了编译脚本也没发现问题,后来还是查看《migration_and_compatibility_guide_100068_0612_00_en.pdf》文档才有所收获。

原来在汇编过程中调用armclang是armasm的编译选项--cpreproc在作怪,该编译选项是命令armasm调用armclang预处理输入的汇编源代码。ARM Compile 6中armasm需要另一个编译选项--cpreproc_opts,用于填写armclang预处理汇编代码时的一些配置参数。由于先前没有配置--cpreproc_opts,当然的在使用armclang进行预处理时会提示armclang: fatal error: no target architecture given; use --target=arm-arm-none-eabi or --target=aarch64-arm-none-eabi

问题解决办法:对armasm新增编译选项--cpreproc_opts,并且填写上armclang预处理汇编代码需要用到的一些配置信息。例如:

armasm --cpu=cortex-a9 --cpreproc --cpreproc_opts=--target=arm-arm-none-eabi,-mcpu=cortexa9,-D,DEF1,-D,DEF2 -I /path/to/includes1 -I /path/to/includes2 input.S

对于--cpreproc--cpreproc_opts编译选项,可参考《migration_and_compatibility_guide_100068_0612_00_en.pdf》文档的3.3 Command-line options for preprocessing assembly source code

6、下面简单列举一些编译参数的差异

(1).对于armcc和armclang之间,编译参数存在的差异如下:

AC5 Option AC6 Option 描述
--cpu=Cortex-M4 --target=arm-arm-none-eabi -mcpu=cortex-m4 Cortex-M4处理器的修改,其他处理器可能不一样,请参考我这里提供的官方手册.
--thumb -mthumb 支持thumb指令集
--fpu=fpv5_sp_d16 -mfloat-abi=hard -mfpu=fpv5_sp_d16 支持硬件浮点
--fpu=softvfp -mfloat-abi=soft -mfpu=none 软件浮点
--unaligned_access -munaligned-access 设定处理器可以生成地址非对齐的数据
--apcs=interwork 没有对应的编译选项 在AC6中总是允许ARM指令和Thumb指令一起使用,因此没有对应的编译选项.
--split_sections -ffunction-sections 生成的函数在自己的段中
--debug/-g -g 生成调试信息
--c99 --gnu -xc -std=gnu99 允许编译器编译带有GNU扩展的C99代码
--cpp --gnu -xc++ -std=gnu++03 允许编译器编译带有GNU扩展的C++03代码
--no_exceptions -fno-exceptions 禁止生成需要支持C++异常的代码
--no_rtti -fno-rtti [ALPHA] 禁止生成需要支持C++ Run Time Type Information(RTTI)特征的代码
-Otime 默认支持 减少执行时间的优化,代价就是执行文件的大小会增加
-O3 -Otime -Omax Highest optimization for performance
-O3 -Ospace -Oz Highest optimization for code size

(2).对于AC6使用armasm需要注意的事项:

使用AC6编译汇编代码时,编译选项和AC5基本差不多,这里再强调一下编译选项:--cpreproc。在AC6中如果使用了编译选项--cpreproc,那么就必须附带的使用编译选项--cpreproc_opts,并且填写上armclang预处理汇编代码需要用到的一些配置信息,例如:

armasm --cpu=cortex-a9 --cpreproc --cpreproc_opts=--target=arm-arm-none-eabi,-mcpu=cortexa9,-D,DEF1,-D,DEF2 -I /path/to/includes1 -I /path/to/includes2 input.S

好了,我在这里简单的记录了下ARM Compiler 5升级到ARM Compiler 6.12的过程,给以后有需要的朋友留作参考吧。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • ARM
    ARM
    +关注

    关注

    134

    文章

    9020

    浏览量

    366334
  • 编译器
    +关注

    关注

    1

    文章

    1614

    浏览量

    49002
  • GNU
    GNU
    +关注

    关注

    0

    文章

    143

    浏览量

    17444

原文标题:基于ARM编译器版本5的工程迁移与适配到ARM编译器版本6.12

文章出处:【微信号:嵌入式那些事,微信公众号:嵌入式那些事】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Keil修改ARM编译器及配置方法

    Keil MDK自 V5.36 版本之后,默认就不带 Arm Compiler V5版本编译器。如果需要使用 V
    发表于 09-19 10:41 4012次阅读
    Keil修改<b class='flag-5'>ARM</b><b class='flag-5'>编译器</b>及配置方法

    ARM编译器for Embedded Version 6.20移植和兼容性指南

    Arm®编译器嵌入式迁移和兼容性指南为从旧版本Arm编译器
    发表于 08-10 07:17

    Arm编译器迁移和兼容性指南

    Arm®编译器迁移和兼容性指南为从旧版本Arm编译器迁移
    发表于 08-10 06:57

    ARM编译器5.06版迁移与兼容性指南

    尽管不能保证不同版本ARM编译器之间的兼容性,但有一些方法可以帮助您实现兼容性。 ARM编译器生成的代码符合
    发表于 08-21 07:50

    ARM编译器5.06版入门指南

    的ARMLINK支持的所有功能。 如果您使用ARM编译器作为独立产品,则默认使用32位版本。 对于DS-5中的ARM
    发表于 08-23 07:25

    ARM编译器优化版本1.0

    ARM编译器armcc可以优化您的代码以实现小代码和高性能。 本教程介绍了编译器执行的主要优化技术,并解释了如何控制编译器优化。 本教程假定您已经安装并许可了
    发表于 08-28 07:11

    用于嵌入式FUSA的ARM编译器移植和兼容性指南

    《用于Embedded FUSA的ARM®编译器迁移与兼容性指南》为从旧版本ARM编译器
    发表于 08-29 07:02

    编译器_keil的优化选项问题

    keil编译器的优化选项针对ARM,对STM32编译的一些优化的问题
    发表于 02-25 14:18 3次下载

    ARM最优CC++编译器用户指南

    ARM最优CC++编译器用户指南
    发表于 03-14 10:48 3次下载

    ARM汇编编译器的使用

    10.4 ARM汇编编译器的使用 armasm是ARM汇编语言的交叉编译器,本节将详细介绍它的使用方法。 armasm命令行语法格式如下。 armasm options inputfi
    发表于 10-19 10:14 5次下载

    关于KEIL ARM编译器的使用介绍

    KEIL ARM编译器的使用
    的头像 发表于 07-10 10:50 6265次阅读

    带你认识ARM最新的编译器 AC6.12

    带你认识ARM最新的编译器AC6.12
    的头像 发表于 03-03 11:34 4466次阅读

    你用的ARM处理该选择哪个编译器

    现在的嵌入式开发大部分都是ARM处理了,从MCU级别的M0,M3,M4,M23,M33,到MPU级别的ARM9,ARM11,ARM-A5x
    发表于 12-01 13:36 1次下载
    你用的<b class='flag-5'>ARM</b>处理<b class='flag-5'>器</b>该选择哪个<b class='flag-5'>编译器</b>?

    交叉编译器安装教程

    交叉编译器中“交叉”的意思就是在一个架构上编译另外一个架构的代码,相当于两种架构“交叉”起来了。Ubuntu 自带的 gcc 编译器是针对 X86 架构的,而我们现在要编译的是
    的头像 发表于 09-29 09:12 3397次阅读

    使用ARMClang V6版本编译器出现错误的解决方法

    很多STM32开发者使用ARM mdk IDE进行开发,我们知道ARM MDK IDE早已推出ARMClang V6版本编译器了。不过,当我们把在V
    的头像 发表于 06-07 12:32 5864次阅读
    使用ARMClang V6<b class='flag-5'>版本</b><b class='flag-5'>编译器</b>出现错误的解决方法