2399|17

7008

帖子

11

TA的资源

版主

楼主
 

转载《从 Arm® Compiler 5 迁移到 Arm® Compiler 6》 [复制链接]

 
 

【前言】在阅读到此篇文章前,我使用AC5转到Ac6时经常遇到很多错误,不得不又转回去,今天早上在爱极术社区读到这篇文章,收获很大。特此转载过来。

在开始之前,建议先备份你的工程代码。

迁移条件

要使用 ARM Compiler 6,建议MDK的版本至少为:

MDK版本5.23或更高版本
MDK版本5.23提供两个编译器,分别是 ARM Compiler 5.06 和 ARM Compiler 6.6。
软件包也需要支持 ARM Compiler 6,以下是支持 ARM Compiler 6 的最低软件包版本:
Keil MDK-Middleware包: 版本7.4.0及以上
Keil ARM Compiler Support 包: 版本1.3.0及以上
ARM CMSIS 包: 版本5.0.1及以上

切换编译器

使用MDK打开工程。
选择 Project - Options for Target from the menu。
点击 Target 选项卡,找到 ARM Compiler: 下拉列表。
设置ARM编译器为 Version 6 。
点击 OK 键确认更改。
切换后的ARM Compiler 6所有设置都为默认值。

设置警告级别

ARM Compiler 6 提供的警告级别比 ARM Compiler 5 多,如果你习惯 ARM Compiler 5 的警告级别,选择AC5-like Wamings。
可以通过在参数前面加上-Wno-来禁用特定诊断组的警告。
例如,通过选项-Wno-missing-noreturn禁用了–Wmissing-noreturn。
Misc Controls
在迁移的第一步中,建议将级别切换为“无警告”。 这将使您可以专注于错误消息。
解决所有错误信息后,选择AC5-like Wamings,设置-Wno-invalid-source-encoding选项:禁用源代码编码检测,因为LCD和打印信息有中文,编译器认为这些是无效编码。
如果想测试下代码是否规范,可以选择All wamings。

设置优化级别

选择-Os babanced级别,平衡代码大小和性能。
如果想代码执行速度快,可以选择-O2、-O3、-Ofast级别,优化性能(速度),优化依次提升,但生成的代码大小可能会变大。
如果想减少代码大小,可以选择-Os babanced、-Oz image size级别,代码大小优化依次提升。
比如我的工程,使用-Oz image size级别编译出的code大小为103026、使用-Os babanced级别编译出的code大小为115848字节、使用-O3级别编译出的code大小为160536。差别很大。
-O0级别没有做任何优化。注意ARM Compiler 5的-O0实际上是有优化的,所以ARM Compiler 6的-O1级别与ARM Compiler 5的-O0级别最为相似,都可以获取良好的调试体验,在调试阶段可以选用。

不兼容的语言扩展

主要是代码中的__align(x)、__packed、__weak等编译器扩展语言。解决方法是使用CMSIS定义的相关宏。

1.替换CMSIS头文件,这里使用的是5.6.0版本的CMSIS。
如果安装了较新的Keil,可以在路径.\Keil_v5\ARM\PACK\ARM\CMSIS目录中找到合适的CMSIS版本。
将.\Keil_v5\ARM\PACK\ARM\CMSIS\5.6.0\CMSIS\Core\Include内的文件替换到工程code_cm3.h所在的文件夹。
2.修改lwip协议栈的cc.h文件,因为lwip使用到了编译器的扩展语言,比如取消结构体的对齐优化、指定变量对齐方式等,这些扩展语言 ARM Compiler 5 和 ARM Compiler 6 并不相同。
在cc.h文件中引用CMSIS提供的cmsis_compiler.h文件,然后修改结构体封装与对齐宏代码为:

3.程序中使用了__packed、__align(n)、__inline、__weak的地方分别用CMSIS提供的宏__PACKED、__ALIGNED(n)、__INLINE、__WEAK代替。

4.如果使用ARM Compiler 5 时习惯使用typedef __packed struct {}X;句法,推荐改为CMSIS提供的宏句法:typedef __PACKED_STRUCT {}X;
当使用ARM Compiler 5 时会自动扩展为:typedef __packed struct {}X;
当使用ARM Compiler 6 时会自动扩展为:typedef struct __attribute__((packed)) {}X;
5.如果使用内联函数建议按照以下格式:

防止ARM Compiler 6在-O0、-O1级别设置下,链接时出现未定义符号的错误。(在这种优化级别下__INLINE可能并不会内联)

不兼容的语言扩展总结如下:

 

 

 

 

 

 

提示:可以使用uVision IDE的查找功能来查找上述关键字,然后做迁移处理。

内嵌汇编

