許多朋友使用MDK-ARM很長時間,卻不知它的優(yōu)化選項到底該有什么用,或者說到底該如何使用。 本文圍繞MDK-ARM優(yōu)化選項,以及相關(guān)拓展知識(微庫、實際應(yīng)用、調(diào)試)進行講述,希望對你今后開發(fā)項目有所幫助。
1總述
我們所指的優(yōu)化,主要兩方面:
代碼大小(Size)
代碼性能(運行時間)
在MDK-ARM中,優(yōu)化相關(guān)的配置選項:
當然,如果選擇編譯器(AC5、AC6)不同,優(yōu)化選項也有差異(下面講述)。 舉例:某些項目MCU容量有限時,你除了修改代碼(優(yōu)化開支),同時你有必要使用優(yōu)化選項。 某些項目(比如某算法)需要高效(最短時間)運行,此時有必要使用優(yōu)化選項。
2優(yōu)化選項說明
本節(jié)詳細講述優(yōu)化相關(guān)選項,同時,編譯器選擇AC5和AC6時有差異,下面也會針對AC5和6分別講述。
1.Use Cross-Module Optimization:使用跨模塊優(yōu)化使用跨模塊優(yōu)化可以啟用鏈接器反饋文件(進行兩次編譯),從而允許進一步的代碼優(yōu)化。
提示:A.不針對庫目標執(zhí)行跨模塊優(yōu)化。 B.跨模塊優(yōu)化將增加構(gòu)建項目所需的時間,因為會自動執(zhí)行多個編譯和鏈接步驟。 2.Use MicroLIB:使用微庫它是ISO標準C運行時庫的子集(其中一部分),提供了性能和代碼大小之間的權(quán)衡。 微庫并不完全兼容ANSI,但對于大多數(shù)小型嵌入式應(yīng)用程序來說已經(jīng)足夠了。 3.Use Link-Time Code Generation:使用鏈接時代碼生成(優(yōu)化)在V5版本之前有這個優(yōu)化選項,多文件編譯,鏈接時進行優(yōu)化:
函數(shù)跨模塊內(nèi)聯(lián)
刪除未引用的變量和函數(shù)
通過重新排列變量優(yōu)化內(nèi)存訪問
在可能的情況下重用內(nèi)存
4.Execute-only Code:生成只執(zhí)行的代碼不包含未使用(函數(shù)、變量等)代碼段。 僅限于:
C、Thumb代碼
基于Cortex-M3、M4的處理器
編譯器5.04以上
5.Optimize for Time:優(yōu)化時間以更大的代碼大小為代價,減少執(zhí)行時間。比如:使用內(nèi)聯(lián)函數(shù)。 編譯器為AC6時,此選項為【Link-Time Optimization】,在鏈接狀態(tài)下執(zhí)行模塊間優(yōu)化。 6.Split Load and Store Multiple:分割加載和多存儲指示編譯器將LDM和STM指令拆分為兩個或多個LDM或STM指令,以減少延遲,此選項可以提高系統(tǒng)的總體性能。 7.The One ELF Section per Function:每個函數(shù)一個ELF段ELF代碼段通常包含許多函數(shù)的代碼,此選項告訴編譯器將所有函數(shù)放入它們自己的ELF段,這允許鏈接器刪除未使用的ELF段(而不是未使用的函數(shù))。
8.AC5時:Optimization優(yōu)化選項:默認值,以優(yōu)化性能為主。 Level 0 (-O0):關(guān)閉大部分優(yōu)化,除了一些簡單的轉(zhuǎn)換,生成的代碼具有最佳的調(diào)試視圖。 Level 1 (-O1):應(yīng)用受限優(yōu)化。 比如:刪除未使用的內(nèi)聯(lián)函數(shù)和靜態(tài)函數(shù),刪除冗余代碼和重新排序指令等。生成的代碼經(jīng)過合理優(yōu)化,具有良好的調(diào)試視圖。 Level 2 (-O2):高度優(yōu)化,目標代碼到源代碼的映射并不一定對應(yīng),因此,不利于調(diào)試。 Level 3 (-O3):最大級別優(yōu)化,級別3與時間優(yōu)化相結(jié)合可能生成比級別2更多的代碼。 9.AC6時:Optimization優(yōu)化選項當編譯器選擇AC6時,優(yōu)化選項有差異(有更多優(yōu)化選項):
AC6優(yōu)化選型中前面5項(default、-O0 ~ 3)和AC5的作用基本一樣,但AC6多了三個選項。 -Ofast:啟用-O3的所有優(yōu)化,以及其他可能違反語言標準(嚴格遵守)的優(yōu)化。 -Os balanced:平衡代碼大小與代碼速度。默認情況下,編譯器執(zhí)行優(yōu)化以提高性能,但可能會增加image文件大小。 -Oz image size:優(yōu)化代碼大小。
3如何優(yōu)化?
本節(jié)講述三種編譯優(yōu)化,使其達到最優(yōu)(代碼最小、性能最好)
代碼大小
代碼性能(速度)
代碼平衡(大小和速度)
1.優(yōu)化代碼大小針對AC5編譯器:
Use MicroLIB
Use Cross-module optimization
Optimization:level 2 (-O2)
針對AC6編譯器:
Use MicroLIB
Optimization:-Oz image size
說明:A.代碼量大(ELF代碼段通常包含許多函數(shù)的代碼),可考慮使用The One ELF Section per Function選項減小代碼。 B.AC6編譯器改進了優(yōu)化功能(可以理解為增加的3個選項集成了優(yōu)化功能)。 代碼優(yōu)化大小(對比):
2.優(yōu)化代碼性能針對AC5編譯器:
Use Cross-module optimization
Optimization:level 3 (-O3)
Optimize for Time
針對AC6編譯器:
Optimization:-Ofast
Link-Time Optimization
代碼優(yōu)化性能(對比):
3.代碼平衡這種情況下,在滿足代碼大小的同時,我們應(yīng)盡量滿足性能。 這里其實就是一個相關(guān)平衡的關(guān)系,結(jié)合上面兩種優(yōu)化方式根據(jù)自己實際情況出發(fā),一般優(yōu)化考慮如下配置。 針對AC5編譯器:
Use Cross-module optimization
Optimization:level 3 (-O3)
Optimize for Time
針對AC6編譯器:
Optimization:-Os balanced
Link-Time Optimization
當然,AC6中-Os balanced優(yōu)化選項更智能。
4拓展說明
MDK-ARM的優(yōu)化功能需要結(jié)合項目實際情況進行優(yōu)化。對一些項目能起到很大幫助作用,但優(yōu)化之后也可能帶來一些影響。
1.使用高度優(yōu)化(-O1以上),可能會影響Debug調(diào)試(因為優(yōu)化之后,編譯輸出和實際代碼不匹配)。
2.指定源文件/文件組優(yōu)化
有些代碼不需要優(yōu)化,我們優(yōu)化指定的源文件/文件組就行。
-
ARM
+關(guān)注
關(guān)注
134文章
9087瀏覽量
367390 -
代碼
+關(guān)注
關(guān)注
30文章
4780瀏覽量
68527 -
MDK
+關(guān)注
關(guān)注
4文章
209瀏覽量
32063
發(fā)布評論請先 登錄
相關(guān)推薦
評論