欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
高效率嵌入式程序開(kāi)發(fā)

摘  要:嵌入式系統對應用軟件的質(zhì)量要求很高,在嵌入式開(kāi)發(fā)中須注意對代碼進(jìn)行優(yōu)化,盡可能地提高代碼效率。雖然C 編譯器都提供了一定程度的代碼優(yōu)化,但大部分由編譯器執行的優(yōu)化技術(shù)僅涉及執行速度和代碼大小的平衡,不可能使程序既快又小,因而必須在編寫(xiě)程序時(shí)采取必 要的措施。本文針對高效率嵌入式程序開(kāi)發(fā)提供了一些編程技巧,對實(shí)際系統開(kāi)發(fā)具有重要作用。
關(guān)鍵詞:編譯器; 程序開(kāi)發(fā); 代碼優(yōu)化


引言
    在多媒體、通信等計算復雜度高的應用中,為了滿(mǎn)足制造費用、功耗、性能以及實(shí)時(shí)性等諸多限制條件的要求,嵌入式系統程序往往需要特殊設計。這使得設計師在 設計面向特定應用的嵌入式軟件時(shí),需要有一套切實(shí)可行的編程準則。而在實(shí)際程序設計中,工程師尤其需要考慮對變量的使用和循環(huán)程序的處理。

變量使用
    在進(jìn)行實(shí)際程序開(kāi)發(fā)時(shí),變量的使用至關(guān)重要,其中使用全局變量比向函數傳遞參數更加有效,這樣免去了函數調用時(shí)參數入棧和出棧的需要。當然,使用全局變量會(huì )對程序有一些副作用。變量定義的次序會(huì )導致最終映像中數據布局的不同,如圖1所示。


                     圖1 變量映像次序混亂狀況

    由此可見(jiàn),在聲明變量時(shí),需要考慮怎樣最佳地控制存儲器布局。最好的方法是在編程的時(shí)候,把所有相同類(lèi)型的變量放在一起定義。

    通常,工程師設法使用short或char來(lái)定義變量以節省存儲器空間。在函數的局部變量數目有限的情況下,編譯器會(huì )把局部變量分配給內部寄存器,每個(gè)變 量占用一個(gè)寄存器。在這種情況下,使用short和char型變量不但不會(huì )節省空間,反而會(huì )帶來(lái)其它的副作用。如圖2所示:假定a是任意可能的寄存器,存 儲函數的局部變量。同樣完成加1的操作,32位的int型變量最快,只用一條加法指令。而8位和16位變量,完成加法操作后,還需要在32位的寄存器中進(jìn) 行符號擴展。其中,帶符號的變量,要用邏輯左移和算術(shù)右移兩條指令才能完成符號擴展;無(wú)符號的變量,要使用一條邏輯與指令對符號位進(jìn)行清零。所以,使用 32位的int或unsigned int局部變量最有效。某些情況下,函數從外部存儲器讀入局部變量進(jìn)行計算,這時(shí)候,需要把不是32位的變量轉換成32位。至于把8位或16位變量擴展成 32位后,隱藏了原來(lái)可能溢出異常這個(gè)問(wèn)題,需要進(jìn)一步仔細考慮。


         圖2 不同類(lèi)型局部變量的加法程序

    在程序中,經(jīng)常會(huì )使用switch case語(yǔ)句,每一個(gè)由機器語(yǔ)言實(shí)現的測試和跳轉僅僅是為了決定下一步要做什么,就浪費了處理器時(shí)間。為了提高速度,可以把具體的情況按照它們發(fā)生的相對 頻率排序。即把最可能發(fā)生的情況放在第一,發(fā)生概率小的情況放在最后,這樣會(huì )減少代碼平均執行時(shí)間。

    通常,工程師總是竭力避免使用冗余變量,以精簡(jiǎn)程序。一般情況下這樣做是正確的,但是也有例外,如下所示:
