你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

Keil MDK 编译器 AC5 和 AC6 优化选项重要内容和区别

[复制链接]
STMCU-管管 发布时间:2020-12-3 12:43
Keil MDK 编译器 AC5 和 AC6 优化选项重要内容和区别
  m4 l+ V' h, D. W) n. s) I
% J; t. Z6 S/ t  i
使用过Keil MDK (Arm Compiler 6)编译器V6版本的读者应该发现了一个问题,V6版本速度比V5版本编译速度快很多。0 a- ^1 n# a2 ?* |

0 H' K, R" `9 @- b" i: y
) x* ?% V8 q# N7 e; m$ D. y) ?
(说明:是V6版本编译器,不是V6版本MDK)/ y0 T2 N" |) n

- U. d" Y  Q, D& X* M3 o那你发现了Arm Compiler V6和V5有什么区别吗? 集成在MDK中的优化选项又有哪些区别?
; O+ W2 L2 \+ Z. ?& I& ?8 f2 k
一、关于Arm Compiler 6
. N: F* Q" J4 T0 f* p) L8 e$ Y% o+ c* N' d3 @- n" y1 d. j$ |; [
7 c$ O3 y  D' A# I: \) k5 l
Arm Compiler 6(简称AC6)是用于Arm处理器的编译工具链,目前最新版本:Arm Compiler  V6.14。0 o. r7 I8 |7 Q

, Z6 {+ E1 K8 m9 P
2 B3 ]% k! D% e! _
用于编译Coterx-M处理器的编译器很多,Arm Compiler就是其中一个,常用于Keil MDK、 Arm Development Studio(DS-5)中,还可用作独立工具链安装。
/ B, Y- |2 E2 o/ B, W1 H) a) `& ]
11.png
当然,除了Arm Compiler,针对Coterx-M的编译器还有很多,比如:GNU Compiler、 IAR Compiler、 CCS Compiler等。# t7 Y  r% C9 J) z# X: u2 G
1 ~  j/ n% |5 ^  J) |- x  ^5 W9 p  u
Arm Compiler 6工具链包括:
& s5 T2 a( l9 ~1 X2 u0 ?  W. ^9 H0 T: Parmclang:基于LLVM和Clang技术的编译器和集成汇编器。; {$ |$ o/ ~& q& [; ]. ~/ z
armasm:armasm语法汇编代码的旧版汇编程序。将armclang集成汇编程序用于所有新的汇编文件。6 _& ^8 I% K) |' t3 T) ^9 @
armar:使ELF目标文件集可以一起收集。* Y+ x8 X- Y" H/ d) Y. q
armlink:将对象和库组合在一起以生成可执行文件的链接器。2 M% q- l6 ?* c( q6 d4 E& d
fromelf:镜像转换程序和反汇编程序。+ a- M$ t; i3 i6 ?
Arm C libraries:嵌入式系统的运行时支持库。. }' }2 N  a. T6 @3 ]. C2 w. I" h
Arm C ++libraries:基于LLVM libc++项目的库。) A0 ?' w* }8 k- N6 K2 y4 a+ K
12.png
ARM Compiler 5(和更早版本)使用armcc编译器,而ARM Compiler 6将armcc替换为armclang,armclang基于LLVM,它具有不同的命令行参数、指令等,因此算是一个新的编译器。8 l. ~1 w; |3 `# M- i% u7 C9 q$ m8 P0 C

' ]' U2 b1 v9 C- r& u0 @更多参考内容和地址:
: C/ I* W) u$ ^. X" V) S( m0 {) @! ?8 Y编译器Clang会代替GCC吗?
' }$ n. d+ H$ B" o" `
# L8 w* c, Z! [& ~

) y5 k! C# g) H" ]' v" h' `http://www2.keil.com/mdk5/compiler/6/
" T8 a, E5 M  x+ L2 C  E3 t3 b( thttps://developer.arm.com/tools-and-software/embedded/arm-compiler/downloads/version-6
' L2 A7 I+ _& w- p1 |
  V2 J! o4 e' U) }

