0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Keil MDK優(yōu)化選項(xiàng)說(shuō)明

Dp1040 ? 來(lái)源:嵌入式專(zhuān)欄 ? 2023-11-20 10:21 ? 次閱讀

最近,看到群里的小伙伴在討論【我的代碼不按照流程執(zhí)行】相關(guān)的話(huà)題。這類(lèi)問(wèn)題,有經(jīng)驗(yàn)的工程師肯定能想到是什么原因?qū)е碌模蔷褪蔷幾g器把你代碼優(yōu)化了。

本文將圍繞Keil MDK優(yōu)化選項(xiàng),以及相關(guān)拓展知識(shí)(微庫(kù)、實(shí)際應(yīng)用、調(diào)試)進(jìn)行講述,希望能對(duì)你的項(xiàng)目開(kāi)發(fā)有所幫助。

一、概 述

我們所指的優(yōu)化,主要包括兩個(gè)方面:

代碼大?。⊿ize)

代碼性能(運(yùn)行時(shí)間)

在MDK-ARM中,優(yōu)化相關(guān)的配置選項(xiàng):

868aae92-8745-11ee-939d-92fbcf53809c.png

869512a6-8745-11ee-939d-92fbcf53809c.jpg

當(dāng)然,如果選擇編譯器(AC5、AC6)不同,優(yōu)化選項(xiàng)也有差異(下面講述)。

舉個(gè)例子:

某些項(xiàng)目MCU容量有限時(shí),你除了修改代碼(優(yōu)化開(kāi)支),同時(shí)你有必要使用優(yōu)化選項(xiàng)。

某些項(xiàng)目(比如某算法)需要高效(最短時(shí)間)運(yùn)行,此時(shí)有必要使用優(yōu)化選項(xiàng)。

二、優(yōu)化選項(xiàng)說(shuō)明

本節(jié)詳細(xì)講述了優(yōu)化相關(guān)選項(xiàng),同時(shí),編譯器選擇AC5和AC6時(shí)有差異,下面也會(huì)針對(duì)AC5和6分別講述。

1、Use Cross-Module Optimization:使用跨模塊優(yōu)化

使用跨模塊優(yōu)化可以啟用鏈接器反饋文件(進(jìn)行兩次編譯),從而允許進(jìn)一步的代碼優(yōu)化。

提示:

不針對(duì)庫(kù)目標(biāo)執(zhí)行跨模塊優(yōu)化;

跨模塊優(yōu)化將增加構(gòu)建項(xiàng)目所需的時(shí)間,因?yàn)闀?huì)自動(dòng)執(zhí)行多個(gè)編譯和鏈接步驟。

2、Use MicroLIB:使用微庫(kù)

它是ISO標(biāo)準(zhǔn)C運(yùn)行時(shí)庫(kù)的子集(其中一部分),提供了性能和代碼大小之間的權(quán)衡。

微庫(kù)并不完全兼容ANSI,但對(duì)于大多數(shù)小型嵌入式應(yīng)用程序來(lái)說(shuō),它已經(jīng)足夠了。

3、Use Link-Time Code Generation:使用鏈接時(shí)代碼生成(優(yōu)化)

在V5版本之前有這個(gè)優(yōu)化選項(xiàng),多文件編譯,鏈接時(shí)進(jìn)行優(yōu)化:

函數(shù)跨模塊內(nèi)聯(lián)

刪除未引用的變量和函數(shù)

通過(guò)重新排列變量?jī)?yōu)化內(nèi)存訪(fǎng)問(wèn)

在可能的情況下重用內(nèi)存

4、Execute-only Code:生成只執(zhí)行的代碼

不包含未使用(函數(shù)、變量等)代碼段。

僅限于:

C、Thumb代碼

基于Cortex-M3、M4的處理器

編譯器5.04以上

5、Optimize for Time:優(yōu)化時(shí)間

