6RA80直流調速器淺析嵌入式程序設計中的優(yōu)化
瀏覽次數:773發(fā)布日期:2022-06-25
直流調速器在數控機床、造紙印刷、紡織印染、光纜線(xiàn)纜設備、包裝機械、電工機械、食品加工機械、橡膠機械、生物設備、印制電路板設備、實(shí)驗設備、焊接切割、輕工機械、物流輸送設備、機車(chē)車(chē)輛、醫設備、通訊設備、雷達設備、衛星地面接受系統等行業(yè)廣泛應用。
直流調速器淺析嵌入式程序設計中的優(yōu)化:
嵌入式系統由于受功耗、成本和體積等因素的制約,嵌入式微處理器的處理能力與桌面系統處理器相比也存在較大差距,故嵌入式系統對程序運行的空間和時(shí)間要求更為苛刻。通常,需要對嵌入式應用程序進(jìn)行性能優(yōu)化,以滿(mǎn)足嵌入式應用的性能需求。
1 嵌入式程序優(yōu)化的類(lèi)型
嵌入式應用程序優(yōu)化,指在不改變程序功能的情況下,通過(guò)修改原來(lái)程序的算法、結構,并利用軟件開(kāi)發(fā)工具對程序進(jìn)行改進(jìn),使修改后的程序運行速度更高或代碼尺寸更小。
按照優(yōu)化的側重點(diǎn)不同,程序優(yōu)化可分為運行速度優(yōu)化和代碼尺寸優(yōu)化。運行速度優(yōu)化是指在充分掌握軟硬件特性的基礎上,通過(guò)應用程序結構調整等手段來(lái)縮短完成定任務(wù)所需的運行時(shí)間;代碼尺寸優(yōu)化則是指應用程序在能夠正確實(shí)現所需功能的前提下,盡可能減小程序的代碼量。實(shí)際應用中,這兩者往往是相互矛盾的,為了提高程序運行速度,就要以增加代碼量為代價(jià);而為了減小程序代碼尺寸,可能又要以降低程序運行速度為代價(jià)。因此,在對程序進(jìn)行優(yōu)化之前,應根據實(shí)際需要來(lái)制定具體的優(yōu)化策略。隨著(zhù)計算機和微電子技術(shù)的不斷發(fā)展,存儲空間已不再是制約嵌入式系統的主要因素,因此本文主要討論運行速度優(yōu)化。
2 嵌入式程序優(yōu)化遵循的原則
嵌入式程序優(yōu)化主要遵循以下3個(gè)原則。
?、俚刃г瓌t:優(yōu)化前后程序實(shí)現的功能一致。
?、谟行г瓌t:優(yōu)化后要比優(yōu)化前運行速度快或占用存儲空間小,或二者兼有。
?、劢?jīng)濟原則:優(yōu)化程序要付出較小的代價(jià),取得較好的結果。
3 嵌入式程序優(yōu)化的主要方面
嵌入式程序的優(yōu)化分為3個(gè)方面:算法和數據結構優(yōu)化、編譯優(yōu)化以及代碼優(yōu)化。
3.1 算法和數據結構優(yōu)化
算法和數據結構是程序設計的核心所在,算法的好壞在很大程度上決定了程序的優(yōu)劣。為了實(shí)現某種功能,通??梢圆捎枚喾N算法,不同算法的復雜度和效率差別很大。選擇一種高效的算法或對算法進(jìn)行優(yōu)化,可以使應用程序獲得更高的優(yōu)化性能。例如:在數據搜索時(shí),二分查找法要比順序查找法快。遞歸程序需要大量的過(guò)程調用,并在堆棧中保存所有返回過(guò)程的局部變量,時(shí)間效率和空間效率都非常低;若根據實(shí)際情況對遞歸程序采用迭代、堆棧等方法進(jìn)行非遞歸轉換,則可大幅度提高程序的性能。
數據結構在程序的設計中也占有重要的地位。例如:如果在一些無(wú)序的數據中多次進(jìn)行插入、刪除數據項操作,那么采用鏈表結構就會(huì )比較快。
算法和數據結構優(yōu)化是的優(yōu)化技術(shù)。
3.2 編譯優(yōu)化
現在,很多的編譯器都具有一定的代碼優(yōu)化功能。在編譯時(shí),借用并行程序設計技術(shù),進(jìn)行相關(guān)性分析;獲得源程序的語(yǔ)義信息,采用軟件流水線(xiàn)、數據規劃、循環(huán)重構等技術(shù),自動(dòng)進(jìn)行一些與處理器體系無(wú)關(guān)的優(yōu)化,生成高質(zhì)量的代碼。許多編譯器有不同級別的優(yōu)化選項,可以選用一種合適的優(yōu)化方式。通常情況下,如果選用了高級別的優(yōu)化方式,那么編譯器將片面追求代碼的優(yōu)化,有時(shí)會(huì )導致錯誤。
另外,還有一些專(zhuān)用的編譯器針對某些體系結構進(jìn)行了優(yōu)化設計,可以充分利用硬件資源來(lái)生成高質(zhì)量的代碼。例如:Microsoft eMbedded Visual C++版的Intel編譯器*針對Intel XScale體系,經(jīng)過(guò)高度優(yōu)化,能創(chuàng )建運行速度更快的代碼。此編譯器采用了多種優(yōu)化技術(shù),包括優(yōu)化指令管道操作的調度技術(shù)、雙重加載與存儲Intel XScale技術(shù)功能支持以及過(guò)程間優(yōu)化(將函數使用的變量存放到寄存器,以便快速訪(fǎng)問(wèn))等。
在嵌入式軟件開(kāi)發(fā)過(guò)程中應選擇一種優(yōu)化能力強的編譯器,充分利用其代碼優(yōu)化功能,生成高效的代碼,提高程序的運行效率。
3.3 代碼優(yōu)化
代碼優(yōu)化,就是采用匯編語(yǔ)言或更精簡(jiǎn)的程序代碼來(lái)代替原有的代碼,使編譯后的程序運行效率更高。編譯器可以自動(dòng)完成程序段和代碼塊范圍內的優(yōu)化,但很難獲取程序語(yǔ)義信息、算法流程和程序運行狀態(tài)信息,因而需要編程人員進(jìn)行手工優(yōu)化。以下是一些常用的優(yōu)化技術(shù)和技巧。
(1)代碼替換
使用周期短的指令代替周期長(cháng)的指令,以降低運算的強度。
?、贉p少除法運算。用關(guān)系運算符兩邊乘除數避免除法操作,還有一些除法和取模的運算可以用位操作來(lái)代替。因為位操作指令只需一個(gè)指令周期,而“/”運算則需要調用子程序,代碼長(cháng),執行慢。例如:
優(yōu)化前if((a/b)>c)和a=a/4
優(yōu)化后if(a>(b*c))和a=a>>2
?、跍p少乘方運算。例如:
優(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
?、鼙M量使用小的數據類(lèi)型。在所定義的變量滿(mǎn)足使用要求的條件下,優(yōu)先使用順序為:字符型(char)>整型(im)>長(cháng)整型(long int)>浮點(diǎn)型(float)。
對除法來(lái)說(shuō),使用無(wú)符號數比有符號數會(huì )有更高的效率。在實(shí)際調用中,盡量減少數據類(lèi)型的強制轉換;少用浮點(diǎn)運算,如果運算的結果能夠控制在誤差之內,則可用長(cháng)整型代替浮點(diǎn)型。
(2)全局變量與局部變量
少用全局變量,多用局部變量。全局變量是放在數據存儲器中的,定義了全局變量,MCU就少了一個(gè)可以利用的數據存儲器空間,太多的全局變量,會(huì )導致編譯器無(wú)足夠的內存分配;而局部變量則大多定位于MCU內部的寄存器中。在絕大多數的MCU中,使用寄存器的操作速度比數據存儲器快,指令也更靈活,有利于生成質(zhì)量更高的代碼,而且局部變量所占用的寄存器和數據存儲器在不同的模塊中可以重復利用。
(3)使用寄存器變量
當一個(gè)變量被頻繁讀/寫(xiě)時(shí),需要反復訪(fǎng)問(wèn)內存,花費大量的存取時(shí)間。為了提高訪(fǎng)問(wèn)效率,可以使用CPU寄存器變量,不需要訪(fǎng)問(wèn)內存,直接進(jìn)行讀/寫(xiě)。循環(huán)次數較多的循環(huán)控制變量及循環(huán)體內反復使用的變量均可定義為寄存器變量,而循環(huán)計數是應用寄存器變量的*。只有局部自動(dòng)變量和形參才可以定義為寄存器變量。因為寄存器變量屬于動(dòng)態(tài)存儲方式,因此凡需要采用靜態(tài)存儲方式的變量都不能定義為寄存器變量。寄存器變量的說(shuō)明符是register。下面是一個(gè)采用寄存器變量的例子:
(4)減少或避免執行耗時(shí)的操作
應用程序的大量運行時(shí)問(wèn)通?;ㄙM在關(guān)鍵程序模塊,關(guān)鍵模塊往往包含循環(huán)或嵌套循環(huán)。減少循環(huán)中耗時(shí)的操作,可以提高程序的執行速度。常見(jiàn)的耗時(shí)操作有:輸入/輸出操作、文件訪(fǎng)問(wèn)、圖形界面操作和系統調用等。其中,如果無(wú)法避免文件的讀/寫(xiě),那么對文件的訪(fǎng)問(wèn)將是影響程序運行速度的一大因素。提高文件訪(fǎng)問(wèn)速度的方法有兩種:一種是采用內存映射文件;另一種是使用內存緩存。
(5)switch語(yǔ)句用法的優(yōu)化
編程時(shí),對case值按照可能性排序,將最可能發(fā)生的情況放在第一個(gè),最不可能的情況放在最后一個(gè),可以提高switch語(yǔ)句塊的執行速度。
(6)循環(huán)體的優(yōu)化
循環(huán)體是程序設計和優(yōu)化的重點(diǎn),對于一些不需要循環(huán)變量參加運算的模塊,可以把它放到循環(huán)的外面。對于次數固定的循環(huán)體,for循環(huán)比while循環(huán)效率更高,減計數循環(huán)比增計數循環(huán)速度快。例如:
實(shí)際運行時(shí),每次循環(huán)需要在循環(huán)體外加兩條指令:一條減法指令(減少循環(huán)計數值)和一條條件分支指令。這些指令稱(chēng)為“循環(huán)開(kāi)銷(xiāo)”。在A(yíng)RM處理器上,減法指令需要1個(gè)周期,條件分支指令需要3個(gè)周期,這樣每個(gè)循環(huán)另加了4個(gè)周期的開(kāi)銷(xiāo)??梢圆捎醚h(huán)展開(kāi)的方法來(lái)提高循環(huán)運行的速度,即:重復循環(huán)主題多次,并按同樣的比例減少循環(huán)次數來(lái)減小循環(huán)的開(kāi)銷(xiāo),以增加代碼尺寸。來(lái)?yè)Q取程序的運行速度。。
(7)函數調用
高效的調用函數,盡量限制使用函數的參數個(gè)數,不要超過(guò)4個(gè)。ARM調用時(shí),4個(gè)以下的形參通過(guò)寄存器傳遞,第5個(gè)以上的形參通過(guò)存儲器棧傳遞。如果有更多的參數調用,則可將相關(guān)的參數組織在一個(gè)結構體內,用傳遞結構體指針來(lái)代替參數。
(8)內聯(lián)函數和內嵌匯編
對性能影響大的重要函數可以使用關(guān)鍵字_inline內聯(lián),會(huì )省去調用函數的開(kāi)銷(xiāo),負面影響是增加了代碼尺寸。程序中對時(shí)間要求苛刻的部分可以用內嵌匯編來(lái)編寫(xiě),通??梢詭?lái)速度上的顯著(zhù)提高。
(9)查表代替計算
在程序中盡量不進(jìn)行非常復雜的運算,如浮點(diǎn)數的開(kāi)方。對于這些消耗時(shí)間和資源的運算,可以采用空間換取時(shí)間的方法。預先將函數值計算出來(lái),置于程序存儲區中,以后程序運行時(shí)直接查表即可,減小了程序執行過(guò)程中重復計算的工作量。
(10)使用針對硬件優(yōu)化的函數庫
Intel公司為XScale處理器設計的GPP(Graphics Performance Primitives library)/IPP(Integrated Perform-ance Primitives library)庫,針對多媒體處理、圖形處理和數值運算的一些典型操作和算法進(jìn)行了手工優(yōu)化,可以很好地發(fā)揮XScale硬件的計算潛能,達到很高的執行效率。
(11)利用硬件特性
為了提高程序的運行效率,要充分利用硬件特性來(lái)減小其運行開(kāi)銷(xiāo),例如減少中斷次數、利用DMA傳輸方式等。
CPU對各種存儲器的訪(fǎng)問(wèn)速度排序依次為:CPU內部RAM>外部同步RAM>外部異步RAM>Flash/ROM。對于已經(jīng)燒錄在Flash或ROM中的程序代碼,如果讓CPU直接從中讀取代碼執行,運行速度較慢,則可在系統啟動(dòng)后將Flash或ROM中的目標代碼拷貝至RAM中后執行,以提高程序的運行速度。
4 結論
嵌入式程序的性能優(yōu)化與軟件的開(kāi)發(fā)周期、開(kāi)發(fā)成本、軟件的可讀性之聞通常存在矛盾。要權衡利弊,作出折中的選擇。將算法和數據結構優(yōu)化作為選優(yōu)化技術(shù);然后根據功能、性能差異和投資預算等因素選擇高效的編譯器、系統運行庫和圖形庫;使用性能監測工具偵測占主要運行時(shí)間的程序熱點(diǎn),采用代碼優(yōu)化手段對其進(jìn)行優(yōu)化;最后使用高效的編譯器進(jìn)行編譯優(yōu)化,從而得到高質(zhì)量的代碼。