當(dāng)前位置:首頁 > 嵌入式 > 嵌入式教程
[導(dǎo)讀]淺析嵌入式程序設(shè)計中的優(yōu)化問題

    嵌入式系統(tǒng)由于受功耗、成本和體積等因素的制約,嵌入式微處理器的處理能力與桌面系統(tǒng)處理器相比也存在較大差距,故嵌入式系統(tǒng)對程序運(yùn)行的空間和時間要求更為苛刻。通常,需要對嵌入式應(yīng)用程序進(jìn)行性能優(yōu)化,以滿足嵌入式應(yīng)用的性能需求。

1 嵌入式程序優(yōu)化的類型
   
嵌入式應(yīng)用程序優(yōu)化,指在不改變程序功能的情況下,通過修改原來程序的算法、結(jié)構(gòu),并利用軟件開發(fā)工具對程序進(jìn)行改進(jìn),使修改后的程序運(yùn)行速度更高或代碼尺寸更小。

    按照優(yōu)化的側(cè)重點(diǎn)不同,程序優(yōu)化可分為運(yùn)行速度優(yōu)化和代碼尺寸優(yōu)化。運(yùn)行速度優(yōu)化是指在充分掌握軟硬件特性的基礎(chǔ)上,通過應(yīng)用程序結(jié)構(gòu)調(diào)整等手段來縮短完成指定任務(wù)所需的運(yùn)行時間;代碼尺寸優(yōu)化則是指應(yīng)用程序在能夠正確實(shí)現(xiàn)所需功能的前提下,盡可能減小程序的代碼量。實(shí)際應(yīng)用中,這兩者往往是相互矛盾的,為了提高程序運(yùn)行速度,就要以增加代碼量為代價;而為了減小程序代碼尺寸,可能又要以降低程序運(yùn)行速度為代價。因此,在對程序進(jìn)行優(yōu)化之前,應(yīng)根據(jù)實(shí)際需要來制定具體的優(yōu)化策略。隨著計算機(jī)和微電子技術(shù)的不斷發(fā)展,存儲空間已不再是制約嵌入式系統(tǒng)的主要因素,因此本文主要討論運(yùn)行速度優(yōu)化。

2 嵌入式程序優(yōu)化遵循的原則
   
嵌入式程序優(yōu)化主要遵循以下3個原則。
    ①等效原則:優(yōu)化前后程序?qū)崿F(xiàn)的功能一致。
    ②有效原則:優(yōu)化后要比優(yōu)化前運(yùn)行速度快或占用存儲空間小,或二者兼有。
    ③經(jīng)濟(jì)原則:優(yōu)化程序要付出較小的代價,取得較好的結(jié)果。

3 嵌入式程序優(yōu)化的主要方面
   
嵌入式程序的優(yōu)化分為3個方面:算法和數(shù)據(jù)結(jié)構(gòu)優(yōu)化、編譯優(yōu)化以及代碼優(yōu)化。

3.1 算法和數(shù)據(jù)結(jié)構(gòu)優(yōu)化

    算法和數(shù)據(jù)結(jié)構(gòu)是程序設(shè)計的核心所在,算法的好壞在很大程度上決定了程序的優(yōu)劣。為了實(shí)現(xiàn)某種功能,通常可以采用多種算法,不同算法的復(fù)雜度和效率差別很大。選擇一種高效的算法或?qū)λ惴ㄟM(jìn)行優(yōu)化,可以使應(yīng)用程序獲得更高的優(yōu)化性能。例如:在數(shù)據(jù)搜索時,二分查找法要比順序查找法快。遞歸程序需要大量的過程調(diào)用,并在堆棧中保存所有返回過程的局部變量,時間效率和空間效率都非常低;若根據(jù)實(shí)際情況對遞歸程序采用迭代、堆棧等方法進(jìn)行非遞歸轉(zhuǎn)換,則可大幅度提高程序的性能。

    數(shù)據(jù)結(jié)構(gòu)在程序的設(shè)計中也占有重要的地位。例如:如果在一些無序的數(shù)據(jù)中多次進(jìn)行插入、刪除數(shù)據(jù)項操作,那么采用鏈表結(jié)構(gòu)就會比較快。

    算法和數(shù)據(jù)結(jié)構(gòu)優(yōu)化是首選的優(yōu)化技術(shù)。

3.2 編譯優(yōu)化
   