以更大的代碼大小為代價(jià),減少執(zhí)行時(shí)間,比如使用內(nèi)聯(lián)函數(shù)。

編譯器為AC6時(shí),此選項(xiàng)為【Link-Time Optimization】,在鏈接狀態(tài)下執(zhí)行模塊間優(yōu)化。

6、Split Load and Store Multiple:分割加載和多存儲(chǔ)

指示編譯器將LDM和STM指令拆分為兩個(gè)或多個(gè)LDM或STM指令,以減少延遲,此選項(xiàng)可以提高系統(tǒng)的總體性能。

7、The One ELF Section per Function:每個(gè)函數(shù)一個(gè)ELF段

ELF代碼段通常包含許多函數(shù)的代碼,此選項(xiàng)告訴編譯器將所有函數(shù)放入它們自己的ELF段,這允許鏈接器刪除未使用的ELF段(而不是未使用的函數(shù))。

8、AC5時(shí):Optimization優(yōu)化選項(xiàng)

默認(rèn)值,以?xún)?yōu)化性能為主。

Level 0 (-O0):關(guān)閉大部分優(yōu)化,除了一些簡(jiǎn)單的轉(zhuǎn)換,生成的代碼具有最佳的調(diào)試視圖。

Level 1 (-O1):應(yīng)用受限優(yōu)化。

比如:刪除未使用的內(nèi)聯(lián)函數(shù)和靜態(tài)函數(shù),刪除冗余代碼和重新排序指令等。生成的代碼經(jīng)過(guò)合理優(yōu)化,具有良好的調(diào)試視圖。

Level 2 (-O2):高度優(yōu)化,目標(biāo)代碼到源代碼的映射并不一定對(duì)應(yīng),因此,不利于調(diào)試。

Level 3 (-O3):最大級(jí)別優(yōu)化,級(jí)別3與時(shí)間優(yōu)化相結(jié)合可能生成比級(jí)別2更多的代碼。

9、AC6時(shí):Optimization優(yōu)化選項(xiàng)

當(dāng)編譯器選擇AC6時(shí),優(yōu)化選項(xiàng)有差異(有更多優(yōu)化選項(xiàng)):

869f0130-8745-11ee-939d-92fbcf53809c.jpg

AC6優(yōu)化選型中前面5項(xiàng)(default、-O0 ~ 3)和AC5的作用基本一樣,但AC6多了三個(gè)選項(xiàng)。

-Ofast:啟用-O3的所有優(yōu)化,以及其他可能違反語(yǔ)言標(biāo)準(zhǔn)(嚴(yán)格遵守)的優(yōu)化。

-Os balanced:平衡代碼大小與代碼速度。默認(rèn)情況下,編譯器執(zhí)行優(yōu)化以提高性能,但可能會(huì)增加image文件大小。

-Oz image size:優(yōu)化代碼大小。

三、如何優(yōu)化?

本節(jié)講述三種編譯優(yōu)化,使其達(dá)到最優(yōu)(代碼最小、性能最好):

代碼大小

代碼性能(速度)

代碼平衡(大小和速度)

1、優(yōu)化代碼大小

針對(duì)AC5編譯器:

Use MicroLIB

Use Cross-module optimization

Optimization:level 2 (-O2)

針對(duì)AC6編譯器:

Use MicroLIB

Optimization:-Oz image size

說(shuō)明:

代碼量大(ELF代碼段通常包含許多函數(shù)的代碼),可考慮使用The One ELF Section per Function選項(xiàng)減小代碼。

AC6編譯器改進(jìn)了優(yōu)化功能(可以理解為增加的3個(gè)選項(xiàng)集成了優(yōu)化功能)。

代碼優(yōu)化大?。▽?duì)比):

86a5d80c-8745-11ee-939d-92fbcf53809c.png

2、優(yōu)化代碼性能

針對(duì)AC5編譯器:

Use Cross-module optimization

Optimization:level 3 (-O3)

Optimize for Time