ARM Compiler 6 完全改变了处理汇编代码的策略。 汇编语法现在兼容GNU风格而不是ARM风格。 汇编也是由C编译器完成, 无需单独的汇编器。 FreeRTOS的移植层由..\FreeRTOS\Source\portable\RVDS\ARM_CM3目录下的port.c和portmacro.h文件改为..\FreeRTOS\Source\portable\GCC\ARM_CM3目录下的port.c和portmacro.h文件。 这是因为这两个文件会涉及内嵌汇编。 自定义的内嵌汇编函数。

ARM Compiler 5:

ARM Compiler 6:(看了下帮助手册,也可以不使用汇编)

语法更严格 比如某个函数之前要对外开放,.c和.h中定义和声明都相同。后来在.c文件中将该函数定义为本地函数,使用static修饰,但.h中忘记删除也没有做相应修改。这种情况下,ARM Compiler 5 不会报错,ARM Compiler 6 会报错:

../file_name.c(10): error: static declaration of 'func_name' follows non-static declaration

2.如下代码:

ARM Compiler 5 不会报错,ARM Compiler 6 会报错:

../file_name.c(332): error: invalid suffix '-0x20' on integer constant

需要将代码改为:

优化问题

以下代码在 ARM Compiler 5 中,正常执行,但在 ARM Compiler 6 中,只要不是-O0级别,整个函数因为空循环问题,都被优化掉。也就是延时没有起作用。

所以当升级到 ARM Compiler 6 出现使用软延时的外设不工作,比如软件IIC出错、软件SPI出错、LCD黑屏等问题,可以检查是否有类似的代码。

需要改成:

Keil编译器保证__nop()必定会插入一个NOP指令,在这里可以阻止编译器优化。当然,延时的初始值也要做相应的调整。

编译时间和大小

-O0:Program Size: Code=200360 RO-data=20576 RW-data=96 ZI-data=76316
Build Time Elapsed: 00:00:25
-O1:Program Size: Code=119328 RO-data=16824 RW-data=96 ZI-data=76300
Build Time Elapsed: 00:00:25
-O2:Program Size: Code=153340 RO-data=17100 RW-data=96 ZI-data=76300
Build Time Elapsed: 00:00:26
-O3:Program Size: Code=162292 RO-data=17040 RW-data=96 ZI-data=76308
Build Time Elapsed: 00:00:27
-Ofast:Program Size: Code=161896 RO-data=17040 RW-data=96 ZI-data=76308
Build Time Elapsed: 00:00:26
-Os balanced:Program Size: Code=115628 RO-data=17048 RW-data=96 ZI-data=76300
Build Time Elapsed: 00:00:28
-Oz image size:Program Size: Code=103784 RO-data=17020 RW-data=96 ZI-data=76308
Build Time Elapsed: 00:00:25
-Oz image size LTO:Program Size: Code=85888 RO-data=17064 RW-data=40 ZI-data=75960
Build Time Elapsed: 00:00:32
与Compiler 5 对比(我的程序-可能不具有一般性):
-O2:Program Size: Code=94232 RO-data=16736 RW-data=540 ZI-data=75640
Build Time Elapsed: 00:00:16

参考文档

《Arm® Compiler Migration and Compatibility Guide》(内容详细)
《Migrate ARM Compiler 5 to ARM Compiler 6》 (AN298)

转载于从 Arm® Compiler 5 迁移到 Arm® Compiler 6 - 极术社区 - 连接开发者与智能计算生态 (aijishu.com)

作者:zhzht19861011
原文链接:https://freertos.blog.csdn.net/article/details/109803651

 

最新回复

不是可能,是已经在替换了   详情 回复 发表于 2024-3-21 11:04
点赞 关注
 
 

回复
举报

1976

帖子

1

TA的资源

五彩晶圆(初级)

沙发
 

我同事在使用AC6编译器之后遇到了一些奇怪的问题,有些问题的现象跟文中的描述还是有关联,那既然AC5迁移到AC6会有这么多问题,那么切换成AC6是有哪些明显的优势值得这样去做呢?

点评

会发现AC6更GCC的有些内容会相似了  详情 回复 发表于 2024-3-21 11:03
AC6 是clang,可以充分使用最新的东西。也就是不用自己再维护了。 原来的borland(卖了很多年,它换个名字还活着)也不做自己的编译器,转而使用clang  详情 回复 发表于 2024-3-19 15:27
AC5的编译速度是所有编译器里最慢的,所以他们才升级到AC6.  详情 回复 发表于 2024-3-19 09:13
 
 
 

回复

7008

帖子

11

TA的资源

版主

板凳
 
bobde163 发表于 2024-3-19 08:47 我同事在使用AC6编译器之后遇到了一些奇怪的问题,有些问题的现象跟文中的描述还是有关联,那既然AC5迁移到 ...

