Keil切换到Armclang编译器,到底强在哪里?

大家好,切换强里我是到A到底小麦,上次写过一篇文章 《Keil 编译太慢怎么办?译器教你一招,提速10倍 》,切换强里减少了中间文件的到A到底生成,确实把编译速度提高了很多,译器其实没有从根本上解决问题,切换强里有大佬提出用直接上AC6。到A到底

于是译器我就切换到AC6上尝试了一下,效果还是切换强里不错的,我就分享一下,到A到底感兴趣的译器小伙伴们可以看一下,希望对你有所帮助。切换强里
AC6有何不同?到A到底
ARM Compiler 5(及更早版本)使用 armcc 编译器。而AC6(ARM Compiler 6) 用 armclang 替换了 armcc,译器因此是一个新的编译器。七年前就有人问了这样的问题。

AC6和AC5具体有哪些差异呢?
参考链接:https://developer.arm.com/documentation/100068/0612/migrating-from-arm-compiler-5-to-arm-compiler-6/migration-overview
Arm Compiler 6 基于现代 LLVM 编译器框架。Arm Compiler 5 不是基于 LLVM 编译器框架。因此,将您的项目和源文件从 Arm Compiler 5 迁移到 Arm Compiler 6 ,我们需要注意几点:
调用编译器时命令行选项的差异。云服务器 遵守语言标准的差异。 编译器特定关键字、属性和编译指示的差异。 编译器优化和诊断行为的差异。下面是AC6和AC5的工具链差异:

工具链差异
从这里我们可以看到,出了C编译器和预处理器不同以外,其他基本上都是相同的。
除了工具链的差异,优化也有差异,还有一些默认的差异,包括编译选项,生成的固件命后缀不同等等,详细可以参考上述的链接。至于强不强,用了才知道嘛。
Keil中切换编译器
在Keil MDK 5.27中,我们打开项目选项,就可以切换编译器了,这里包括了AC5和AC6,具体如下图所示;

为了测试,我用CubeMX生成了一个STM32F103CB基于HAL库的Keil MDK工程,源码库使用AC5编译器进行构建;

总共耗时 10 秒;
后面我切换成AC6编译器,进行重新构建;

总共耗时 5 秒;
如果单纯基于HAL库,没有加入其他第三方库的话,直接在项目选项中的编译器选项中,选择AC5和AC6就可以实现无缝切换,这是因为在CMSIS中已经帮你做好了兼容性的处理,在cmsis_compiler.h中,这里的条件编译选项,我们可以发现已经通过判断不同的编译器版本,而包含了不同的头文件,分别是对应armcc和armclag的;如下图所示;

项目已经根据系统进行了选择;
#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) #include "cmsis_armclang.h"判断当前__ARMCC_VERSION的版本号,然后在包含cmsis_armclang.h头文件,这个文件中就已经帮我们做好了AC6所需要的兼容性修改。参考官方的文档“apnt_298,Migrate ARM Compiler 5 to ARM Compiler 6 MDK Tutorial”,可以知道在C语言部分需要做以下的修改:

当然了,一些涉及到很底层的操作,需要C和汇编混合编程的地方,WordPress模板也需要进行修改,这里在文档中也有类似的说明;
参考链接:https://gcc.gnu.org/onlinedocs/gcc/Using-Assembly-Language-with-C.html#Using-Assembly-Language-with-C
添加FreeRTOS
通过ST官方的CubeMX可以非常方便地在项目中添加FreeRTOS。

不过通过这个软件进行添加RTOS的话,它默认使用的是ARMCC VERSION 5,所以,我直接切换成ARMCC VERSION 6的时候,进行编译就出现了115个Errors。

查看了错误的源头,主要错误都在port.c和portmacro.h这两个文件中,自己动手移植过FreeRTOS的同学应该知道,一般适配自己的硬件平台,所要做的移植工作,都会放到这个两个文件中;
我查看了错误,基本上是C编译器语法,还有C和汇编混合编程语法不兼容所造成的问题;

从图中可以知道,__forceinline和__asm{ }在AC6中都是不兼容的。
下面是来自文档apnt_298对于汇编语法的兼容性修改;

当然,我们可以根据文档将不兼容的部分都修改过来,不过这里需要对ARM汇编有较好的掌握。不过FreeRTOS已经有对AC6有较好的支持了。这里下载FreeRTOS的源码,需要和前面的项目中所使用的FreeRTOS版本保持一致。
在源码中找到了相应文件,提示让我们使用GCC-ports;

在GCC的路径下找到ARM_CM3,这里包含了我们移植所需要的两个文件,port.c和portmacro.h;

只要把这两个文件拷贝到项目中,替换原来的文件即可;
重新构建rebulid,可以看到构建成功,耗时也很少;

总结
本文参考了官方的文档,简单介绍了AC5和AC6的异同,并在Keil MDK环境下进行测试,添加了FreeRTOS,要从AC5移植到AC6则需要参考文档Migrate ARM Compiler 5 to ARM Compiler 6 MDK Tutorial,这里面解释地非常详细。
相关文章
探究惠普电脑开机时间错误的原因及解决方法(深入分析惠普电脑开机时间异常问题,帮助您解决困扰)
摘要:近年来,随着科技的快速发展,惠普电脑已经成为大部分人生活和工作中必不可少的设备之一。然而,很多用户在使用惠普电脑时常常遇到开机时间异常的问题,使得他们的工作效率受到了严重影响。本文...2025-11-05惠普Envy15ae021tx笔记本电脑的优势与特点(高性能处理器、卓越的显示效果和出色的设计与工艺)
摘要:惠普Envy15ae021tx是一款备受瞩目的笔记本电脑,它融合了高性能处理器、卓越的显示效果和出色的设计与工艺,为用户带来前所未有的使用体验。本文将详细介绍Envy15ae021...2025-11-05如何通过USB直连传输数据的教程(两台电脑通过USB直连传输数据的详细步骤)
摘要:在日常生活和工作中,我们经常需要将数据从一台电脑传输到另一台电脑。使用USB直连传输数据是一种方便快捷的方法,不需要额外的设备和网络连接。本文将为您介绍如何通过USB直连实现两台电...2025-11-05如何建立两台电脑的局域网共享文件(简易步骤教你实现局域网文件共享)
摘要:在现代社会中,计算机已经成为人们工作和生活中不可或缺的工具。在某些情况下,我们可能需要在多台电脑之间共享文件,以便更高效地完成任务。而建立局域网共享文件是一种常见且便捷的方法。本文...2025-11-05- 摘要:苹果电脑一直以来都因其高性能和出色的设计而备受推崇,但长期使用后会积累灰尘,影响性能和散热效果。为了保持苹果电脑的稳定运行,我们有时需要进行拆解清灰操作。本文将介绍苹果电脑拆解清灰...2025-11-05
昂达ondav801s的性能与使用体验(一款性能卓越的平板电脑,给你全新的视觉享受)
摘要:随着科技的不断进步,平板电脑成为人们生活中必不可少的一部分。而昂达ondav801s作为一款性能卓越的平板电脑,在市场上备受瞩目。它拥有令人惊艳的外观设计和强大的性能配置,给用户带...2025-11-05

最新评论