草庐IT

最新KEIL软件中编译器不再支持AC5解决方案

weixin_44785251 2023-09-03 原文

文章目录

最新KEIL软件中编译器不再支持AC5解决方案

一、前言

新版Keil使用的是AC6(即Arm Compiler 6)编译器,而旧版Keil使用的是AC5(即Arm Compiler 5)编译器。KEIl5最新版本官方不再默认安装V5编译器,也就是KEIl5软件中已经没有了AC5(即Arm Compiler 5),最新的支持AC6(即Arm Compiler 6),导致某些代码无法兼容。新版本的KEIl5,搭配CubeMX使用没有出现什么问题。在查看正点原子代码的时候,编译莫名其妙会出现很多问题,就是因为编译器不再支持AC5(即Arm Compiler 5),只支持AC6(即Arm Compiler 6),所以出现部分代码不支持出现报错和警告。因此现在解决方案就有两个:一个是重新安装AC5(即Arm Compiler 5);另一个是根据现在的编译器来进行配置,进行代码修改兼容将AC5的代码移植为AC6。

二、问题复现

打开一个工程,然后直接编译,出现一段没见过的提示:

*** Target ‘Target 1’ 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.
*** Rebuild aborted.
翻译一下:
*** 目标’Target 1’使用ARM-编译器’默认编译器版本5’,该版本不可用。
*** 请查看已安装的ARM编译器版本。
管理项目项目 - 文件夹/扩展程序 "来管理ARM编译器版本。
目标的选项 - 目标 "为目标选择一个ARM编译器版本。
*** 构建失败。

使用CubeMX建的工程看了一下设置,发现那些工程中在Target选项卡中选择的都是version6;保存设置(Arm Compiler:Use default compiler version 6)后重新进行编译,会发现Errors以及Warnings会有好多个。

三、解决方案

方案一:直接安装AC5(即Arm Compiler 5)

1、前往Arm Compiler 5 (ACOMP5)下载AC5,选择的版本是Arm Compiler 5.06 update 7。也可以选择其他版本:
注:下载链接:https://developer.arm.com/downloads/view/ACOMP5

2、根据操作系统选择下载版本,笔者的是window11选择的是Win32。

3、下载好进行解压,解压后进入解压后的文件夹并且选中setup.exe,右击鼠标点击以管理员身份运行进行安装,将其安装到Keil所在的安装目录下。例如笔者安装在D:\KEIL5\Keil_v5_Arm&C51,则AC5就安装到D:\KEIL5\Keil_v5_Arm&C51\Arm目录下,如图所示:
注:为便于管理给AC5编译器新建一个文件夹ARMCC,把AC5安装文件放置在ARMCC中。
一般来讲,AC5编译器的放置位置与ARMCLANG在同一级文件夹下。


4、打开工程,打开Manage Project Items(标号1);点击Folders/Extensions选项卡(标号2);点击ARM Compiler右侧的拓展选项(标号3);点击Add another ARM Compiler Version to List;选中刚刚安装的AC5(刚安装好的ARMCC文件夹),点击确定,保存后关闭选项卡。在设置中选择使用AC5(Arm Compiler:Use default compiler version 5)后重新进行编译,编译成功。



方案二:将AC5工程移植到AC6

一、按照官方文档说明进行配置

1、Switch the Compiler in µVision IDE

即配置工程,将编译器切换到AC6:Project(标号1) -> Option for Target (标号2)-> Target(标号3).Arm Compiler下拉框中选择Use default compiler version 6或者V6.18(标号4)

2、Diagnostic Settings: Warnings and Errors和Object and Library Compatibility

即诊断设置,也就是配置工程,编译时警告输出的方式:先切换到AC6(1.Switch the Compiler in µVision IDE(即上一步配置工程)),再配置(默认AC5-like即可)。关于使用库存在的一些问题,在编译的时候,添加关键字: -fshort-enums & -fshort-wchar(一般默认都是添加了的),按照下图进行配置即可。

这里想说一点:V6编译器检查的规则更加严格,简单来说,就是编译的警告会更多。如以前的一些代码编译都是没有警告,但用V6就可能有警告。

