大家好,我是麦麦。上次写了篇《Keil 编译太慢怎么办?教你一招,提速10倍 》,减少了中间文件的生成,确实提高了很多编译速度。其实并没有从根本上解决问题。有大佬提出直接用。在AC6上。于是换成AC6试了一下,效果还是不错的,所以分享出来,有兴趣的朋友可以看看,希望对大家有所帮助。AC6有何不同?ARM编译器5(及更早版本)使用armcc编译器。而AC6(ARMCompiler6)用armclang替换了armcc,因此是一个新的编译器。这个问题是七年前问的。AC6和AC5具体有什么区别?参考链接:https://developer.arm.com/documentation/100068/0612/migrating-from-arm-compiler-5-to-arm-compiler-6/migration-overviewArmCompiler6基于现代LLVM编译器框架。ArmCompiler5不基于LLVM编译器框架。因此,在将项目和源文件从ArmCompiler5迁移到ArmCompiler6时,我们需要注意以下几点:调用编译器时命令行选项的差异。遵守语言标准的差异。特定于编译器的关键字、属性和编译指示的差异。编译器优化和诊断行为的差异。以下是AC6和AC5的工具链差异:工具链差异从这里我们可以看出,除了C编译器和预处理器,其他基本相同。除了工具链的不同,还有优化的不同,还有一些默认的不同,包括编译选项,生成的固件名称后缀不同等等,具体可以参考上面的链接。至于强不强,用过就知道了。在Keil中切换编译器在KeilMDK5.27中,我们可以通过打开工程选项来切换编译器,其中包括AC5和AC6,如下图;为了测试,我使用CubeMX生成了一个基于HAL库的STM32F103CBKeilMDK工程,使用AC5编译器构建;总共用了10秒;后来改用AC6编译器重新编译;总共用了5秒;如果是纯粹基于HAL库,没有添加其他第三方库,直接在项目选项中的compileroptions中,选择AC5和AC6即可实现无缝切换。这是因为CMSIS中已经为您处理了兼容性。在cmsis_compiler.h中,这里的条件编译选项,通过判断不同的编译器版本,我们可以发现已经包含了不同的头文件,分别对应armcc和armclag;如下图所示;已根据系统选择项目;#elifdefined(__ARMCC_VERSION)&&(__ARMCC_VERSION>=6010050)#include"cmsis_armclang.h"判断当前__ARMCC_VERSION的版本号,然后includecmsis_armclang.h头文件。这个文件已经做了AC6要求的兼容性修改。参考官方文档《apnt_298,MigrateARMCompiler5toARMCompiler6MDKTutorial》,可以知道在C语言部分需要做如下修改:当然,一些涉及很底层的操作需要混合C和汇编的编程,也需要修改,文档中有类似的说明;参考链接:https://gcc.gnu.org/onlinedocs/gcc/Using-Assembly-Language-with-C.html#Using-Assembly-Language-AddingFreeRTOSwith-C在项目中添加FreeRTOS非常方便通过ST官方的CubeMX。但是,如果你通过这个软件添加RTOS,它默认使用ARMCCVERSION5。因此,当我直接切换到ARMCCVERSION6时,编译时出现115错误。查了错误来源,主要错误在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;只需将这两个文件复制到项目中并替换原文件即可;rebuildrebulid,可以看到构建成功,而且花费的时间很少;综上所述,本文参考官方文档,简单介绍AC5和AC6的异同,并在KeilMDK环境下测试,并添加FreeRTOS。从AC5迁移到AC6需要参考文档MigrateARMCompiler5toARMCompiler6MDKTutorial,里面解释的很详细。