AC5的编译速度是所有编译器里最慢的,所以他们才升级到AC6.

点评

按照文章中所描述的,在迁移过程中需要注意的事项,AC6对于老旧代码的兼容性并不太好,即使在编译通过的情况下,选择不同的优化等级都能带来潜在的风险,在长期维护旧代码时有点不太能接受,我的keil都不敢随便更新  详情 回复 发表于 2024-3-19 15:01
 
 
 

回复

848

帖子

3

TA的资源

版主

4
 

前两天也一直在搞这个问题

点评

感谢版主大佬来捧场,我其实一直想转到vs code下面,还没有转过弯来。  详情 回复 发表于 2024-3-19 12:55
 
 
 

回复

7008

帖子

11

TA的资源

版主

5
 
1nnocent 发表于 2024-3-19 10:49 前两天也一直在搞这个问题

感谢版主大佬来捧场,我其实一直想转到vs code下面,还没有转过弯来。

 
 
 

回复

34

帖子

0

TA的资源

一粒金砂(中级)

6
 

很好,学习了

 

 
 
 

回复

1976

帖子

1

TA的资源

五彩晶圆(初级)

7
 
lugl4313820 发表于 2024-3-19 09:13 AC5的编译速度是所有编译器里最慢的,所以他们才升级到AC6.

按照文章中所描述的,在迁移过程中需要注意的事项,AC6对于老旧代码的兼容性并不太好,即使在编译通过的情况下,选择不同的优化等级都能带来潜在的风险,在长期维护旧代码时有点不太能接受,我的keil都不敢随便更新

点评

其实也就速度有点慢,代码量不多的话,无所谓,不过升级到AC6的也趋,现在好多公司都升级到了AC6了。    详情 回复 发表于 2024-3-19 15:03
 
 
 

回复

7008

帖子

11

TA的资源

版主

8
 
bobde163 发表于 2024-3-19 15:01 按照文章中所描述的,在迁移过程中需要注意的事项,AC6对于老旧代码的兼容性并不太好,即使在编译通过的 ...

其实也就速度有点慢,代码量不多的话,无所谓,不过升级到AC6的也趋,现在好多公司都升级到了AC6了。

 

点评

刚刚去百度了一下,进入keil官网查看AC6的更新历史,确实是很早的时候在14年发布了AC6.00,现在最新版本的是2020年发布的AC6.14,我才突然想起来在几年前我就有关注过,当时通过查看升级日志发现还在不断的修复BUG,  详情 回复 发表于 2024-3-19 17:05
 
 
 

回复

7660

帖子

2

TA的资源

五彩晶圆(高级)

9
 
bobde163 发表于 2024-3-19 08:47 我同事在使用AC6编译器之后遇到了一些奇怪的问题,有些问题的现象跟文中的描述还是有关联,那既然AC5迁移到 ...

AC6 是clang,可以充分使用最新的东西。也就是不用自己再维护了。

原来的borland(卖了很多年,它换个名字还活着)也不做自己的编译器,转而使用clang

点评

我刚去keil官网上查看了AC6的更新日志,发现已经趋于稳定了,修复BUG的信息很少了,后续新的项目中可以考虑切入使用,顺势而为  详情 回复 发表于 2024-3-19 17:07
个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 
 

回复

1976

帖子

1

TA的资源

五彩晶圆(初级)

10
 
lugl4313820 发表于 2024-3-19 15:03 其实也就速度有点慢,代码量不多的话,无所谓,不过升级到AC6的也趋,现在好多公司都升级到了AC6了。 ...

刚刚去百度了一下,进入keil官网查看AC6的更新历史,确实是很早的时候在14年发布了AC6.00,现在最新版本的是2020年发布的AC6.14,我才突然想起来在几年前我就有关注过,当时通过查看升级日志发现还在不断的修复BUG,所以就没有考虑使用了,一直都使用比较稳定的AC5,我这边的代码量都不大,电脑性能好的话,编译速度上还是很快的

 
 
 

回复

1976

帖子

1

TA的资源

五彩晶圆(初级)

11
 