3、Incompatible Language Extensions

即V5和V6的指令不兼容,我们需要修改不兼容的代码。其实,就那么几条不兼容的语句,编译之后见到的错误基本就是由于这些语句的不兼容导致的。

4、Data Packing

这里主要是说数据结构,也是上面的指令不兼容的问题。如果之前使用typedef __packed struct定义,则替换成:__PACKED_STRUCT。

5、Assembler Migration

汇编迁移:这一节可以说是重点。

很多RTOS都有一个或多个与汇编有关的源代码文件,所以,很多有RTOS的工程,编译后都会存在许多错误。常见的就是“asm”这个关键字。
文件中大概说明了:兼容GNU标准,不兼容ARM标准。其中还特别强调了关于Inline Assembler的一点,仅支持GNU标准:

二、修改源代码

根据上面说明,已经修改完工程配置。接下来就需要修改源代码,如果兼容的源代码,替换即可; 如果没有,就只有按照官方说明一步一步修改。

使用官方提供的、兼容V6的代码替换这种快捷解决问题的办法。

解决CMSIS不兼容问题

如果我们安装了最新的MDK-ARM,在安装目录下都有这些文件。

如果MDK-ARM安装目录下不是最新的CMSIS文件。则需要下载最新的CMSIS文件替换你工程中CMSIS文件。
注:CMSIS文件下载地址:http://www.keil.com/dd2/Pack

例如笔者的安装目录为D:\KEIL5\Arm\Packs\ARM\CMSIS\5.9.0
其中5.9.0即为CMSIS文件的版本,并且从CMSIS文件下载地址网站可以看出CMSIS文件最新版本为5.9.0。若在CMSIS文件下载地址网站有最新版本,则需要下载最新的CMSIS文件替换你工程中CMSIS文件

若下载了最新的CMSIS文件(标号1),双击标号1,弹出安装界面,然后点击弹出界面的“Next"(标号2),即可完成安装最新的CMSIS文件。

这种方法可解决Cortet-M等处理器程序编译的错误问题,如STM32F0、F1、F4等Cortet-M等程序。

针对正点原子解决CMSIS不兼容问题

若使用的是正点原子的标准库程序,则需要按照下面两图进行配置,如图所示:

这种方法可解决正点原子标准库程序Cortet-M等处理器程序编译的错误问题,如STM32F0、F1、F4等Cortet-M等程序。

