一级日韩免费大片,亚洲一区二区三区高清,性欧美乱妇高清come,久久婷婷国产麻豆91天堂,亚洲av无码a片在线观看

嵌入式系統編程中的代碼優(yōu)化

時(shí)間:2024-07-27 11:16:28 嵌入式培訓 我要投稿
  • 相關(guān)推薦

嵌入式系統編程中的代碼優(yōu)化

  今天,嵌入式系統已經(jīng)廣泛地應用于工業(yè)控制、信息家電、辦公自動(dòng)化、移動(dòng)通信、儀器儀表、醫療電子以及國防等領(lǐng)域。隨著(zhù)國內外各種嵌入式產(chǎn)品的進(jìn)一步開(kāi)發(fā)和推廣,嵌入式技術(shù)越來(lái)越和人們的生活緊密結合。那么嵌入式系統編程中的代碼如何優(yōu)化,下面跟yjbys小編一起來(lái)學(xué)習一下。

  1 引言

  嵌入式系統一般指非PC系統,通常完成一種或多種特定的計算機功能。它是以應用為中心,軟硬件可裁減的,適應應用系統對功能,可靠性,成本,體積,功耗等綜合性要求的專(zhuān)用計算機系統。簡(jiǎn)單的說(shuō)類(lèi)似于PC中的BIOS的工作方式,具有軟件代碼小、高度自動(dòng)化、響應速度快等特點(diǎn)。特別適合于要求實(shí)時(shí)和多任務(wù)的應用體系。嵌入式實(shí)時(shí)系統是目前蓬勃發(fā)展的行業(yè)之一。但是,實(shí)時(shí)嵌入式系統的特點(diǎn)使得其軟件受時(shí)間和空間的嚴格限制,加上運行環(huán)境復雜,使得嵌入式系統軟件的開(kāi)發(fā)變得異常困難。 為了設計一個(gè)滿(mǎn)足功能、性能和時(shí)間要求的安全可靠的高性能嵌入式系統,編程語(yǔ)言的選擇十分重要。

  2 嵌入式系統中編程語(yǔ)言的選擇

  因為匯編語(yǔ)言編寫(xiě)的代碼難懂,從而不好維護和難于調試,且只能針對特定的體系結構和處理器移植性差,所以既不宜在復雜系統中使用,又不便于實(shí)現軟件重用;而高級語(yǔ)言具有良好的通用性和豐富的軟件支持,可移植性好、易于維護,因此高級語(yǔ)言編程具有許多優(yōu)勢。隨著(zhù)嵌入式系統應用范圍的不斷擴大和嵌入式實(shí)時(shí)操作系統RTOS(Real Time Operating System)的廣泛使用,高級語(yǔ)言編程已是嵌入式系統設計的必然趨勢。但是不排除一些軟件模塊仍用匯編語(yǔ)言來(lái)寫(xiě),這可以使程序更加有效。雖然C/C++編譯器對代碼進(jìn)行了優(yōu)化,但是適當的使用內聯(lián)匯編指令可以有效的提高整個(gè)系統運行的效率。目前,在嵌入式系統開(kāi)發(fā)過(guò)程中使用的語(yǔ)言種類(lèi)很多,但僅有少數幾種語(yǔ)言得到了比較廣泛的應用。其中C和C++是應用最廣泛的。C++在支持現代軟件工程、 OOP(Object Oriented Programming,面向對象的程序設計)、結構化等方面對C進(jìn)行了卓有成效的改進(jìn),但在程序代碼容量、執行速度、程序復雜程度等方面比C語(yǔ)言程序性能差一些。由于C語(yǔ)言既有低級語(yǔ)言的直接控制硬件的能力,又有高級語(yǔ)言的靈活性,是目前在嵌入式系統中應用最廣泛的編程語(yǔ)言。隨著(zhù)網(wǎng)絡(luò )技術(shù)和嵌入式技術(shù)的不斷發(fā)展,Java的應用也得到廣泛應用。

  3 實(shí)時(shí)程序設計中代碼的優(yōu)化

  在嵌入式的系統開(kāi)發(fā)中,出于對低價(jià)產(chǎn)品的需求, 硬件的設計者需要提供剛好足夠的存儲器和完成工作的處理能力。所以在嵌入式軟件設計的最后一個(gè)階段則變成了對代碼的優(yōu)化。

  代碼優(yōu)化的目標是體積小和速度快,可以從算法、數據和指令流三方面來(lái)考慮。

  3.1 算法優(yōu)化

  大多數情況下,速度同內存(或者是性能,比如說(shuō)壓縮性能)是不可兼得的。目前程序加速的常用算法一個(gè)大方面就是利用查表來(lái)避免計算(比如在jpg有 huffman碼表,在YUV到RGB變換也有變換表)這樣原來(lái)的復雜計算現在僅僅查表就可以了,雖然浪費了內存,不過(guò)速度顯著(zhù)提升。此外在編寫(xiě)程序時(shí)還要注意提高效率,例如:

  3.1.1Switch語(yǔ)句中根據發(fā)生頻率來(lái)進(jìn)行case排序

  switch語(yǔ)句是一個(gè)普通的編程技術(shù),編譯器會(huì )產(chǎn)生if-else-if的嵌套代碼,并按照順序進(jìn)行比較,發(fā)現匹配時(shí),就跳轉到滿(mǎn)足條件的語(yǔ)句執行。使用時(shí)需要注意。每一個(gè)由機器語(yǔ)言實(shí)現的測試和跳轉僅僅是為了決定下一步要做什么,就把寶貴的處理器時(shí)間耗盡。為了提高速度,設法根據具體的情況按照它們發(fā)生的相對頻率排序。換句話(huà)說(shuō),把最可能發(fā)生的情況放在第一位,最不可能的情況放在最后。

  3.1.2將大的switch語(yǔ)句轉為嵌套switch語(yǔ)句

  當switch語(yǔ)句中的case標號很多時(shí),為了減少比較的次數,明智的做法是把大switch語(yǔ)句轉為嵌套switch語(yǔ)句。把發(fā)生頻率高的case 標號放在一個(gè)switch語(yǔ)句中,并且是嵌套switch語(yǔ)句的最外層,發(fā)生相對頻率相對低的case標號放在另一個(gè)switch語(yǔ)句中。如果switch中每一種情況下都有很多的工作要做,那么把整個(gè)switch語(yǔ)句用一個(gè)指向函數指針的表來(lái)替換會(huì )更加有效。

  3.1.3用指針代替數組

  在許多種情況下,可以用指針運算代替數組索引,這樣做常常能產(chǎn)生又快又短的代碼。與數組索引相比,指針一般能使代碼速度更快,占用空間更少。使用多維數組時(shí)差異更明顯。下面的代碼作用是相同的,但是效率不一樣。

  數組索引 指針運算

  For(;;){ p=array

  A=array[r++]; for(;;){

  a=*(p++);

  ...... ......

  } }

  指針?lè )椒ǖ膬?yōu)點(diǎn)是,array的地址每次裝入地址p后,在每次循環(huán)中只需對p增量操作。在數組索引方法中,每次循環(huán)中都必須進(jìn)行基于r值求數組下標的復雜運算。

  3.1.4使用宏函數而不是函數。例如:

  #define bwMCDR2_ADDRESS 4

  #define bsMCDR2_ADDRESS 17

  #define bmMCDR2_ADDRESS BIT_MASK(MCDR2_ADDRESS)

  #define BIT_MASK(__bf) (((1U << (bw ## __bf)) - 1) << (bs ## __bf))

  #define SET_BITS(__dst, __bf, __val) ((__dst) = ((__dst) & ~(BIT_MASK(__bf))) | (((__val) << (bs ## __bf)) & (BIT_MASK(__bf))))

  SET_BITS(MCDR2, MCDR2_ADDRESS, RegisterNumber);

  函數和宏函數的區別就在于,宏函數占用了大量的空間,而函數占用了時(shí)間。函數調用是要使用系統的棧來(lái)保存數據的,如果編譯器里有棧檢查選項,一般在函數的頭會(huì )嵌入一些匯編語(yǔ)句對當前棧進(jìn)行檢查;同時(shí),CPU也要在函數調用時(shí)保存和恢復當前的現場(chǎng),進(jìn)行壓棧和彈棧操作,所以,函數調用需要一些CPU時(shí)間。而宏函數不存在這個(gè)問(wèn)題。宏函數僅僅作為預先寫(xiě)好的代碼嵌入到當前程序,不會(huì )產(chǎn)生函數調用,所以?xún)H僅是占用了空間,在頻繁調用同一個(gè)宏函數的時(shí)候,該現象尤其突出。

  3.2 Data optimization數據優(yōu)化

  比算法優(yōu)化層低一級的是數據優(yōu)化層,我們可以通過(guò)改變算法使用的數據類(lèi)型來(lái)優(yōu)化算法。主要的目的是使處理的數據和目標結構的特性相一致。這項優(yōu)化不需要大量的代碼重寫(xiě),并獨立于算法優(yōu)化的執行而執行.例如:

  3.2.1確定浮點(diǎn)型變量和表達式是 float 型

  為了讓編譯器產(chǎn)生更好的代碼,必須確定浮點(diǎn)型變量和表達式是 float 型的。要特別注意的是,以 ";F"; 或 ";f";為后綴(比如:2.718f)的浮點(diǎn)常量才是 float 型,否則默認是 double 型。為了避免 float 型參數自動(dòng)轉化為 double,請在函數聲明時(shí)使用 float。

  3.2.2使用32位的數據類(lèi)型

  編譯器有很多種,但它們都包含的典型的32位類(lèi)型是:int,signed,signed int,unsigned,unsigned int,long,signed long,long int,signed long int,unsigned long,unsigned long int。盡量使用32位的數據類(lèi)型,因為它們比16位的數據甚至8位的數據更有效率。

  3.2.3明智使用有符號整型變量

  在很多情況下,你需要考慮整型變量是有符號還是無(wú)符號類(lèi)型的。在許多地方,考慮是否使用有符號的變量是必要的。在一些情況下,有符號的運算比較快;但在一些情況下卻相反。比如:整型到浮點(diǎn)轉化時(shí),使用大于16位的有符號整型比較快。因為x86構架中提供了從有符號整型轉化到浮點(diǎn)型的指令,但沒(méi)有提供從無(wú)符號整型轉化到浮點(diǎn)的指令。在整數運算中計算商和余數時(shí),使用無(wú)符號類(lèi)型比較快。

  3.3 Instruction flow optimization指令流優(yōu)化

  第三層優(yōu)化的目標是低級指令流。比較常見(jiàn)的技術(shù)是循環(huán)合并(loop merging),循環(huán)展開(kāi)(unrolling),軟件流水(software pipelining)。

  3.3.1循環(huán)合并

  如果兩個(gè)循環(huán)計數差不多、循環(huán)執行互不相同的操作,可以把它們合并在一起組成一個(gè)循環(huán)。當兩個(gè)循環(huán)的負荷都不滿(mǎn)時(shí),這是非常有用的。

  3.3.2循環(huán)展開(kāi)

  循環(huán)展開(kāi)就是把循環(huán)計數小的循環(huán)展開(kāi),成為非循環(huán)形式的串行程序,或者把循環(huán)計數大的循環(huán)部分展開(kāi),減少循環(huán)迭代次數,這樣可以節省了用于循環(huán)設置、初始化、增加和校對循環(huán)計數器的時(shí)間。大多數編譯器可以自動(dòng)完成這項工作,手工編譯會(huì )出現錯例如:

  for( int i = 0; i < 3; i++ ) array[i] = i;

  邏輯上等同于:

  array[0] = 0; array[1] = 1, array[2] = 2;

  3.3.3軟件流水

  軟件流水是用來(lái)安排循環(huán)指令,使這個(gè)循環(huán)多次迭代并行執行的一種技術(shù)。在嵌套循環(huán)中,編譯器僅對最里面的循環(huán)執行軟件流水,因此對執行周期很少的內循環(huán)作循環(huán)展開(kāi),外循環(huán)進(jìn)行軟件流水,這樣可以改進(jìn)C代碼并行執行的性能。使用軟件流水還應當注意:盡管軟件流水循環(huán)可以包含內聯(lián)函數,但是不能包含函數調用;在循環(huán)中不可以有條件終止指令;在循環(huán)體中不可以修改循環(huán)控制變量。

  4 總結語(yǔ)

  現代的C和C++編譯器都提供了一定程度上的代碼優(yōu)化。然而,大部分由編譯器執行的優(yōu)化僅涉及執行速度和代碼大小的一個(gè)平衡。你的程序能夠變得更快或者更小,但是不可能又變快又變小。上面介紹的方法主要是為了提高代碼的效率。但是事實(shí)上,在使用這些技術(shù)提高代碼運行速度的同時(shí)會(huì )相應的產(chǎn)生一些負面的影響,比如增加代碼的大小、降低程序可讀性等。不過(guò)你可以讓C/C++編譯器來(lái)進(jìn)行減少代碼大小的優(yōu)化,而手動(dòng)利用編程來(lái)減少代碼的執行時(shí)間。在嵌入式程序設計中合理地使用這幾種技術(shù)有時(shí)會(huì )達到很好 的優(yōu)化效果。

  參考文獻:

  [1]王春寧.嵌入式系統編程源代碼解析[M].北京:電子工業(yè)出版社,2002.

  [2]王田苗.嵌入式系統設計與實(shí)例開(kāi)發(fā)[M].北京:清華大學(xué)出版社,2002.

  [3] Michael Barr.譯者:于志宏 C/C++嵌入式系統編程 [M]. 北京:中國電力出版社,2001.

  [4] Tajana ˇSimuni′c, Luca Benini , Giovanni De Micheli and Mat Hans. Source Code Optimization and Profiling of Energy Consumption in Embedded Systems [J ]. In Proceedings of IEEE International Symposium 誤代碼。

【嵌入式系統編程中的代碼優(yōu)化】相關(guān)文章:

Java中的動(dòng)態(tài)代碼編程06-27

數控編程代碼大全05-18

數控編程M代碼大全10-24

SEO網(wǎng)站代碼優(yōu)化細則06-25

2017嵌入式系統開(kāi)發(fā)工程師綜合編程題07-26

嵌入式系統組成10-20

嵌入式系統介紹01-13

網(wǎng)站代碼優(yōu)化需要注意哪些問(wèn)題10-10

嵌入式系統歷史發(fā)展01-13

嵌入式系統現狀發(fā)展08-16

一级日韩免费大片,亚洲一区二区三区高清,性欧美乱妇高清come,久久婷婷国产麻豆91天堂,亚洲av无码a片在线观看