比较IAR,MDK的AC5和AC6以及Embedded Studio的CLANG和GCC编译HAL库性能

2020-01-04 19:02发布

本帖最后由 Eric2013 于 2019-3-30 14:44 编辑

MDK AC5(ARM Compiler5)编译STM32H7的HAL库带Browse Info时速度巨卡,电脑性能稍差点,编译个大点的工程能编译出几十分钟。

测试条件:
1、IAR8.30开最高等级的最小代码优化
2、MDK5.27正式版使用AC5开最高等级优化3
3、MDK5.27正式版使用AC6开最小代码优化
4、Embedded Studio4.15 beta版使用GCC开最高等级代码大小优化
5、Embedded Studio4.15 beta版使用CLANG开最高等级代码大小优化
6、全部开启多核并行编译
7、电脑配置是i3-3220,机械硬盘
8、暂未测试芯片实际执行性能。

注意,现在MDK的AC6和IAR打开后都会主动创建Browse Info,在窗口的最下方正中间有个提示。
MDK标识,要等待标识消失才可以使用go to def
QQ截图20190330144146.jpg (34.43 KB, 下载次数: 0) 下载附件 2019-3-30 14:43 上传

总结,MDK的AC6生成的代码最小。



现在MDK5的AC6也是用的CLANG,总的来说,无论是编译速度还是生成代码大小,CLANG都表现出巨大优势。

当前HAL库使用AC6编译的警告有点多,可以选择使用AC5的警告临时屏蔽,提供的测试例子是采用的这种方式。

另外使用中文也会有很多警告,所以干脆使用UTF-8编码,就没有警告了,不过程序中的打印有中文的话,串口助手要使用支持UTF-8的,比如SecureCRT即可。

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
81条回答
abutter
1楼-- · 2020-01-14 12:46
一般来说 gcc 加 lto 是指会改变代码和数据的布局,本身不改变优化选项,不会出大的问题。
如果开了 lto 出了问题,多数情况下是代码本身就有问题,只是没有暴露出来。
gamethink
2楼-- · 2020-01-14 13:36
本帖最后由 gamethink 于 2019-5-30 15:34 编辑

初略比较一下性能,我不是用HAL库,与那个无关,是一段有部分数学运算的的算法,具体什么不重要了,看看时间差别
V6模式
-Oz 18.54ms
-Of 16.55ms
-Os 17.01ms
-O3 16.55ms

V5模式
-O3 开启时间优化和one ELF 15.76ms

有点跌眼镜,V5模式下竟然最快

bigwei
3楼-- · 2020-01-14 15:25
 精彩回答 2  元偷偷看……
Eric2013
4楼-- · 2020-01-14 15:31
gamethink 发表于 2019-5-30 15:20
初略比较一下性能,我不是用HAL库,与那个无关,是一段有部分数学运算的的算法,具体什么不重要了,看看时 ...

这个东西还没有顾上去测试,后面做第2版DSP教程了,更新下这个帖子,做个系统的比较。
gamethink
5楼-- · 2020-01-14 21:09
之前说V6,编译选项只要用了LTO程序不正常,现在查出那里不正常,但又没办法结局
程序是定时控制ADC采集,然后数据送往DMA,DMA达到慢时中断。

将ADC值打印出来,趋势是对的,但是明显看到输出有问题,信号不连续,连续多个ADC值是相同,所以导致程序结果不对
现在还没查出解决方法,V6的-O3速度还没V5-O3快
W872529868
6楼-- · 2020-01-15 03:06
本帖最后由 W872529868 于 2019-6-18 22:42 编辑
Eric2013 发表于 2019-3-30 00:00
是MDK带的,集成到IDE里面了,在安装目录里面有相关文件。


已经安装了5.27但是发现界面好像和你发的截图有点不同

QQ截图20190618223525.png (27.97 KB, 下载次数: 0)

下载附件

2019-6-18 22:36 上传


这是我哪里选择错了吗?工程是以前用4.7建的。


用AC6得用UTF-8编码格式,如果要控制串口屏,它的格式是GB2312那有什么方法转换?

一周热门 更多>