現(xiàn)在,很多的編譯器都具有一定的代碼優(yōu)化功能。在編譯時,借用并行程序設(shè)計技術(shù),進(jìn)行相關(guān)性分析;獲得源程序的語義信息,采用軟件流水線、數(shù)據(jù)規(guī)劃、循環(huán)重構(gòu)等技術(shù),自動進(jìn)行一些與處理器體系無關(guān)的優(yōu)化,生成高質(zhì)量的代碼。許多編譯器有不同級別的優(yōu)化選項,可以選用一種合適的優(yōu)化方式。通常情況下,如果選用了最高級別的優(yōu)化方式,那么編譯器將片面追求代碼的優(yōu)化,有時會導(dǎo)致錯誤。

    另外,還有一些專用的編譯器針對某些體系結(jié)構(gòu)進(jìn)行了優(yōu)化設(shè)計,可以充分利用硬件資源來生成高質(zhì)量的代碼。例如:Microsoft eMbedded Visual C++版的Intel編譯器完全針對Intel XScale體系,經(jīng)過高度優(yōu)化,能創(chuàng)建運(yùn)行速度更快的代碼。此編譯器采用了多種優(yōu)化技術(shù),包括優(yōu)化指令管道操作的調(diào)度技術(shù)、雙重加載與存儲Intel XScale技術(shù)功能支持以及過程間優(yōu)化(將函數(shù)使用的變量存放到寄存器,以便快速訪問)等。

    在嵌入式軟件開發(fā)過程中應(yīng)選擇一種優(yōu)化能力強(qiáng)的編譯器,充分利用其代碼優(yōu)化功能,生成高效的代碼,提高程序的運(yùn)行效率。

3.3 代碼優(yōu)化
   
代碼優(yōu)化,就是采用匯編語言或更精簡的程序代碼來代替原有的代碼,使編譯后的程序運(yùn)行效率更高。編譯器可以自動完成程序段和代碼塊范圍內(nèi)的優(yōu)化,但很難獲取程序語義信息、算法流程和程序運(yùn)行狀態(tài)信息,因而需要編程人員進(jìn)行手工優(yōu)化。以下是一些常用的優(yōu)化技術(shù)和技巧。

(1)代碼替換

    使用周期短的指令代替周期長的指令,以降低運(yùn)算的強(qiáng)度。
    ①減少除法運(yùn)算。用關(guān)系運(yùn)算符兩邊乘除數(shù)避免除法操作,還有一些除法和取模的運(yùn)算可以用位操作來代替。因為位操作指令只需一個指令周期,而“/”運(yùn)算則需要調(diào)用子程序,代碼長,執(zhí)行慢。例如:
    優(yōu)化前if((a/b)>c)和a=a/4
    優(yōu)化后if(a>(b*c))和a=a>>2
    ②減少乘方運(yùn)算。例如:
    優(yōu)化前a=pow(a,3.0)
    優(yōu)化后a=a*a*a
    ③使用白加、自減指令。例如:
    優(yōu)化前a=a+1、a=a-l
    優(yōu)化后a++、a--或inc、dec
    ④盡量使用小的數(shù)據(jù)類型。在所定義的變量滿足使用要求的條件下,優(yōu)先使用順序為:字符型(char)>整型(im)>長整型(long int)>浮點(diǎn)型(float)。
    對除法來說,使用無符號數(shù)比有符號數(shù)會有更高的效率。在實(shí)際調(diào)用中,盡量減少數(shù)據(jù)類型的強(qiáng)制轉(zhuǎn)換;少用浮點(diǎn)運(yùn)算,如果運(yùn)算的結(jié)果能夠控制在誤差之內(nèi),則可用長整型代替浮點(diǎn)型。

(2)全局變量與局部變量

    少用全局變量,多用局部變量。全局變量是放在數(shù)據(jù)存儲器中的,定義了全局變量,MCU就少了一個可以利用的數(shù)據(jù)存儲器空間,太多的全局變量,會導(dǎo)致編譯器無足夠的內(nèi)存分配;而局部變量則大多定位于MCU內(nèi)部的寄存器中。在絕大多數(shù)的MCU中,使用寄存器的操作速度比數(shù)據(jù)存儲器快,指令也更靈活,有利于生成質(zhì)量更高的代碼,而且局部變量所占用的寄存器和數(shù)據(jù)存儲器在不同的模塊中可以重復(fù)利用。

(3)使用寄存器變量

    當(dāng)一個變量被頻繁讀/寫時,需要反復(fù)訪問內(nèi)存,花費(fèi)大量的存取時間。為了提高訪問效率,可以使用CPU寄存器變量,不需要訪問內(nèi)存,直接進(jìn)行讀/寫。循環(huán)次數(shù)較多的循環(huán)控制變量及循環(huán)體內(nèi)反復(fù)使用的變量均可定義為寄存器變量,而循環(huán)計數(shù)是應(yīng)用寄存器變量的最佳選擇。只有局部自動變量和形參才可以定義為寄存器變量。因為寄存器變量屬于動態(tài)存儲方式,因此凡需要采用靜態(tài)存儲方式的變量都不能定義為寄存器變量。寄存器變量的說明符是register。下面是一個采用寄存器變量的例子:

   
(4)減少或避免執(zhí)行耗時的操作
    應(yīng)用程序的大量運(yùn)行時問通常花費(fèi)在關(guān)鍵程序模塊,關(guān)鍵模塊往往包含循環(huán)或嵌套循環(huán)。減少循環(huán)中耗時的操作,可以提高程序的執(zhí)行速度。常見的耗時操作有:輸入/輸出操作、文件訪問、圖形界面操作和系統(tǒng)調(diào)用等。其中,如果無法避免文件的讀/寫,那么對文件的訪問將是影響程序運(yùn)行速度的一大因素。提高文件訪問速度的方法有兩種:一種是采用內(nèi)存映射文件;另一種是使用內(nèi)存緩存。