有关最新KEIL软件中编译器不再支持AC5解决方案的更多相关文章

  1. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

    在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

  2. 报告回顾丨模型进化狂飙,DetectGPT能否识别最新模型生成结果? - 2

    导读语言模型给我们的生产生活带来了极大便利,但同时不少人也利用他们从事作弊工作。如何规避这些难辨真伪的文字所产生的负面影响也成为一大难题。在3月9日智源Live第33期活动「DetectGPT:判断文本是否为机器生成的工具」中,主讲人Eric为我们讲解了DetectGPT工作背后的思路——一种基于概率曲率检测的用于检测模型生成文本的工具,它可以帮助我们更好地分辨文章的来源和可信度,对保护信息真实、防止欺诈等方面具有重要意义。本次报告主要围绕其功能,实现和效果等展开。(文末点击“阅读原文”,查看活动回放。)Ericmitchell斯坦福大学计算机系四年级博士生,由ChelseaFinn和Chri

  3. 软件测试基础 - 2

    Ⅰ软件测试基础一、软件测试基础理论1、软件测试的必要性所有的产品或者服务上线都需要测试2、测试的发展过程3、什么是软件测试找bug,发现缺陷4、测试的定义使用人工或自动的手段来运行或者测试某个系统的过程。目的在于检测它是否满足规定的需求。弄清预期结果和实际结果的差别。5、测试的目的以最小的人力、物力和时间找出软件中潜在的错误和缺陷6、测试的原则28原则:20%的主要功能要重点测(eg:支付宝的支付功能,其他功能都是次要的)80%的错误存在于20%的代码中7、测试标准8、测试的基本要求功能测试性能测试安全性测试兼容性测试易用性测试外观界面测试可靠性测试二、质量模型衡量一个优秀软件的维度①功能性功

  4. 神州数码无线产品(AC+AP)配置 - 2

    注意:本文主要掌握DCN自研无线产品的基本配置方法和注意事项,能够进行一般的项目实施、调试与运维AP基本配置命令AP登录用户名和密码均为:adminAP默认IP地址为:192.168.1.10AP默认情况下DHCP开启AP静态地址配置:setmanagementstatic-ip192.168.10.1AP开启/关闭DHCP功能:setmanagementdhcp-statusup/downAP设置默认网关:setstatic-ip-routegeteway192.168.10.254查看AP基本信息:getsystemgetmanagementgetmanaged-apgetrouteAP配

  5. Ruby 守护进程和 JRuby - 备选方案 - 2

    我有一个应用程序正在从Ruby迁移到JRuby(由于需要通过Java提供更好的Web服务安全支持)。我使用的gem之一是daemons创建后台作业。问题在于它使用fork+exec来创建后台进程,但这对JRuby来说是禁忌。那么-是否有用于创建后台作业的替代gem/wrapper?我目前的想法是只从shell脚本调用rake并让rake任务永远运行......提前致谢,克里斯。更新我们目前正在使用几个与Java线程相关的包装器,即https://github.com/jmettraux/rufus-scheduler和https://github.com/philostler/acts

  6. .net - 是否有 Ruby .NET 编译器? - 2

    是否有适用于Ruby语言的.NETFramework编译器?我听说过DLR(动态语言运行时),这是否将使Ruby能够用于.NET开发? 最佳答案 IronRuby是Microsoft支持的项目,建立在动态语言运行时之上。 关于.net-是否有Ruby.NET编译器?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/199638/

  7. ruby - 如何使用 readline 支持重新安装 ruby​​? - 2

    我已经按照https://github.com/wayneeseguin/rvm#installation上的说明通过RVM安装了Ruby.有关信息,我有所有文件(readline-5.2.tar.gz、readline-6.2.tar.gz、ruby-1.9.3-p327.tar.bz2、rubygems-1.8.24.tgz、wayneeseguin-rvm-stable.tgz和yaml-0.1.4.tar.gz)在~/.rvm/archives目录中,我不想在任何目录中重新下载它们方式。当我这样做时:sudo/usr/bin/apt-getinstallbuild-essent

  8. ruby-on-rails - "undefined method ` stub_request '"访问 RSpec 支持文件中的方法时 - 2

    我的Ruby-on-Rails项目中有以下文件结构,用于规范:/spec/msd/serviceservice_spec.rb/support/my_modulerequests_stubs.rb我的request_stubs.rb有:moduleMyModule::RequestsStubsmodule_functiondeflist_clientsurl="dummysite.com/clients"stub_request(:get,url).to_return(status:200,body:"clientsbody")endend在我的service_spec.rb我有:re

  9. ruby - Ruby 是否支持逐字字符串? - 2

    Ruby是否支持(找不到更好的词)非转义(逐字)字符串?就像在C#中一样:@"c:\ProgramFiles\"...或者在Tcl中:{c:\ProgramFiles\} 最佳答案 是的,您需要在字符串前加上%前缀,然后是描述其类型的单个字符。你想要的是%q{c:\programfiles\}。镐书很好地涵盖了这一点here,部分是通用分隔输入。 关于ruby-Ruby是否支持逐字字符串?,我们在StackOverflow上找到一个类似的问题: https:/

  10. ruby - 在 Ruby 1.8 中支持 Ruby 1.9 的哈希语法 - 2

    我正在编写一个Rubygem,在我的代码中使用{key:'value'}哈希语法。我的测试都在1.9.x中通过,但我(可以理解)在1.8.7中得到syntaxerror,unexpected':',expecting')'。是否有支持1.8.x的最佳实践?我是否需要使用我们的老friend=>重写代码,还是有更好的策略? 最佳答案 我认为你运气不好,如果你想支持1.8,那么你必须使用=>。像往常一样,我会提到在1.9的某些情况下您必须使用=>:如果键不是一个符号。请记住,任何对象(符号、字符串、类、float……)都可以是Ruby哈

随机推荐