int f(void);
int g(void);             
//f()和g()不訪(fǎng)問(wèn)全局變量errs
int errs;             //全局變量
void test1(void)
{ errs += f();
                errs += g();
}
void test2(void)
{ int localerrs = errs;  
// 定義冗余的局部變量
     localerrs += f();
     localerrs += g();
     errs = localerrs;
}
    在第一種情況test1()里,每次訪(fǎng)問(wèn)全局變量errs時(shí)都要先從相應的存儲器下載到寄存器里,經(jīng)f()或g()函數調用后再存儲回原來(lái)的存儲器里面。 在該例子中,一共要進(jìn)行兩次這樣的下載/存儲操作。而在第二種情況test2()里,局部變量localerrs被分配以寄存器,這樣一來(lái),整個(gè)函數就只 需要一次下載/存儲全局變量存儲器了。盡量節省存儲器訪(fǎng)問(wèn)的次數,對于提高系統性能非常有用。

循環(huán)程序的處理
    計數循環(huán)是程序中常用的流程控制結構。在C中,類(lèi)似下面的for循環(huán)比比皆是:
    for(loop=1;loop<=limit;loop++)

    這種累加計數的方法符合一般的自然思維習慣,所以比下面的遞減計數方法使用更多:
    for(loop<=limit;loop!=0; loop--)
    這兩者在邏輯上并沒(méi)有效率差異,但是映射到具體的體系結構中,就產(chǎn)生了很大的不同。

    累加法比遞減法多用了一條指令,當循環(huán)次數比較多的時(shí)候,這兩段代碼就會(huì )在性能上產(chǎn)生明顯的差異。分析其本質(zhì)原因,在于當進(jìn)行一個(gè)非零常數比較時(shí),必須用 專(zhuān)門(mén)的CMP指令來(lái)執行;而當一個(gè)變量與零進(jìn)行比較時(shí),ARM指令可以直接利用條件執行的特性(NE)來(lái)進(jìn)行判斷。很多時(shí)候循環(huán)展開(kāi)由編譯器自動(dòng)完成,不 過(guò)應注意對中間變量或結果被更改的循環(huán),編譯程序往往拒絕展開(kāi),這時(shí)候就需要工程師自己來(lái)做展開(kāi)工作了。

    尤其值得注意的是,在有內部指令cache的CPU上(如ARM946ES芯片),因為循環(huán)展開(kāi)的代碼很大,往往會(huì )出現高速緩沖存儲器溢出。這時(shí)展開(kāi)的代 碼會(huì )頻繁地在CPU的高速緩沖存儲器和內存之間來(lái)回調用,又因為高速緩沖存儲器速度很高,所以此時(shí)循環(huán)展開(kāi)反而會(huì )變慢。同時(shí),循環(huán)展開(kāi)會(huì )影響矢量運算優(yōu) 化。

    ARM處理器核對NZ(零比較轉移)有特別的指令處理,速度非???,如果你的循環(huán)對方向不敏感,可以由大向小循環(huán)。需要注意的是,如果指針操作使用了i 值,這種方法可能引起指針索引超界的嚴重錯誤(i = MAX+1)。當然你可以通過(guò)對i做加減運算來(lái)糾正,但是如果這樣就沒(méi)有提高效率的作用了。

結語(yǔ)
    本文對高效率嵌入式ARM程序開(kāi)發(fā)總結了一些編程技巧。在實(shí)際的嵌入式系統開(kāi)發(fā)中,可以大大的提高系統的性能,特別是在多媒體和通信等復雜度高的應用中,對程序設計具有指導意義。

參考文獻:
1 Marshall P. Cline and Greg A. Lomow. C++ FAQs, Addison-Wesley, 1995
2 Bruce Eckel. Thinking in C++(C++ 編程思想,劉宗田 等譯),機械工業(yè)出版社,2000

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
西門(mén)子S7 200PLC存儲器類(lèi)型
變量 keil存儲器類(lèi)型
西門(mén)子s7
C語(yǔ)言關(guān)鍵字auto與register的深入理解
單片機編程軟件很簡(jiǎn)單(五),keil單片機編程軟件變量用法(下)
淺談嵌入式 MCU 軟件開(kāi)發(fā)之應用工程的堆與棧
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久