IAR單片機(jī)編程軟件高級(jí)篇,IAR單片機(jī)編程軟件編譯優(yōu)化過(guò)程
單片機(jī)編程軟件是單片機(jī)開發(fā)不可缺少的工具之一,目前市場(chǎng)流通的單片機(jī)編程軟件主要為IAR單片機(jī)編程軟件和KEIL單片機(jī)編程軟件。本文中,將為大家講解IAR單片機(jī)編程軟件編譯優(yōu)化問(wèn)題,一起來(lái)了解下吧。
一、編譯優(yōu)化選項(xiàng)
在iar中可以設(shè)置代碼的編譯優(yōu)化等級(jí),在工程名上右鍵選Options...,在彈框中選C/C++ Compiler--Optimizations,如下圖所示。
左邊的level里面是優(yōu)化等級(jí),右邊的是附加選項(xiàng)。如果不想往下看了又有bug體質(zhì),就把這里的level選到None上面,點(diǎn)擊OK。
二、優(yōu)化還是不優(yōu)化
優(yōu)化的目的簡(jiǎn)單來(lái)說(shuō)主要有兩個(gè),減少代碼量和提高程序運(yùn)行效率。隨之而來(lái)的是什么呢?如果編譯器誤認(rèn)為你寫的延時(shí)是“低效率”代碼,如果編譯器認(rèn)為某些變量的生命周期可以提前結(jié)束了,如果編譯器認(rèn)為某些變量你定義了沒(méi)有使用就是沒(méi)用,就會(huì)原地爆炸了。
所以還是有必要搞明白,優(yōu)化到底優(yōu)化了什么,才能決定要不要優(yōu)化。
三、IAR優(yōu)化了什么
1.None
有最好的debug支持,變量的生命周期會(huì)貫穿它的整個(gè)作用域,也就是說(shuō)編譯器不做任何優(yōu)化,只要是變量的作用域,這個(gè)變量就是有效的。
最直觀的的體現(xiàn)就是可以在live watch中查看該變量,如果它被優(yōu)化了,就查看不了了。
2.Low
仍然是具備調(diào)試支持的,優(yōu)化的是變量的生命周期,如果一個(gè)變量沒(méi)有作用了,后面不會(huì)用到它了,就會(huì)把它優(yōu)化掉,不讓它貫穿它的整個(gè)生命周期。
這有什么好處呢?這個(gè)變量不存在了,就意味著寄存器的壓力減小了很多,可以騰出更多空間給更有需要的變量。
3.Medium
除了上述優(yōu)化以外,還加入了很多新的優(yōu)化。
· Live-dead analysis and optimization
代碼是否可用的分析和優(yōu)化
· Dead code elimination
無(wú)用的代碼清除。
· Redundant label elimination
冗余標(biāo)簽消除
· Redundant branch elimination
冗余分支清除,所以可能出現(xiàn)由于對(duì)變量和分支的共同優(yōu)化,導(dǎo)致某些條件分支明明成立卻始終不會(huì)進(jìn)入,一個(gè)大坑。
· Code hoisting
代碼提升,很難理解的名字,其實(shí)就是它字面意思,就是把某些代碼(變量定義)提到作用域的頂部去,可笑的是定義的順序不變。也就是說(shuō),你定義了全局變量a=1,然后在某個(gè)函數(shù)里輸出a,在下面定義局部變量a=2,最后輸出的結(jié)果是亂碼或者0,這取決于局部變量的默認(rèn)初始化的值。在函數(shù)里真正被輸出的,不是全局變量的a,而是局部變量的a,但是這個(gè)a只做了定義,初始化還在原位置。
· Peephole optimization
窺孔優(yōu)化,通俗點(diǎn)說(shuō)是局部?jī)?yōu)化,編譯器對(duì)部分編譯的代碼,結(jié)合目標(biāo)CPU的指令特點(diǎn),做一些認(rèn)為可以提高性能的優(yōu)化。
· Some register content analysis and optimization
寄存器內(nèi)容分析與優(yōu)化
· Static clustering
靜態(tài)聚類。將在同一模塊內(nèi)定義的靜態(tài)變量和全局變量布置成使得在相同函數(shù)中訪問(wèn)的變量彼此緊密地存儲(chǔ)。這使得編譯器可以為多個(gè)訪問(wèn)使用相同的基指針。
· Common subexpression elimination
公共子表達(dá)式消去,在編程中會(huì)有很多地方使用相似的表達(dá)式,比如:
a=b+c+d;
e=b+c+f;
這個(gè)時(shí)候可以優(yōu)化成這樣:
tem=b+c;
a=tem+d;
e=tem+f;
4.High
最高程度的優(yōu)化。具備以上所有的優(yōu)化之外,還有:
· Instruction scheduling
指令調(diào)度,編譯器根據(jù)自己的指令調(diào)度器去重新安排指令,使得處理器運(yùn)行時(shí)出現(xiàn)的資源沖突情況更少,從而減少資源沖突引起的卡頓情況。
· Cross jumping
交叉跳躍
· Advanced register content analysis and optimization
高級(jí)寄存器內(nèi)容分析與優(yōu)化
· Loop unrolling
循環(huán)展開。有一些小的循環(huán)體,在編譯時(shí)就能確定其循環(huán)次數(shù),編譯器會(huì)啟發(fā)式得試探是否將這個(gè)循環(huán)體復(fù)制展開,展開循環(huán)體能減少程序的迭代次數(shù),從而加快程序的運(yùn)行速度,但會(huì)增加代碼的大小。
編譯器會(huì)從速度和代碼大小之間去找一個(gè)平衡點(diǎn),優(yōu)化速度和優(yōu)化代碼大小那個(gè)配置就會(huì)影響這個(gè)優(yōu)化。
· Function inlining
函數(shù)內(nèi)聯(lián)
如果一個(gè)比較小的函數(shù)在編譯時(shí)已經(jīng)能確定其準(zhǔn)確的定義了,編譯器會(huì)決定將其內(nèi)聯(lián)到調(diào)用者的內(nèi)部,這樣就會(huì)減小函數(shù)調(diào)用的開銷。
· Code motion
代碼移動(dòng)。對(duì)循環(huán)不變的表達(dá)式和公共子表達(dá)式進(jìn)行移動(dòng),避免其被再次評(píng)估。這個(gè)優(yōu)化會(huì)減小程序代碼體積,加快執(zhí)行速度。
· Type-based alias analysis
基于類型的別名分析。多個(gè)指針指向同一塊內(nèi)存,可以互相稱之為內(nèi)存的別名,因?yàn)檫@種情況會(huì)導(dǎo)致優(yōu)化變得很困難,因?yàn)榫幾g的時(shí)候不知道內(nèi)存是否存在。所以編譯器采用假設(shè)按照定義的類型分配了內(nèi)存去編譯優(yōu)化。
說(shuō)明:上面有些優(yōu)化,可以在iar中配置是否要使用。
高級(jí)別的優(yōu)化選項(xiàng)回增加代碼編譯的時(shí)間,并且會(huì)在調(diào)試的時(shí)候出現(xiàn)一些困難,比如有時(shí)候想在某個(gè)位置打斷點(diǎn)卻發(fā)現(xiàn)打不上,因?yàn)槟抢锏拇a已經(jīng)被優(yōu)化掉了,有時(shí)候想看某些變量的值,卻發(fā)現(xiàn)live watch顯示這個(gè)變量無(wú)法查看,也是被優(yōu)化掉了。
以上便是小編此次帶來(lái)的“單片機(jī)編程軟件”相關(guān)內(nèi)容,希望大家喜歡。