(5)switch語句用法的優(yōu)化

    編程時,對case值按照可能性排序,將最可能發(fā)生的情況放在第一個,最不可能的情況放在最后一個,可以提高switch語句塊的執(zhí)行速度。

(6)循環(huán)體的優(yōu)化

    循環(huán)體是程序設(shè)計和優(yōu)化的重點(diǎn),對于一些不需要循環(huán)變量參加運(yùn)算的模塊,可以把它放到循環(huán)的外面。對于次數(shù)固定的循環(huán)體,for循環(huán)比while循環(huán)效率更高,減計數(shù)循環(huán)比增計數(shù)循環(huán)速度快。例如:

   
    實(shí)際運(yùn)行時,每次循環(huán)需要在循環(huán)體外加兩條指令:一條減法指令(減少循環(huán)計數(shù)值)和一條條件分支指令。這些指令稱為“循環(huán)開銷”。在ARM處理器上,減法指令需要1個周期,條件分支指令需要3個周期,這樣每個循環(huán)另加了4個周期的開銷??梢圆捎醚h(huán)展開的方法來提高循環(huán)運(yùn)行的速度,即:重復(fù)循環(huán)主題多次,并按同樣的比例減少循環(huán)次數(shù)來減小循環(huán)的開銷,以增加代碼尺寸。來換取程序的運(yùn)行速度。。

(7)函數(shù)調(diào)用

    高效的調(diào)用函數(shù),盡量限制使用函數(shù)的參數(shù)個數(shù),不要超過4個。ARM調(diào)用時,4個以下的形參通過寄存器傳遞,第5個以上的形參通過存儲器棧傳遞。如果有更多的參數(shù)調(diào)用,則可將相關(guān)的參數(shù)組織在一個結(jié)構(gòu)體內(nèi),用傳遞結(jié)構(gòu)體指針來代替參數(shù)。

(8)內(nèi)聯(lián)函數(shù)和內(nèi)嵌匯編

    對性能影響大的重要函數(shù)可以使用關(guān)鍵字_inline內(nèi)聯(lián),會省去調(diào)用函數(shù)的開銷,負(fù)面影響是增加了代碼尺寸。程序中對時間要求苛刻的部分可以用內(nèi)嵌匯編來編寫,通??梢詭硭俣壬系娘@著提高。

(9)查表代替計算

    在程序中盡量不進(jìn)行非常復(fù)雜的運(yùn)算,如浮點(diǎn)數(shù)的開方。對于這些消耗時間和資源的運(yùn)算,可以采用空間換取時間的方法。預(yù)先將函數(shù)值計算出來,置于程序存儲區(qū)中,以后程序運(yùn)行時直接查表即可,減小了程序執(zhí)行過程中重復(fù)計算的工作量。

(10)使用針對硬件優(yōu)化的函數(shù)庫

    Intel公司為XScale處理器設(shè)計的GPP(Graphics Performance Primitives library)/IPP(Integrated Perform-ance Primitives library)庫,針對多媒體處理、圖形處理和數(shù)值運(yùn)算的一些典型操作和算法進(jìn)行了手工優(yōu)化,可以很好地發(fā)揮XScale硬件的計算潛能,達(dá)到很高的執(zhí)行效率。

(11)利用硬件特性

    為了提高程序的運(yùn)行效率,要充分利用硬件特性來減小其運(yùn)行開銷,例如減少中斷次數(shù)、利用DMA傳輸方式等。

    CPU對各種存儲器的訪問速度排序依次為:CPU內(nèi)部RAM>外部同步RAM>外部異步RAM>Flash/ROM。對于已經(jīng)燒錄在Flash或ROM中的程序代碼,如果讓CPU直接從中讀取代碼執(zhí)行,運(yùn)行速度較慢,則可在系統(tǒng)啟動后將Flash或ROM中的目標(biāo)代碼拷貝至RAM中后執(zhí)行,以提高程序的運(yùn)行速度。

4 結(jié)論
   
嵌入式程序的性能優(yōu)化與軟件的開發(fā)周期、開發(fā)成本、軟件的可讀性之聞通常存在矛盾。要權(quán)衡利弊,作出折中的選擇。將算法和數(shù)據(jù)結(jié)構(gòu)優(yōu)化作為首選優(yōu)化技術(shù);然后根據(jù)功能、性能差異和投資預(yù)算等因素選擇高效的編譯器、系統(tǒng)運(yùn)行庫和圖形庫;使用性能監(jiān)測工具偵測占主要運(yùn)行時間的程序熱點(diǎn),采用代碼優(yōu)化手段對其進(jìn)行優(yōu)化;最后使用高效的編譯器進(jìn)行編譯優(yōu)化,從而得到高質(zhì)量的代碼。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