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

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

[复制链接]
STMCU-管管 发布时间:2020-12-3 12:43
Keil MDK 编译器 AC5 和 AC6 优化选项重要内容和区别

* m# z( [8 N' s% A  j8 V
0 e5 U1 P& J5 e) r
使用过Keil MDK (Arm Compiler 6)编译器V6版本的读者应该发现了一个问题,V6版本速度比V5版本编译速度快很多。
& _6 y- L, W& I' ]( U8 c( |0 S9 M# Q' B
3 ^0 E) i6 b: T0 ]
(说明:是V6版本编译器,不是V6版本MDK)9 E. [) U; H3 @5 {
" ^1 H- x5 m' _8 Q. `
那你发现了Arm Compiler V6和V5有什么区别吗? 集成在MDK中的优化选项又有哪些区别?! E" \# r1 U; e: }% j; M1 K
2 I( o1 w6 p9 O7 |
一、关于Arm Compiler 6/ T$ y" ~$ x- `/ S

) G/ q' e  }* _" r+ G: v
) s( E$ n# D. u$ {* G( W
Arm Compiler 6(简称AC6)是用于Arm处理器的编译工具链,目前最新版本:Arm Compiler  V6.14。7 W1 }2 K* B/ [6 O% ^2 {* s
0 S! z: C. i4 o" G% u9 \% W
; o9 W$ U  T% I) u  H, Z, X
用于编译Coterx-M处理器的编译器很多,Arm Compiler就是其中一个,常用于Keil MDK、 Arm Development Studio(DS-5)中,还可用作独立工具链安装。$ h8 w# r( [9 a4 N' f3 G! T$ x# n
11.png
当然,除了Arm Compiler,针对Coterx-M的编译器还有很多,比如:GNU Compiler、 IAR Compiler、 CCS Compiler等。7 ?8 Y9 v& H. P

( M6 q1 K4 w4 {5 cArm Compiler 6工具链包括:
5 h' }  x% X$ Y' D* n' }4 o8 Darmclang:基于LLVM和Clang技术的编译器和集成汇编器。5 V, F3 i' ~4 {; w
armasm:armasm语法汇编代码的旧版汇编程序。将armclang集成汇编程序用于所有新的汇编文件。
- v# j# T1 U& E! Xarmar:使ELF目标文件集可以一起收集。
: U* i. ?: b( W* q% H) Oarmlink:将对象和库组合在一起以生成可执行文件的链接器。/ _) J+ Y4 [9 L" g1 ^9 h0 Z8 u
fromelf:镜像转换程序和反汇编程序。
" o* v  M" L: I' `Arm C libraries:嵌入式系统的运行时支持库。
8 W+ G" c: o, ?: ]( ]Arm C ++libraries:基于LLVM libc++项目的库。
4 Y7 T* Y! Q- u& _' J5 ~
12.png
ARM Compiler 5(和更早版本)使用armcc编译器,而ARM Compiler 6将armcc替换为armclang,armclang基于LLVM,它具有不同的命令行参数、指令等,因此算是一个新的编译器。
6 E5 Z5 d  Q7 c, ?) i
, z4 i1 v/ q) |; h' |) I/ C更多参考内容和地址:
, j2 x, n8 J( k6 c9 I) z9 A编译器Clang会代替GCC吗?
: z6 B  Q0 p3 h( a; O! G/ L9 S) o( J; f$ b* F( X3 r& F% r( ~. X

8 c4 n! \& C% X1 B6 a' Phttp://www2.keil.com/mdk5/compiler/6/
7 X: C$ J- l' K' C" G- J- x& M6 thttps://developer.arm.com/tools-and-software/embedded/arm-compiler/downloads/version-6( B; R# [5 |  C" M+ \

2 ^( d8 e# d* U
( v1 i4 x- W. L; O2 P$ v0 F
二、AC5和AC6
" r! q) T$ b, J' B- P: R. t2 p  ?4 \  I4 N4 K+ z- E$ n

' T# z* j$ z/ M; n$ k4 LArm Compiler 5(AC5)算是用的比较多的一代编译器,在Keil MDK V4版本及V5早期的版本都是使用AC5。+ d  |% g& @" ~9 ~( T* O7 O9 R2 e

9 H) i/ Q" ^1 ~' }9 X: z/ g在2015年的时候,AC6发布了,并在随后新版本的MDK中集成了AC6,直到现在最新版本的MDK集成了AC6.13(可以修改版本):
& I7 |$ c, x: O0 t- u
13.png
AC6相比AC5优势
$ M" Y% o! C1 E2 l' u0 ]4 o
3 b) k) n4 ?+ j1 Z' b: _
3 a. a: v9 i5 s& o. E5 r. B
AC6相比之前版本的编译器做了很多改动,大家最为直观的感受就是编译速度提高了很多,还有代码大小。
' c, r! f. D  r: G4 Q$ R
3 M+ a4 F: E' F& p& K* j: {, I6 m当然除了速度和大小,还有其他很多优势,比如:支持C ++ 14标准、使用TrustZone for Armv8-M为设备创建安全和非安全代码、兼容基于GCC创建的源代码,也就是GCC可以编译的源码它也能编译。
5 b; p* ]( M2 l: {3 n
0 C5 W1 ^0 X, d这是官方提供的代码大小对比:
* L1 X  J( @! G9 B
14.png
AC5升级到AC6
' p" h: E( X0 r, ^2 Z: ?* w4 z# h1 X9 k0 w& Q
+ i) k6 h2 l& b2 ?
AC5和AC6是不同的编译器,兼容性方面还是有差异,需要迁移。这个迁移过程官方提供有文档:, k* f) N5 E2 u7 Z4 h) z: a
/ G  O6 s. S3 P1 D  V* c. g
+ Q1 d  z& {" v0 Z; k. l4 k' S0 \
https://developer.arm.com/docs/100068/0614/migrating-from-arm-compiler-5-to-arm-compiler-6
1 H( c4 z4 F! `9 a! t9 O/ v( [; _$ {" l0 y
当然,也可以参看我之前分享的文章:
; r1 W) q- |/ J# {$ A$ _- E; i+ o2 T& Y

% {: x* R* x4 Q5 G1 xMDK-ARM编译器从V5升级到V6需要做哪些工作?
  M) O. u9 h; m
& S- g& X, [6 f8 ^, h& F4 b% _三、Keil MDK 优化选项
# C  c2 R) I' p, D5 a& j2 l
. B' J. D0 |% q

$ K& f! f6 ?* Q; X: `) d在Keil MDK中,相比AC5,使用AC6会增加几个优化选项:代码大小、速度、平衡等。
/ ]! a! I2 S% R4 U6 a6 C9 Q5 I! U6 u  ~1 J2 E5 y4 `' j. n
优化选项包含:
4 ^, C5 L  o: H3 |1 l# k$ U0 k( B3 H
15.png
优化级别-O0: b; ^6 U1 i" G8 ]/ S& E! Q

3 ]1 d& W! d& g! [. f

" E7 j" P4 w3 V8 q+ F% ^8 I-O0禁用所有优化。此优化级别是默认设置。使用-O0 结果可以加快编译和构建时间,但比其他优化级别生成的代码要慢。与-O0其他优化级别相比,代码大小和堆栈使用率明显更高 。生成的代码与源代码紧密相关,但是生成的代码量更大,包括无用的代码。% x  b9 L7 B0 \0 Q

8 n- @( r: e/ V

$ [7 I, q+ |! y( [; }3 E优化级别-O18 A9 b+ _0 O' M% A. b
-O1在编译器中启用核心优化。此优化级别提供了良好的调试体验,并具有比-O0更好的代码质量,堆栈使用率也提高了。Arm建议使用此选项以获得良好的调试体验。
3 N! C" B6 s9 Q  J0 y7 G, W7 |& a8 m& m
+ O* {7 c0 F* a; P9 T* `
-O1与-O0相比,使用时的区别是:) I5 P/ u. ]2 {; I& R, H; T0 h6 b
; K# p3 k3 M1 S( [" Z# g: A

8 ]+ b" n* T6 r1 H启用优化,这可能会降低调试信息的完整度。, Y7 ~0 @( {- G2 @! ], ~
4 g9 ]3 [5 F+ H0 g5 n, v% O

: I8 k* G8 ~) G2 c& W' V6 X启用了内联和尾调用,这意味着回溯可能无法提供打开功能激活的堆栈。! f  t$ ^2 S' B+ n# o6 {" r
5 T1 c# G9 B6 r1 n5 A
0 G4 P& @+ m# E
不会调用没有使用,或没有预期调用的函数,代码量更小。
$ E8 z6 ?) v2 `$ y/ [* R) ^3 ^4 D$ r3 T2 Q& M9 i
" x6 k8 m& L6 M. Q0 u* u4 b
变量的值在不使用后可能在其范围内不可用。例如,它们的堆栈位置可能已被重用。。8 \0 U! f- k8 X8 T4 U$ J

/ t, M. D# j0 U; L4 D

$ G5 q" P1 i( h; E; B. {优化级别-O23 I0 p! {$ K# h& i: `9 V2 `
-O2与-O1相比,有更高的性能优化。增加了一些新的优化,并更改了优化的启发式方法。这是编译器可能生成矢量指令的第一个优化级别。它还会降低调试体验。: ?( ]8 w2 J/ a$ }" {2 j! N7 k$ d

  T  S0 W1 n" y# k2 f6 b
, j" x: W9 f) v  T
-O2与-O1相比使用时的差异是:
5 h6 _  Z0 K* S" C" G, T/ z2 j8 _9 Z, L6 h( a3 N+ D( B% J3 j# m+ L" S

% B" t% j; h5 v" c: o* k# I编译器认为内联调用站点可获利的阈值可能会增加。
4 t& _6 c5 x+ x5 y: _( ~; O0 ~
( H7 T. H, Y0 G  |/ B

" i& Q) P# O8 G8 S执行的循环展开数量可能会增加。5 q/ l  C- O8 D% o$ p( V4 G

) g  I; r" A9 k% V2 R2 `
2 |& [' A, i# V$ Q- _: g' l; S* X
可以为简单循环和独立标量运算的相关序列生成矢量指令。* M& Z, t& K+ \! s; v3 x& X; r, r
/ r8 Q, \6 q  ^" F. _- H1 O6 H" I

9 x+ |  O$ z# n1 K( A, r可以使用armclang命令行选项禁止创建矢量指令-fno-vectorize。" r% K: |# q' J3 H8 |# e
9 _8 O: v& h3 l5 k) u8 l4 Q
4 N/ C  r$ s7 `+ C/ F
优化级别-O37 X. W4 D, }( c( x
-O3与-O2相比,有更高的性能优化。此优化级别允许进行需要大量编译时分析和资源的优化,并且与-O2相比更改了优化的启发式方法。-O3指示编译器针对生成的代码的性能进行优化,而忽略生成的代码的大小,这可能会导致代码大小增加。
2 E9 {( M+ i, o! d. g9 `# L- Q- m