freebsder 发表于 2024-3-19 15:27 AC6 是clang,可以充分使用最新的东西。也就是不用自己再维护了。 原来的borland(卖了很多年,它换个 ...

我刚去keil官网上查看了AC6的更新日志,发现已经趋于稳定了,修复BUG的信息很少了,后续新的项目中可以考虑切入使用,顺势而为

点评

大佬果然付之行动呀,期待使用AC6,能帮助的代码更上一个台阶!  详情 回复 发表于 2024-3-19 21:38
 
 
 

回复

7008

帖子

11

TA的资源

版主

12
 
bobde163 发表于 2024-3-19 17:07 我刚去keil官网上查看了AC6的更新日志,发现已经趋于稳定了,修复BUG的信息很少了,后续新的项目中可以考 ...

大佬果然付之行动呀,期待使用AC6,能帮助的代码更上一个台阶!

 
 
 

回复

365

帖子

3

TA的资源

纯净的硅(初级)

13
 

我记得官网上说的大概意思是因为AC6的语言比AC5 的先进,所以编绎器的效率更高,同时代码编绎出来的结果,效率也更高,所以建议大家用AC6.

我也有用AC6编绎的东东(国产有几个MCU的官网驱动代码和库,默认就是用的AC6),常规使用看不出差别。

 
 
 

回复

6106

帖子

4

TA的资源

版主

14
 

楼主开始研究编译器的优劣了。

点评

这几天在看ARM-CORTEX M0权威,也有看到AC6的知识,可能AC5要被替换了。  详情 回复 发表于 2024-3-20 10:03
我是在应用中,有些厂家用AC5,有些用AC6,转换中有些厂家的产品会报一堆的错误,以前是用到才找答案,昨天看到这个文章,想着转过来,以后方便找资料。  详情 回复 发表于 2024-3-20 10:02
 
 
 

回复

7008

帖子

11

TA的资源

版主

15
 
damiaa 发表于 2024-3-20 08:58 楼主开始研究编译器的优劣了。

我是在应用中,有些厂家用AC5,有些用AC6,转换中有些厂家的产品会报一堆的错误,以前是用到才找答案,昨天看到这个文章,想着转过来,以后方便找资料。

 
 
 

回复

7008

帖子

11

TA的资源

版主

16
 
damiaa 发表于 2024-3-20 08:58 楼主开始研究编译器的优劣了。

这几天在看ARM-CORTEX M0权威,也有看到AC6的知识,可能AC5要被替换了。

点评

不是可能,是已经在替换了  详情 回复 发表于 2024-3-21 11:04
 
 
 

回复

18

帖子

0

TA的资源

一粒金砂(中级)

17
 
bobde163 发表于 2024-3-19 08:47 我同事在使用AC6编译器之后遇到了一些奇怪的问题,有些问题的现象跟文中的描述还是有关联,那既然AC5迁移到 ...

会发现AC6更GCC的有些内容会相似了

 
 
 

回复

18

帖子

0

TA的资源

一粒金砂(中级)

18
 
lugl4313820 发表于 2024-3-20 10:03 这几天在看ARM-CORTEX M0权威,也有看到AC6的知识,可能AC5要被替换了。

不是可能,是已经在替换了

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
推荐帖子
浅析嵌入式程序设计中的优化问题

嵌入式系统由于受功耗、成本和体积等因素的制约,嵌入式微处理器的处理能力与桌面系统处理器相比也存在较大差距,故嵌入式系统对 ...

TI科学家谈浮点DSP未来发展

自十多年前浮点数字信号处理器(DSP)诞生以来,便为实时信号处理提供了算术上更为先进的备选方案。不过,定点器件至今仍是业界的 ...

电子设计竞赛系列指导之一--控制器的选择

本帖最后由 paulhyde 于 2014-9-15 04:02 编辑 22186

各大论坛经典帖子收藏

目 录 1. 硬件工程师值多少钱. 2 2. 决定高薪的细节守则. 2 3. 公司绝不会告诉你的20大秘密(一). 4 4. 公司 ...

正弦振荡电路杂谈(一)

        正弦振荡电路杂谈(一)         文氏电桥振荡电路及其限幅   本《正弦振荡杂谈》系列帖,并非要把 ...

Kicad 3d显示的时候会出现好几个白色的圈圈,这表示什么?

各位大神好,Kicad 3d显示的时候会出现好几个白色的圈圈,这表示什么? 489288

PCB及PCB LAYOUT(干货分享)

503014 503103 503102 503101 503100 503099 503098 503097 503096 503095 503094 503093 ...

求一款三极管的替代

我的可调电源里用的这款UTC的2SD880坏了,现在买不到同型号的器件 ,如果想用其它三极管替代应该注意哪些参数? 687366 ...

TI MSPM0L1306 LaunchPad体验08:内部温度传感器出厂校准误差有200多摄氏度?

尝试用MSPM0L1306芯片内部温度传感器测量温度,并和外置的热敏电阻读数对比。 热敏电阻的温度换算,在 TI MSPM0L1306 Lau ...

读书入围名单: 2024新书《换道赛车:新能源汽车的中国道路》

感谢网友关注2024新书《换道赛车:新能源汽车的中国道路》阅读活动,以下是入围网友信息。 第二批围的网友请注意,请在20 ...

关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表