36 ARM C程序設計優化ppt課件_第1頁
36 ARM C程序設計優化ppt課件_第2頁
36 ARM C程序設計優化ppt課件_第3頁
36 ARM C程序設計優化ppt課件_第4頁
36 ARM C程序設計優化ppt課件_第5頁
已閱讀5頁,還剩25頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、嵌入式系統程序設計大連理工大學軟件學院嵌入式系統工程系賴曉晨ARM C程序設計優化編譯器的特性數據類型對程序效率的影響循環方式對程序效率的影響指針對程序效率的影響邊境對齊對程序的影響一、編譯器的特性void setzero(char *p, int n) for ( ; n0; n-) *p=0; p+; 去除從字符型指針p開場的n個字節空間編譯器的特性(續)void setzero(char *p, int n) for ( ; n0; n-) *p=0; p+; 問題:編譯器不知道n能否為0。編譯器不知道p能否4字節對齊。編譯器不知道n能否為4的倍數。結論:編譯器是保守的:必需假定n的一切

2、能夠值。必需假定p一切能夠的邊境值。編寫高效C代碼的要求了解哪些方面編譯器是保守的了解編譯器對應的處置器體系構造二、數據類型對程序效率的影響 unsigned char i; for (i=0; i100; i+) i聲明為unsigned char的優點?無符號字符變量表示的范圍超越了100,可以完成標題要求。char更節省存放器和內存空間。函數參數類型總體思想:盡量采用int、long類型。有符號數和無符號數假設程序中只需加、減、乘法,那么有符號數和無符號數的執行效率沒有區別。假設有除法,那么需求額外的步驟。有符號數和無符號數續有符號除法 在ARM C中,假設x是負數,那么除2操作不是一個

3、右移操作。例如-3/2=-1。但是在ARM機器中:11111101-311111110-2-111111111直接右移加1右移結論:運用無符號數除法效率更高。對于存放在存放器中的變量,盡量采用整型。盡能夠運用無符號數進展運算。函數參數和前往值盡量采用整型數據。總結三、循環方式對程序效率的影響循環是代碼優化的重點C程序主要運用for和while進展循環固定次數的循環什么是ARM上編寫for循環最高效的方法?固定次數的循環續 int i; for (i=0; i0; i-) 上面代碼要實現轉移需求兩條指令,首先把某存放器的內容和100比較,其次條件符合時轉移。一樣功能的代碼假設寫作下面方式,那么可

4、用“BNE一條指令實現比較以及轉移兩個功能。至少一次循環對于“for(;n0;n-),假設能確保第一次循環之前n恒大于0,此時取消第一次n大于0的判別,是不會影響程序的邏輯,而且顯然程序執行效率可以提高,用dowhile循環可以到達這一目的循環展開循環開銷反復100次,假設每次循環開銷占用4個時鐘周期,循環體中的加法占用1個時鐘周期,那么有效程序僅占CPU執行時間的20%,其他80%都是效力性開銷,效率為1/5。 int i,t=0; for (i=100; i0; i-) t+; 循環展開(續) int i,t=0; for (i=50; i0; i-) t+;t+; 每次循環開銷4個時鐘周

5、期不變,但是有效程序占用2個時鐘周期,也即效率提高到1/3。循環展開(續)問題:循環展開到什么程度?全部展開能否最優?要認識到循環展開是有代價的:添加程序的長度。循環體內代碼越多,就越有能夠呵斥cache失效所以在任何程度上展開循環要詳細問題詳細分析,在執行時間和代碼量間找到一個最正確平衡點。總結:循環計數遞減。如確定循環次數大于1,那么用dowile。對于小循環體,可以循環展開。四、指針對程序效率的影響別名當兩個指針指向同一個對象時,這兩個指針被稱作該對象的別名。編譯器的特點:不知道能否是別名編譯器是悲觀的指針對程序效率的影響續void throwtobag(int *mybag, int

6、*yourbag, int *stone) *mybag += *stone;/語句1 *yourbag += *stone;/語句2站在編譯器的角度思索一下有無問題?指針對程序效率的影響續上面代碼的語句1被GCC編譯時,會出現諸如“LDR ri,r2,#0之類匯編指令,表示首先要從stone指向的地址讀出一個數據,以便來把它加到mybag指向指明的地址處。此處r2代表stone,由于它是函數的第三個參數,輪到r2來承載它。令人驚奇的是,編譯語句2時,依然包含一條“LDR ri, r2,#0語句,stone的值不是曾經由語句1得到了嗎?為什么還要這一條語句?指針對程序效率的影響續討論:編譯器不

7、會自動識別指針指向的對象不知道能否是別名悲觀、保守思索:采用什么方法可以防止讀兩次內存?五、邊境對齊對程序的影響邊境對齊問題_packed關鍵字邊境對齊問題對齊問題對構造體也有影響。在構造體中定義假設干變量假設長短相間,由于對齊問題,勢必浪費一些空間。例如一個整形變量和一個字符變量放在一同,總共占用8個字節空間,但是其中保管有效數據的只需5個字節。所以可以采用這種戰略:在構造體的最前面定義的一切的字符型變量,中間定義一切的短整型變量,最后定義一切的整形變量,可以把浪費的空間減到最小。_packed關鍵字有的C編譯器支持_packed關鍵字,它可以突破邊境對齊的限制,在恣意類型的變量按照恣意順序定義的情況下,都可以緊湊的安排存儲空間,此時的代價是犧牲程序的運轉效率_packed關鍵字續代碼完成從恣意地址p處讀取一個整型變量,且不要求此地址是4的整數倍,前往值為此地址起始的4字節數據。 int fetchint(_packed int *p) return *p; _packed關鍵字續上圖是上述代碼的實例,數據按照小端存儲

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論