/ R" g& K1 `* K- }7 G- x) o* s0 U, n7 R二、AC5和AC62 k: u5 f) [8 X: o# `$ D$ k
" t5 A( b" J% Y
; R% T( x' Q' {1 G/ y
Arm Compiler 5(AC5)算是用的比较多的一代编译器,在Keil MDK V4版本及V5早期的版本都是使用AC5。
4 k! E. f: v& _& A
0 @! K% |$ n/ `4 P0 Z在2015年的时候,AC6发布了,并在随后新版本的MDK中集成了AC6,直到现在最新版本的MDK集成了AC6.13(可以修改版本):9 @7 u: M9 \# T# a, z0 P
13.png
AC6相比AC5优势6 \1 r4 m; H. y; _
- a- Y8 K4 _* i; @0 @# E# K0 V

3 O# k" l5 Z7 S1 yAC6相比之前版本的编译器做了很多改动,大家最为直观的感受就是编译速度提高了很多,还有代码大小。
9 |( t: a9 B8 I( L( |' o" y0 M, |. Q2 O3 q& _' a6 |
当然除了速度和大小,还有其他很多优势,比如:支持C ++ 14标准、使用TrustZone for Armv8-M为设备创建安全和非安全代码、兼容基于GCC创建的源代码,也就是GCC可以编译的源码它也能编译。
4 f$ P4 N; T( P8 r% j" t, a' k6 V  H5 m9 F: m
这是官方提供的代码大小对比:
1 e$ |6 V4 ^. e, l( C) @$ U) o& k
14.png
AC5升级到AC6
2 n4 s9 Q! Q% V1 y7 O
+ `* ?1 I7 K4 [0 ^& p! X7 y
# q  q1 M* R" y+ k( s3 q+ K! i
AC5和AC6是不同的编译器,兼容性方面还是有差异,需要迁移。这个迁移过程官方提供有文档:
9 B, b) ~/ I4 ]4 b8 [7 A& C# \8 d8 d" _) j% O/ L9 L6 S6 o
+ k( N7 _. X2 G0 z) k* l9 [/ A
https://developer.arm.com/docs/100068/0614/migrating-from-arm-compiler-5-to-arm-compiler-6
& U# |+ |1 [4 a, R, J0 _' o2 v0 ^: V  X$ [4 Z2 U% R
当然,也可以参看我之前分享的文章:
! c, I9 f* J4 q+ A4 A+ V* b( B' u+ r' r& I; t( l
3 u% M  _( M7 s1 R0 n$ M4 h
MDK-ARM编译器从V5升级到V6需要做哪些工作?
" p# N  P# z8 f' s) L( R3 L0 l  Q. o
三、Keil MDK 优化选项* t; o( t- p* ?* i4 C
- c8 _5 h8 k8 \, ]1 ]

" L4 F3 d- d: d6 E5 P在Keil MDK中,相比AC5,使用AC6会增加几个优化选项:代码大小、速度、平衡等。8 [( u: o% I# m: N* k$ `

+ {/ O& V$ [9 F# P. n* z2 @优化选项包含:, P' t% R! M' B3 X
15.png
优化级别-O0
6 Y) J) P" p6 `: Q; ^
% l' _5 G4 ^1 e' g# R
6 b( E( Y& {! r
-O0禁用所有优化。此优化级别是默认设置。使用-O0 结果可以加快编译和构建时间,但比其他优化级别生成的代码要慢。与-O0其他优化级别相比,代码大小和堆栈使用率明显更高 。生成的代码与源代码紧密相关,但是生成的代码量更大,包括无用的代码。
+ @. U0 w3 `) \. \) q& _& Q. P5 H- z% T& j$ Y

6 \# d( ^$ O* ~8 T0 l4 ]优化级别-O1
: W2 R* |5 M) y* |-O1在编译器中启用核心优化。此优化级别提供了良好的调试体验,并具有比-O0更好的代码质量,堆栈使用率也提高了。Arm建议使用此选项以获得良好的调试体验。
) f5 Z+ S' i4 W9 Q7 L
: Y5 w) I- @6 R# N, r% ]& g' D6 B* J

3 J3 U: Y$ c4 Q" F; h-O1与-O0相比,使用时的区别是:
- ^$ a  R8 j6 b/ Z4 R" j) P
( n* ^( c/ F5 {/ N- h# r$ a% [

, d7 y! {) A- c' A& Y+ l0 E6 b启用优化,这可能会降低调试信息的完整度。% o% r+ I* Q. y' H+ W

; X* }$ C  i9 \6 T9 P
' J% O* L/ z5 g: a" S( ~
启用了内联和尾调用,这意味着回溯可能无法提供打开功能激活的堆栈。$ W8 ]! j8 J$ s, |+ e7 K

+ J1 U: a5 Q, l: {6 m+ S& Y
" O7 x9 `) H+ s" I$ a' z7 p
不会调用没有使用,或没有预期调用的函数,代码量更小。
  [9 J. Y& ~: y' H, A" y; g2 w0 m/ h, o) P# @- f* z+ X- n

4 D' D9 e5 y# A( ?* S- w变量的值在不使用后可能在其范围内不可用。例如,它们的堆栈位置可能已被重用。。4 f4 ^* _) K: T: [

: x+ e( w+ u! ^7 A' d- h1 @: ~8 t

# d5 r* M$ I. k  K: E  ^优化级别-O2
; z' j, g+ x( R5 _-O2与-O1相比,有更高的性能优化。增加了一些新的优化,并更改了优化的启发式方法。这是编译器可能生成矢量指令的第一个优化级别。它还会降低调试体验。% v% f: T9 Y! M! y

- T0 y/ E9 l" ~# m
9 B' T3 L8 H  A: h- d9 Y
-O2与-O1相比使用时的差异是:4 E% I5 v+ w% u" T! c1 c( p
% i" t! l" \% L

& R2 Z3 O; Z; P+ p编译器认为内联调用站点可获利的阈值可能会增加。
* Z2 e9 `( Y% v% X: J  @, R% M
+ Z1 @: s5 H& G% M$ U7 ^2 j" Z

5 }& R* K4 k) Z) _: z执行的循环展开数量可能会增加。, D& B$ v1 o* `% P  l, W
  S" Y( o% {3 ]. E0 h: H

( `- k# `4 ]! J# v" c可以为简单循环和独立标量运算的相关序列生成矢量指令。; p$ W- r6 n* w) h2 J! K0 K7 Z) W

6 F2 M2 |  x9 e: e: X9 J
6 V9 {! y% s. e* Q* h
可以使用armclang命令行选项禁止创建矢量指令-fno-vectorize。+ z8 J; b9 i0 J
* P6 Y2 Y$ W5 ?/ N5 A$ d' b/ C

# R% k' r- r/ O0 A5 P, v优化级别-O32 G* V6 T5 ^# m  \1 s) `1 _
-O3与-O2相比,有更高的性能优化。此优化级别允许进行需要大量编译时分析和资源的优化,并且与-O2相比更改了优化的启发式方法。-O3指示编译器针对生成的代码的性能进行优化,而忽略生成的代码的大小,这可能会导致代码大小增加。
' G- y! _& {1 P( {# z
% M: Y; K( M/ [9 H+ C7 @

" ?& c& q* v1 C4 y-O3与-O2相比使用时的差异是:3 u% c) Q4 q, v& W1 ?/ k

, J  D  Q7 |. ?) N/ B1 F. s

4 L, e/ `* p" ]" v  x, X编译器认为内联调用站点是有利可图的阈值增加。( \% Z* Z" x9 v6 K2 n+ Y/ c

" b. D, P: G: p! A6 G

: \; o* x$ n9 d6 V* P执行的循环展开量增加。
- c( t3 Q7 z' i# h1 K9 [( q5 m- D/ |
1 I% `4 n, L. D6 G; a. E1 G5 B$ K
在编译器管道中启用更积极的指令优化。& J, U% u- V* R! E4 Z, B

$ F" f5 X8 d3 C" U. z0 t% J% m

: b; }  S( |; R9 v" f/ Y* p优化级别-Os
  o( H! ^9 }7 k/ @$ [. O. j4 N-Os目的是在不显着增加代码大小的情况下提供高性能。根据你的应用程序,提供的性能可能类似于 -O2或-O3。6 f# j# u" ?8 {& U8 B  R$ {  L: y
1 s7 C# `& X7 L+ E4 T

1 l( E; q1 T3 d! I+ w8 z' d+ Z; D-Os与-O3相比,可减少代码大小。但会降低调试体验。
& \  Q/ S2 [6 h, O1 g- L
, l  o' @3 |2 t! A

- i: ?' [  `9 w3 F-Os与-O3相比使用时的差异是:
; h  I3 Q5 y! T4 F2 e; q! l" n* ~- ~% H0 U2 g' I5 M* u1 j
1 n6 p! O- Y: G& v: a6 E# h
降低编译器认为内联调用站点可获利的阈值。; b) A% [; P/ m; T9 C

0 H* W2 Q) d# o" `) h8 p/ L1 E
( q% X* P( Z: ]* W* n: i
显着降低了执行的循环展开量。6 k; Z+ L' D& g

0 n0 Z5 B* V% j

% N7 ?0 c) q5 y6 D  T优化级别-Oz! N5 A/ ~; f9 R: d3 Y3 `4 J
-Oz目的是提供尽可能小的代码量。Arm 建议使用此选项以获得最佳代码大小。此优化级别会降低调试体验。6 Y% I# n4 Q: ], t/ N  B4 s

" X  V( [% J. o; w; d
( _/ E, }: ~1 e
-Oz与-Os相比使用时的差异是:
6 L- ^8 w( A' G) I3 x9 u' L. g/ `1 x3 U, D0 B* E% _, @/ C

. s0 c6 r5 q2 e& g6 C1 B编译器仅针对代码大小进行优化,而忽略性能优化,这可能会导致代码变慢。
6 S0 t' T4 ~. j# _
  l6 y5 d4 W( G, g5 y

1 Z( v4 c$ v# |' H未禁用功能内联。在某些情况下,内联可能会整体上减少代码大小,例如,如果一个函数仅被调用一次。仅当预期代码大小会减小时,才将内联启发式方法调整为内联式。# q3 E- y% p+ g1 I8 X
4 w5 P+ V, t+ c4 p; |% [4 Y
1 H- B! G9 w( \1 E6 k7 V
禁用可能会增加代码大小的优化,例如循环展开和循环矢量化。/ c+ R5 R/ g4 `1 b

: I: g0 q5 w' Q# z( V$ v+ }

5 d$ }+ s; X& p1 k循环是作为while循环而不是do-while循环生成的。1 C/ F, |9 V. N: i# v, U; V& }

) ]5 {2 X. Y2 B; I6 P

9 J7 T) [8 N, _) @1 i/ d" {优化级别-Ofast
9 i, D9 G. [! Q* k1 L# F: V. d-Ofast从级别执行优化,包括使用 -ffast-math armclang选项执行的优化。# G' g; h, Q% L, A2 C
( ?0 n) Q* Z# l# U3 W. R

# q+ W- {; g" p* m$ W: U该级别还执行其他进一步的优化,可能会违反严格遵守语言标准的要求。  J) Z3 u7 A! W' m

: [' j9 |! ~/ ~; ^
! p2 G: w6 s" B8 p3 r
与-O3相比,该级别会降低调试体验,并可能导致代码大小增加。
, u# _8 ]2 n. |  P" J5 f% {
% l( O. G8 F) h0 ?0 B5 g% e
; l) F5 l! M7 ~1 A" S
优化级别-Omax8 p  m0 n( ]) y" Y8 E
-Omax是最大程度的优化,并专门针对性能优化。它支持从级别进行的所有优化,以及链接时间优化(LTO)。0 S) ]3 R  ]# w2 d1 A' q

( ~( M* ?! W+ A

# k* t) e6 E( s; \在此优化级别上,Arm Compiler可能会违反严格遵守语言标准的规定。使用此优化级别可获得最快的性能。% a: x. y% w& F) J9 {4 S+ R

" Y% P. ^5 p1 x/ R

0 P6 N  _8 x% u0 [1 H与-Ofast相比,该级别会降低调试体验,并可能导致代码大小增加。
# [: U( H8 \( [- f! G, Y0 r: @3 h# n
! R( Z4 _3 B" _2 A

4 f. D6 d: a9 p( X5 U8 Y如果你使用-Omax进行编译,并具有单独的编译和链接步骤,你还必须在armlink命令行中包括-Omax。
5 E8 O# ?$ ~* ?% z' W- |
. j8 I, \" s: w$ t( N
  I) S/ v' u$ s! Y& P
收藏 评论0 发布时间:2020-12-3 12:43

举报

0个回答

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版