薛亞 朱婭晶
摘要:在嵌入式系統(tǒng)的應(yīng)用過程中,對(duì)于應(yīng)用軟件有著非常高的要求。在對(duì)嵌入式系統(tǒng)進(jìn)行C語言開發(fā)的過程中,務(wù)必要注意對(duì)程序代碼的優(yōu)化操作,通過該方法的應(yīng)用能夠有效提升代碼的運(yùn)行效率,促進(jìn)代碼的執(zhí)行質(zhì)量。雖然在一定程度上C編譯器能夠?yàn)榇a提供一定的優(yōu)化服務(wù)與幫助,但是從本質(zhì)上來分析,C編譯器為其提供的優(yōu)化技術(shù)僅僅能做到速度和代碼量的平衡。而無法實(shí)現(xiàn)提高代碼運(yùn)行效率以及促進(jìn)代碼執(zhí)行質(zhì)量。針對(duì)這一問題,有效的解決方法是:設(shè)計(jì)一個(gè)有效又快,且能夠?qū)崿F(xiàn)代碼執(zhí)行速度和代碼量有效平衡的系統(tǒng)結(jié)構(gòu)。研究將針對(duì)這一內(nèi)容對(duì)其進(jìn)行分析,并提出如何有效優(yōu)化C代碼的方法與措施。
關(guān)鍵詞:嵌入式系統(tǒng);C語言;代碼優(yōu)化;方法應(yīng)用
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1009-3044(2020)29-0227-02
1 引言
就當(dāng)前情況而言,C語言已經(jīng)成為嵌入式系統(tǒng)研究和開發(fā)的主要應(yīng)用方法,且作為一種系統(tǒng)設(shè)計(jì)語言,C語言具備簡單、高效的特點(diǎn),以及兼容多種高級(jí)語言的功能。其本身具備強(qiáng)大的可移植功能和應(yīng)用特征。特別是在嵌入式系統(tǒng)的開發(fā)和應(yīng)用中.能夠?qū)崿F(xiàn)低成本、低消耗的產(chǎn)出,實(shí)現(xiàn)高質(zhì)量、高效率的系統(tǒng)開發(fā)和應(yīng)用。但是,在這一過程中需要探索的問題為:在這一背景下,基于C語言開發(fā)和設(shè)計(jì)的嵌入式系統(tǒng)在儲(chǔ)存容量以及計(jì)算能力等方面的效率較低,所以,研究將針對(duì)這一問題提出如何有效提升嵌入式C語言系統(tǒng)開發(fā)代碼的應(yīng)用效果,實(shí)現(xiàn)對(duì)C語言代碼的優(yōu)化與完善。
2 C代碼優(yōu)化
目前的C語言編譯器能夠在設(shè)計(jì)和開發(fā)系統(tǒng)的過程中對(duì)相關(guān)代碼進(jìn)行自動(dòng)優(yōu)化,但是這一優(yōu)化模式是基于代碼的長度與執(zhí)行命令的速度基礎(chǔ)上實(shí)現(xiàn)的,且是為了平衡兩者之間的關(guān)系。如果在這一基礎(chǔ)上想要實(shí)現(xiàn)能方便、更搞笑的C語言代碼執(zhí)行效率,就需要對(duì)其進(jìn)行深度優(yōu)化操作,且需要通過程序員對(duì)其進(jìn)行人工優(yōu)化,這樣便可以有效提成C語言對(duì)嵌入式系統(tǒng)開發(fā)的應(yīng)用質(zhì)量和應(yīng)用效率。
2.1 變量使用
在對(duì)嵌入式系統(tǒng)進(jìn)行研究與設(shè)計(jì)的過程中,需要通過變量的使用對(duì)其進(jìn)行有效的分析,以此實(shí)現(xiàn)對(duì)系統(tǒng)的完整架構(gòu),進(jìn)而提升C代碼的優(yōu)化質(zhì)量。在變量使用過程中,可以通過全局變量的方法對(duì)其進(jìn)行應(yīng)用,該方法的應(yīng)用比向函數(shù)傳遞參數(shù)的效果更好,且能夠避免函數(shù)在被調(diào)用的過程中出現(xiàn)出棧和入棧的情況。但是,在應(yīng)用全局變量的過程中同樣有“副作用”,比如,變量的次序會(huì)讓映像數(shù)據(jù)布局發(fā)生改變,而且在聲明變量的應(yīng)用中,還需要通過嚴(yán)密的設(shè)計(jì)方法對(duì)其進(jìn)行控制儲(chǔ)存器的有效分配與精確分布。在這一過程中,最高效的應(yīng)用辦法為:在編程的過程中,需要將相同的變量融合在一起對(duì)其進(jìn)行應(yīng)用和定義操作。而且在變量聲明的過程中需要通過英文縮寫對(duì)其進(jìn)行表示,這樣能夠大大降低內(nèi)存的占有空間,且可以提升運(yùn)行速度。另外,針對(duì)不同類型的數(shù)據(jù),設(shè)備生成的代碼長度差異性加大,在這一過程中需要盡量選用長度較短的代碼。如,應(yīng)用int相比long的速度更快。
2.2 數(shù)組使用
首先,需要對(duì)數(shù)組進(jìn)行初始化操作,為了提升運(yùn)行速度,可以在初始化的過程中預(yù)留數(shù)組范圍,這樣程序的運(yùn)行效率會(huì)加倍提升。其次,可以尋找代替數(shù)組的方法,如,利用指針代替數(shù)組能夠有效解決這一問題。一般情況下,指針的位置就是數(shù)據(jù)的儲(chǔ)存位置,而數(shù)組是所有變量的綜合表現(xiàn)方式。在這一情況下,便可以通過指針的運(yùn)行來反應(yīng)數(shù)組的索引,進(jìn)而實(shí)現(xiàn)目標(biāo)代碼編輯的速度與質(zhì)量不斷提升。相比數(shù)組索引,指針運(yùn)算效率更快,占內(nèi)存空間更小,而且應(yīng)用多為數(shù)組的差異也會(huì)更顯著。在數(shù)組的使用過程中,任意一次的循環(huán)都需要對(duì)其進(jìn)行下標(biāo)“i”值的標(biāo)記與計(jì)算,并且要在C語言編譯器中觀察其指令周期,一般情況下為一次循環(huán)占有四個(gè)指令周期。當(dāng)指針“p”位于array數(shù)組位置的時(shí)候,任意一次循環(huán)僅需要對(duì)“p”進(jìn)行增量的操作,而且在這一背景下一次循環(huán)只占有兩個(gè)指令周期。通過以上兩種方法的應(yīng)用,相比較之前的運(yùn)算效率與命令執(zhí)行能力,速度可提升一倍。
2.3 宏的使用
在應(yīng)用C語言對(duì)嵌入式系統(tǒng)進(jìn)行開發(fā)和設(shè)計(jì)的過程中,如果想要實(shí)現(xiàn)對(duì)代碼的完整優(yōu)化,就務(wù)必要應(yīng)用宏對(duì)其進(jìn)行支撐和幫助。這樣,能夠從根本上提升程序的運(yùn)算效率,促進(jìn)程序?qū)γ畹膱?zhí)行速度。從本質(zhì)上分析,宏并非一種函數(shù)表現(xiàn)形式,只是在應(yīng)用過程中接近于函數(shù)模式。在對(duì)函數(shù)進(jìn)行調(diào)用的過程中,需要通過系統(tǒng)棧對(duì)其進(jìn)行儲(chǔ)存,而且CPU在函數(shù)調(diào)用的過程中還要做好對(duì)數(shù)據(jù)的恢復(fù)準(zhǔn)備。在這一背景下,可以有效進(jìn)行出棧和進(jìn)棧的操作。由此可見,占用CPU實(shí)踐的除了代碼本身之外,對(duì)函數(shù)進(jìn)行調(diào)用也需要占據(jù)一定的時(shí)間。但是,通過宏定義對(duì)其進(jìn)行設(shè)計(jì)便可以規(guī)避這一問題。宏定義能夠提前做好代碼嵌入工作,且可以將之融人開發(fā)系統(tǒng)中,進(jìn)而省略函數(shù)調(diào)用環(huán)節(jié),從占用CPU的時(shí)間轉(zhuǎn)變?yōu)榱苏加幂^小的儲(chǔ)存空間。該方法的應(yīng)用還能夠擺脫參數(shù)壓棧、返回參數(shù)、C語言call調(diào)用以及執(zhí)行return的操作步驟。在提升程序運(yùn)行速度與執(zhí)行效率的同時(shí)降低了操作的煩瑣性。
2.4 循環(huán)程序處理
在系統(tǒng)的多重循環(huán)過程中,需要程序員將最長的循環(huán)內(nèi)容設(shè)置在系統(tǒng)的最內(nèi)層,同時(shí)需要將最短的循環(huán)內(nèi)容設(shè)置在系統(tǒng)的最外層。這樣,能夠有效提升CPU的運(yùn)行效率,促進(jìn)CPU的跨切循環(huán)次數(shù)。另外,如果在系統(tǒng)的循環(huán)過程中需要進(jìn)行邏輯判斷,且循環(huán)的次數(shù)相對(duì)較大,就需要將循環(huán)判斷從系統(tǒng)內(nèi)部嫁接到系統(tǒng)的外部。通過該方法的應(yīng)用,能夠?qū)崿F(xiàn)高效率且頻繁的操作,且可以打破原有模式下的流水線作業(yè)方式,進(jìn)而使得編譯器在對(duì)代碼優(yōu)化的過程中能夠?qū)崿F(xiàn)對(duì)整體代碼的高效處理。
2.5 優(yōu)化分支語言
從發(fā)生的頻率排序?qū)ζ溥M(jìn)行分析,在按照條件選擇執(zhí)行語句的時(shí)候,需要結(jié)合系統(tǒng)的順序?qū)ζ溥M(jìn)行比較,并且進(jìn)行相應(yīng)的匹配處理,以此實(shí)現(xiàn)滿足條件的語句執(zhí)行方法應(yīng)用。同時(shí),為了有效提升分支語句優(yōu)化的速度,還可以結(jié)合實(shí)際情況對(duì)其進(jìn)行發(fā)生相對(duì)頻率的排序處理,在這一背景下需要將最有可能發(fā)生的放在最前端,然后將發(fā)生可能最小的放在最末端,這一方法的應(yīng)用能夠有效提升程序的計(jì)算與執(zhí)行速度。在進(jìn)行switch語言編譯的過程中,語言編譯器會(huì)自動(dòng)生成if-else-if嵌套代碼,在此需要程序員對(duì)其進(jìn)行順序性比較,然后再對(duì)其進(jìn)行匹配處理,進(jìn)而實(shí)現(xiàn)滿足條件的語句執(zhí)行跳轉(zhuǎn)。在switch語句中,case標(biāo)號(hào)較多,在此需要程序員對(duì)其進(jìn)行次數(shù)的控制,在這一過程中需要將發(fā)生頻率較高的往前設(shè)置,將發(fā)生頻率相抵較低的往后放置。抑或者可以將整個(gè)switch語句進(jìn)行轉(zhuǎn)化,利用嵌套語句的模式將之應(yīng)用起來,然后將發(fā)生頻率相對(duì)較高的編號(hào)放在外層,將發(fā)生頻率較低的標(biāo)號(hào)放在內(nèi)層。另外,如果在switch的任意一種模式中都有很多任務(wù)需要完成,便可以將switch語句進(jìn)行指向函數(shù)指針的代替,以此提升任務(wù)完成的效率,降低任務(wù)完成的難度,并實(shí)現(xiàn)代碼替換的目的。
2.6 利用數(shù)字優(yōu)化程序
在對(duì)程序進(jìn)行編寫的過程中,需要幾何相應(yīng)的數(shù)學(xué)計(jì)算方法對(duì)其進(jìn)行程序的運(yùn)算與處理.并且需要在這一背景下對(duì)程序進(jìn)行相應(yīng)的檢測(cè),以此實(shí)現(xiàn)程序?qū)γ畹膱?zhí)行能力和執(zhí)行效率,提升程序的運(yùn)行效率級(jí)別。這是程序設(shè)計(jì)與開發(fā)過程中的一個(gè)重要環(huán)節(jié),但是也是容易被人忽略的部分。而且對(duì)于部分經(jīng)驗(yàn)欠缺的技術(shù)人員來說,這一部分的操作相對(duì)較為困難。比如,需要求證程序中1-100的總和。在此,可以通過以下兩種方法對(duì)其進(jìn)行求證:
第一是inti,sum=0:
for(i=1:i<101:i++)
{sum+=i;
第二是int sum;
Sum= 100*(100+1)/2;
通過以上兩種方法我們可以分析得出,在第一種方法中,系統(tǒng)需要循環(huán)100次才能解決這一問題,換言之,徐彤最少需要應(yīng)用100個(gè)賦值才能對(duì)其進(jìn)行100次準(zhǔn)確的判斷,而且在這一過程中還需要通過200次的加法計(jì)算才能得出最終結(jié)果。而在第二種應(yīng)用方法中,系統(tǒng)僅僅需要完成1次加法、1次乘法和1次除法便可以將之準(zhǔn)確的計(jì)算出來。從以上兩種方法的應(yīng)用中可以看出,第二種方法不論從簡便性、效率還是代碼編寫的長度等方面均優(yōu)越與第一種。因此,在對(duì)其進(jìn)行嵌入式程序設(shè)計(jì)的過程中,可以首先選擇應(yīng)用第二種犯法對(duì)其進(jìn)行程序運(yùn)行效率的提升與發(fā)展。
2.7 應(yīng)用位操作代替乘除法
在計(jì)算機(jī)的應(yīng)用程序中,數(shù)據(jù)是其中的最小位,也是可以直接操作的單位。正常情況下,對(duì)數(shù)據(jù)的操作需要借助硬件來完成,在硬件的控制下,數(shù)據(jù)可以得到相應(yīng)的變化,完成相應(yīng)的需求。在此,為了提升應(yīng)用位操作的效率,并代替乘除法的計(jì)算模式,可以對(duì)其進(jìn)行運(yùn)行效率靈活性的提升。因?yàn)槌顺ㄔ贑PU中無法直接運(yùn)行,而是需要在一定條件下來實(shí)現(xiàn)。
如,除法的應(yīng)用為:int height,le n;
height= 128/8;
le n=256%8:
乘法的應(yīng)用為:int height,le n;
height= 128>>3;
le n=256 - (256 >>3<<3);
結(jié)合以上兩種模式,代碼生成過程中調(diào)用了出發(fā)和取余函數(shù),所以,在這一過程中出現(xiàn)了函數(shù)調(diào)用的情況,同時(shí)還形成了寄存器參與運(yùn)算的行為。由此可見,通過第二種方法對(duì)其進(jìn)行代碼的生成更加高效快捷。
3 總結(jié)
在日常系統(tǒng)設(shè)計(jì)過程中,嵌入式系統(tǒng)開發(fā)與設(shè)計(jì)中代碼的優(yōu)化工作需要應(yīng)用到較大的成本,而且有很多開銷項(xiàng)目屬于“隱藏項(xiàng)目”。同時(shí)工作較為復(fù)雜,且消耗的資源相對(duì)較大。在這一過程中,編程需要盡量通過程序優(yōu)化的方式降低以上問題的發(fā)生概率,縮減不必要的運(yùn)算環(huán)節(jié),在控制成本的過程中提升系統(tǒng)開發(fā)的整體效率與質(zhì)量。研究分析了如何有效地提升代碼的運(yùn)行效率,但是在現(xiàn)實(shí)環(huán)境匯總,代碼效率在得到提升和優(yōu)化之后依然會(huì)出現(xiàn)其他方面的弊端與問題,甚至?xí)?duì)程序的整體運(yùn)行造成嚴(yán)重的影響。比如,較為常見的有:代碼大小的控制失效、程序可讀性降低等。所以,在后續(xù)的嵌入式系統(tǒng)開發(fā)與設(shè)計(jì)中,需要通過科學(xué)合理的辦法對(duì)其進(jìn)行代碼的優(yōu)化,切不可一味追求速度,也不可一味追求穩(wěn)定。
參考文獻(xiàn):
[1]楊毅剛,范安宇,鄭一超,等,基于C語言的宿舍管理系統(tǒng)設(shè)計(jì) 與開發(fā)[J].電腦編程技巧與維護(hù),2017(23):50-52.
[2]張祎.C語言在單片機(jī)開發(fā)中的應(yīng)用分析[J].江蘇科技信息,2017(18):47-48.
[3]胡曉燕,譚躍生,李海榮,等.基于Android系統(tǒng)的移動(dòng)學(xué)習(xí)環(huán)境開發(fā)與應(yīng)用[J].中國現(xiàn)代教育裝備,2016(11):12-14.
[4]封婉.基于C程序設(shè)計(jì)語言的計(jì)算機(jī)編程分析[J].職大學(xué)報(bào),2015(6):88-89.
【通聯(lián)編輯:代影】
作者簡介:朱婭晶(1980-),女,江蘇常州人,高校副教授,碩士,研究方向:計(jì)算機(jī)軟件。