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常亮:
参考文献:
注意操作系统的选择:
下载好后安装,将其安装到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” />
AC6在编译时可以选择6种优化级别或者是不优化:
同时,还可以选择C的版本:
关于每个优化级别具体是怎样优化的等等更详细的内容在此就不展开了。