針對(duì)AC6編譯器:

Optimization:-Ofast

Link-Time Optimization

代碼優(yōu)化性能(對(duì)比):

86b487f8-8745-11ee-939d-92fbcf53809c.png

3、代碼平衡

這種情況下,在滿(mǎn)足代碼大小的同時(shí),我們應(yīng)盡量滿(mǎn)足性能。

這里其實(shí)就是一個(gè)相關(guān)平衡的關(guān)系,結(jié)合上面兩種優(yōu)化方式根據(jù)自己實(shí)際情況出發(fā),一般優(yōu)化考慮如下配置。

針對(duì)AC5編譯器:

Use Cross-module optimization

Optimization:level 3 (-O3)

Optimize for Time

針對(duì)AC6編譯器:

Optimization:-Os balanced

Link-Time Optimization

當(dāng)然,AC6中-Os balanced優(yōu)化選項(xiàng)更智能。

四、拓 展

Keil MDK的優(yōu)化功能需要結(jié)合項(xiàng)目實(shí)際情況進(jìn)行優(yōu)化。對(duì)一些項(xiàng)目能起到很大幫助作用,但優(yōu)化之后也可能帶來(lái)一些影響。

比如,使用高度優(yōu)化(-O1以上),可能會(huì)影響Debug調(diào)試(因?yàn)閮?yōu)化之后,編譯輸出和實(shí)際代碼不匹配)。

還有,指定源文件/文件組優(yōu)化。有些代碼不需要優(yōu)化,我們優(yōu)化指定的源文件/文件組就行。

86c52766-8745-11ee-939d-92fbcf53809c.jpg

本文轉(zhuǎn)載自嵌入式專(zhuān)欄

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 單片機(jī)
    +關(guān)注

    關(guān)注

    6023

    文章

    44376

    瀏覽量

    628342
  • 程序
    +關(guān)注

    關(guān)注

    115

    文章

    3720

    瀏覽量

    80356
  • keil
    +關(guān)注

    關(guān)注

    68

    文章

    1207

    瀏覽量

    166170
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4671

    瀏覽量

    67765
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1602

    瀏覽量

    48895

原文標(biāo)題:寫(xiě)個(gè)單片機(jī)程序,居然被優(yōu)化了!

