为了描述方便,将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编译工具链的整体结构:
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之间各个工具的功能:
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的过程,给以后有需要的朋友留作参考吧。
液压换向阀的工作原理
矿石收音机的制作视频
WT8302音频功放芯片在医疗报警器的应用
SiFive展示新一代P870处理器设计
到底是谁在捧杀华为?
基于ARM编译器版本5的工程迁移与适配到ARM编译器版本6.12
人形机器人大火背后的入局者
宁德时代被推向风口浪尖 811电池揭露背后技术路线之争
2016-2025年中国机器视觉市场规模及预测
电子元器件筛选方案的设计原则及筛选项目
诺基亚8发布在即,诺基亚8相关消息大爆料,诺基亚8设计效果图
基于ESP32-CAM视频遥控车方案解析
选择压力表量程范围的方法
一体成型大电流贴片电感开裂破损应该这样解决gujing
厉害了!80岁老奶奶玩VR:竟掏出真枪对屏幕怒射
印制电路板感光阻焊白油黄变的原因及改善方法
物联网与制药业的发展之路
E Ink元太科技推出新一代全彩电子纸-E Ink GalleryTM 3
TI(德州仪器)工程师给出的五条建议
MAX3509 CATV上行放大器(含应用电路和参数资料)