6 V. b9 \8 m' _-O3与-O2相比使用时的差异是:9 }4 h8 k* {, J: n9 I: u
) A& L9 L7 ]5 w( S6 l

4 }& |  ~1 `+ ~( \% V. T2 ^编译器认为内联调用站点是有利可图的阈值增加。8 C* x6 q  Z3 ?/ ?! T9 X4 U8 A* F
1 n" _& Y$ k& H2 a

6 F! x( `3 Y  Z) q0 V* N执行的循环展开量增加。
$ V, _6 j9 u( d) e: U
! H3 M5 m" l! x8 G' M% u9 q
( Y4 T3 ?7 p) O2 b" L
在编译器管道中启用更积极的指令优化。/ A" x) h7 E" M2 ~
. B. r/ |: t% m) u$ @

$ ?6 K) ^$ E. W* m9 K优化级别-Os
* ^) f: L4 p" p* l. A# H( s- l+ o-Os目的是在不显着增加代码大小的情况下提供高性能。根据你的应用程序,提供的性能可能类似于 -O2或-O3。
4 b' a6 ?" N1 K4 Y9 E" @8 V
- Q, @5 P7 i: R. f" g( {
  }7 W( U+ {+ o4 }9 }9 _2 l
-Os与-O3相比,可减少代码大小。但会降低调试体验。9 B5 ]3 l0 M9 G. E$ L, L

  y, K7 q' p9 U9 o2 r
