Keil:从AC5到AC6
前一阵安装了新版本的Keil,搭配CubeMX使用没有出现什么问题。但是今天查看以前代码的时候发现了一个很尴尬的问题,编译莫名其妙会出现很多问题。先把问题复现一下,在后面会讲如何解决:
1.问题复现
打开一个工程,然后直接编译,并不会现在令人愉快的0 Erros, 0 Warnings
,而是一段没见过的提示:
*** Target 'LED' uses ARM-Compiler 'Default Compiler Version 5' 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.
翻译一下:
*** 目标'LED'使用ARM-编译器'默认编译器版本5',该版本不可用。
*** 请查看已安装的ARM编译器版本。管理项目项目 - 文件夹/扩展程序 "来管理ARM编译器版本。目标的选项 - 目标 "为目标选择一个ARM编译器版本。
*** 构建失败。
于是我打开用CubeMX建的工程看了一下设置,发现那些工程中在Target选项卡中选择的都是version6:
保存设置后重新进行编译,会发现Errors居然有200来个:
2.解决方法
出现该问题的原因是新版Keil使用的是AC6(即Arm Compiler 6)编译器,而旧版Keil使用的是AC5(即Arm Compiler 5)编译器。如果为了以后也使用AC6,那么方法是将AC5的代码移植为AC6;如果工程相当庞大,也可以让新版Keil使用AC5。
2.1.将AC5工程移植到AC6
打开sys.c文件,将代码替换为:
#include "sys.h"void WFI_SET(void)
{__ASM volatile("wfi");
}void INTX_DISABLE(void)
{ __ASM volatile("cpsid i");
}void INTX_ENABLE(void)
{__ASM volatile("cpsie i");
}void MSR_MSP(u32 addr)
{__ASM volatile("MSR MSP, r0"); //set Main Stack value__ASM volatile("BX r14");
}
打开usart.c文件,将下面这一段代码
#if 1
#pragma import(__use_no_semihosting)struct __FILE
{int handle;
};
替换为
#if 1
__ASM (".global __use_no_semihosting");
再次编译,依然有很多问题:
我们在设置中更改这两项的选项:
再次编译:
还有4Errors, 1Warnings。我们在Manage Project Items处将core_cm3.c移除:
移除后再次编译就无错误了:
烧录一下也没有问题,LED0常亮:
参考文献:
Migrate from ARM C/C++ Compiler 5 to ARM Compiler 6
Update ARM Compilation Tools
2.2.在新版本Keil中添加AC5编译器
前往Arm Compiler 5 (ACOMP5)下载AC5,笔者选择的版本是Arm Compiler 5.06 update 7。也可以选择其他版本:
注意操作系统的选择:
下载好后安装,将其安装到Keil所在的安装目录下。例如笔者安装在D:\Keil_v5
,则AC5就安装到D:\Keil_v5\Arm\
目录下。如图所示:
打开工程,打开Manage Project Items,点击Folders/Extensions选项卡:
点击ARM Compiler右侧的拓展选项:
点击新增ARM Compiler:
选中刚刚安装的AC5,点击确定,保存后关闭选项卡。在设置中选择使用AC5:
成功编译:
参考文献:
What should I do if I want to download a legacy release of Arm Compiler?
Arm Compiler downloads index
PS.使用此方法也可以在旧版Keil里使用AC6,只需要在官网下载一个AC6即可。
3.何为AC5?何为AC6?
Arm Compiler 5(即AC5),在Keil MDK V4版本及V5早期的版本都是使用AC5。在2015年的时候,AC6发布了,并在随后新版本的MDK中集成了AC6,直到现在最新版本的MDK集成了AC6.18。用户可以通过2.1一节中的方法修改AC5或AC6的版本。
AC5在编译时可以选择3种优化级别或者是不优化:
AC6在编译时可以选择6种优化级别或者是不优化:
同时,还可以选择C的版本:
关于每个优化级别具体是怎样优化的等等更详细的内容在此就不展开了。