文章出處:【微信號(hào):玩點(diǎn)嵌入式,微信公眾號(hào):玩點(diǎn)嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    keil MDK應(yīng)用技巧資料的分享

    、keil mdk的信號(hào)函數(shù) 6、keil mdk下如何設(shè)置非零初始化變量 7、keil mdk
    發(fā)表于 06-21 12:15

    Arm Keil MDK教程下載

    Arm Keil MDK教程下載
    發(fā)表于 06-14 07:21 ?366次下載

    KEIL MDK-Arm免費(fèi)下載

    KEIL MDK-Arm免費(fèi)下載
    發(fā)表于 09-17 15:29 ?441次下載

    編譯器_keil優(yōu)化選項(xiàng)問(wèn)題

    keil編譯器的優(yōu)化選項(xiàng)針對(duì)ARM,對(duì)STM32編譯的一些優(yōu)化的問(wèn)題
    發(fā)表于 02-25 14:18 ?3次下載

    Keil MDK V5.11版使用方法

    Keil MDK V5.11版使用的方法等等
    發(fā)表于 07-13 15:40 ?0次下載

    keil MDK-ARM下載入口

    keil MDK-ARM下載入口
    發(fā)表于 11-20 17:41 ?21次下載

    KEIL MDK簡(jiǎn)介,如何安裝KEIL MDK下載程序

    選擇安裝路徑。這里選擇的是F盤(pán),若讀者硬盤(pán)資源充裕,則建議安裝在C盤(pán),跑起來(lái)快些。這里有一點(diǎn)需要說(shuō)明的是:如果你之前安裝了keil c51環(huán)境,安裝keil mdk的時(shí)候可以安裝到同一
    的頭像 發(fā)表于 04-30 16:53 ?2.7w次閱讀
    <b class='flag-5'>KEIL</b> <b class='flag-5'>MDK</b>簡(jiǎn)介,如何安裝<b class='flag-5'>KEIL</b> <b class='flag-5'>MDK</b>下載程序

    KeilMDK-ARM)系列教程(五) _Configuration(Ⅰ)

    KeilMDK-ARM)系列教程(五)_Configuration(Ⅰ)
    的頭像 發(fā)表于 03-20 14:58 ?3978次閱讀
    <b class='flag-5'>Keil</b>(<b class='flag-5'>MDK</b>-ARM)系列教程(五) _Configuration(Ⅰ)

    KeilMDK-ARM)系列教程(二)_ 工具欄詳細(xì)說(shuō)明

    KeilMDK-ARM)系列教程(二)_工具欄詳細(xì)說(shuō)明
    的頭像 發(fā)表于 03-24 10:23 ?3946次閱讀
    <b class='flag-5'>Keil</b>(<b class='flag-5'>MDK</b>-ARM)系列教程(二)_ 工具欄詳細(xì)<b class='flag-5'>說(shuō)明</b>

    KeilMDK-ARM) 使用教程(三)_在線(xiàn)調(diào)試

    KeilMDK-ARM)使用教程(三)_在線(xiàn)調(diào)試
    的頭像 發(fā)表于 04-07 14:30 ?5334次閱讀
    <b class='flag-5'>Keil</b>(<b class='flag-5'>MDK</b>-ARM) 使用教程(三)_在線(xiàn)調(diào)試

    KeilMDK-ARM)使用教程 (二)_菜單

    KeilMDK-ARM)使用教程(二)_菜單
    的頭像 發(fā)表于 04-07 14:42 ?4095次閱讀
    <b class='flag-5'>Keil</b>(<b class='flag-5'>MDK</b>-ARM)使用教程 (二)_菜單

    Keil MDK的一個(gè)bug

    素材來(lái)源:Keil 編輯整理:strongerHuang 不知道還有多少人在繼續(xù)在使用Keil MDK做開(kāi)發(fā),或?qū)W習(xí),猜的沒(méi)錯(cuò)的話(huà),應(yīng)該還是有不少人任然在使用MDK。 前面有個(gè)讀者給我
    的頭像 發(fā)表于 10-19 15:26 ?2305次閱讀
    <b class='flag-5'>Keil</b> <b class='flag-5'>MDK</b>的一個(gè)bug

    Keil MDK和IAR EARM的發(fā)展歷程及歷史版本下載

    Keil 和 IAR算是一代經(jīng)典的IDE工具,之所以這么多人使用,除了工具比較好之外,他們的發(fā)展歷史比較長(zhǎng)也是一個(gè)原因。 下面來(lái)描述一下Keil MDK 和 IAR EARM發(fā)展歷程及歷史版本下載
    的頭像 發(fā)表于 12-31 10:01 ?5000次閱讀

    Keil C51和Keil MDK下載

    Keil C51和Keil MDK下載
    發(fā)表于 12-03 20:21 ?96次下載
    <b class='flag-5'>Keil</b> C51和<b class='flag-5'>Keil</b> <b class='flag-5'>MDK</b>下載

    為MindSDK搭建Keil MDK開(kāi)發(fā)環(huán)境

    本文介紹基于Windows操作系統(tǒng)構(gòu)建嵌入式系統(tǒng)開(kāi)發(fā)環(huán)境過(guò)程中需要使用的主要軟件Keil MDK,并對(duì)一些需要特別關(guān)注的要點(diǎn)重點(diǎn)說(shuō)明。Keil MD
    的頭像 發(fā)表于 05-04 10:42 ?1408次閱讀
    為MindSDK搭建<b class='flag-5'>Keil</b> <b class='flag-5'>MDK</b>開(kāi)發(fā)環(huán)境