- I8 e* G8 Q! ~2 G4 S* j2 V' ]: e
-Os与-O3相比使用时的差异是:2 {7 v" _9 N8 I: T: d6 C

" L+ b; n- F4 D
5 D; B8 S8 o; E" u
降低编译器认为内联调用站点可获利的阈值。
4 E$ l% P: ]) N  Z  x, M- G
' r# A8 b: f+ t  f9 T1 A* N

/ b) O( s9 K: o+ N0 k显着降低了执行的循环展开量。
: |) F: B% _1 l7 |; v) y1 g3 R6 `% K* P7 o5 Y

" c& d9 |; `$ [* Y优化级别-Oz
$ O" K4 g( B4 T) M1 }* E-Oz目的是提供尽可能小的代码量。Arm 建议使用此选项以获得最佳代码大小。此优化级别会降低调试体验。
3 W' u" [8 q% d/ E3 w
6 o1 _3 E; ]. |# W! C5 w

$ b! }" i: j6 ~- S* s-Oz与-Os相比使用时的差异是:. D$ H; m" {4 \% K) X
4 ]9 P& k  V7 R* r3 v* f+ X
& d" v" Y$ W0 {8 w( ^, N
编译器仅针对代码大小进行优化,而忽略性能优化,这可能会导致代码变慢。
1 g( V. f3 A% S9 }8 l+ w+ ?$ h, v8 K3 }+ H
9 x( \% R3 m* h& l6 a8 b
未禁用功能内联。在某些情况下,内联可能会整体上减少代码大小,例如,如果一个函数仅被调用一次。仅当预期代码大小会减小时,才将内联启发式方法调整为内联式。- B& E" [& {) F9 I

5 d8 x, w- \- a) ?

/ R6 i; C- M0 W6 j* R( K禁用可能会增加代码大小的优化,例如循环展开和循环矢量化。2 g/ h& t( e/ v! W. m3 ?7 s) a/ Z

7 b7 F4 @/ R2 _3 n, p& H
+ E& z! j5 Q6 \
循环是作为while循环而不是do-while循环生成的。* h8 l4 r/ L( N  a5 @) s. D

8 w# i, L$ U: q: R- s

2 I+ p! G& c& t/ `优化级别-Ofast: z8 ?6 |9 d: G0 A: x' w& ]
-Ofast从级别执行优化,包括使用 -ffast-math armclang选项执行的优化。
# I: ?- x# e1 ^8 ^% C: A3 b7 E: C# W- V/ M- j

) q2 {* [+ O# o6 ?. _该级别还执行其他进一步的优化,可能会违反严格遵守语言标准的要求。
. D/ F$ s( @" b5 ^6 \
% R4 [+ g$ T( U' I7 v  \3 E

4 S7 O& h0 _% V8 C$ a1 F, \. I与-O3相比,该级别会降低调试体验,并可能导致代码大小增加。3 @9 F# @8 s" j" p8 f! g: S; J0 y
5 v+ \& t4 ~( t- a

, z% C' l4 {3 O3 ]# ]( o  B优化级别-Omax3 H! r+ W; ^, w* B6 l+ J8 X  O' ]
-Omax是最大程度的优化,并专门针对性能优化。它支持从级别进行的所有优化,以及链接时间优化(LTO)。
  ]. q! f' l4 [/ i( n0 b* A) ?. I7 s+ M# i9 N

9 q. m& m  ^. j! U  T, X1 s7 t0 S在此优化级别上,Arm Compiler可能会违反严格遵守语言标准的规定。使用此优化级别可获得最快的性能。
0 T5 b9 n- x- L
3 [6 l2 |  _/ [+ G
9 c- t: b: x7 r$ R
与-Ofast相比,该级别会降低调试体验,并可能导致代码大小增加。. |0 F( o# q7 @1 {  g

# x* S: r) m. L: k2 s& R
! g$ ]0 t0 z7 }/ R: J# m6 R! `
如果你使用-Omax进行编译,并具有单独的编译和链接步骤,你还必须在armlink命令行中包括-Omax。
3 l3 Q4 d; C, J( ^* K5 z8 Z4 |! [! H
( l3 C* L6 M& S8 d7 \, p: N4 v0 A1 S1 E0 D( I8 o
收藏 评论0 发布时间:2020-12-3 12:43

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版