Advanced Interdisciplinary Projects Lab(AIPLab) 討論區

Please login or register.

請輸入帳號, 密碼以及預計登入時間

新聞:

[慶賀]恭喜張清貿醫師升任北榮傳醫科主治醫師-20170201

作者 主題: [期末報告]-Ssystem on chip 95441039  (閱讀 27223 次)

disally

  • Newbie
  • *
  • 文章: 5
    • 檢視個人資料
[期末報告]-Ssystem on chip 95441039
« 於: 十二月 29, 2008, 06:52:04 pm »
資工3C    95441039   葉筱慧


Ssystem on chip
針對嵌入式SoC應用最佳化C語言編程

         開發執行在SoC內的嵌入式處理器核心程式時,通常有兩個主要目的,即讓處理器執行頻率降到最低;以及使記憶體開銷降到最小。這兩項因素的重要性會因不同的計劃而異,而以下兩項關鍵將大幅影響設計團隊滿足這些目標的能力,即開發原始程式的編譯器以最佳化程式碼的效率;以及用於開發原始程式碼的編程風格。本文將深入討論這兩種因素,並提出一些製作小型且快速之C程式的建議。
          編譯器通常由前端和後端兩部份組成。前端通常是指語法和語義的處理過程,後端通常是指最佳化、程式碼產生,以及針對特定處理器的最佳化過程。很多好的編譯器後端依賴於多層的中間表述(IR)。最佳化和程式碼產生從高層(類別輸入程式的句法)到底層逐級地傳遞中間表述。與處理器無關的最佳化一般傾向於在編譯過程早期於較高IR層上實現,而針對特定處理器的最佳化一般傾向於在編譯過程的後期在底層IR上來實現。資訊透過不同IR層向下傳遞,這樣底層最佳化可以充分利用編譯器早期處理得到的高層資訊。
Tensilica針對其Xtensa可配置處理器和Diamond標準處理器的XCC/C++編譯器包含四個基本的最佳化級,從-O0到-O3,對應著不斷提高的最佳化等級。表1描述了這些等級及其相對應的程式碼大小和內部過程分析(IPA)。通常情況下,XCC編譯器一次最佳化一個文件,但是它也可以執行內部過程分析(透過加入IPA的編譯選項)。當在多個原文件上最佳化整個應用程式時,最佳化將會被延遲到鏈接的步驟之後進行。表2描述了目前編譯器(包括XCC編譯器)支援的最佳化內容部份列表。
XCC編譯器還可以利用編譯產生的性能分析數據。性能分析的反饋可以幫助編譯器減輕分支跳轉的延遲。另外,反饋可以讓編譯器只是插入那些最常用的函數(inline),並妥善處理常用程式碼段中暫存器溢出的問題。因此,性能分析反饋允許XCC編譯器在所有地方進行正常最佳化的同時,還可以透過最佳化應用中的臨界部份進行加速。
C語言編碼建議規則
為利用編譯器獲得最佳性能,程式設計師必須像編譯器一樣思考問題,並瞭解C語言和目標處理器之間的關係。以下一些基本原則可協助所有嵌入式程式設計師在不需很大努力的情況下獲得性能更好的編譯程式碼。
1. 觀察編譯後的程式碼
完全瞭解編譯器對全部程式碼如何編譯是不可能的。如果XCC編譯器設置了─S或者-save-temps編譯選項,編譯將產生匯編輸出,同時還有一些為了加強瞭解而添加的註釋。對於那些性能要求很高的程式碼,你可以觀察編譯結果是否符合你的期望。如果不是,請考慮以下規則。
2. 瞭解混淆發生的情況
C語言允許任意使用指針,這增加了混淆出現的機會,這允許程式用很多種方法去引用同一數據對象。如果全局變量的地址被作為子程式的參數傳遞,這個變量可以透過它的名字或透過指針被引用。這就是一種混淆,編譯器必須保守地把這樣的數據對象保存在記憶體中而不是暫存器中,並仔細地保持程式碼中可能引起混淆的變量的存取順序。
3. 指針常常引起混淆
編譯器識別指針指向的目標對象經常會遇到問題。程式設計師可透過使用本地變量幫助編譯器避免混淆,具體方法是使用本地變量儲存依據指針存取獲得的值,因為不直接的作業和調用會影響指針引用的值而非本地變量的值。因此,編譯器會把本地變量放到暫存器中。
4. const和restrict限定詞
_restrict限定詞告訴編譯器可以假設有資格的指針是唯一存取某記憶體或數據對象的方式。透過這個指針的Load和Store作業,將不會引起與這個函數內部其它Load和Store作業的混淆,除非透過這個指針存取。
5. 使用本地變量
這是因為全局變量會在整個程式的生命週期裡面保留數值。編譯器必須認為全局變量可能透過指針被存取。
6. 使用正確的數據類型
C程式設計師對於數據類型一般都會有他們習慣上的假設,但是編譯器卻需要很謹慎地對待這些假設。例如,在幾乎所有現代的電腦架構上,一個unsigned char使用8位元表示從0到255。一個C程式會假設對值為255的unsigned char加1會使其變為0。而實際上,現代32位元處理器不會執行上述的8位元加法,而是進行32位元數值加法。因此,如果一個unsigned char的本地變量進行加法,編譯器必須使用多條指令進行運算以保證加法後的符號擴展。因此,針對各種變量尤其是循環索引的變量,應盡量多的在可以的地方使用int型變量。
另外,許多嵌入式處理器有16位元乘法指令,而缺少32位元乘法指令。在這種情況下,32位元乘法將被仿效執行,一般情況下都是很慢的。如果數據被執行乘法作業並且運算結果不會超過16位元的精密度,那麼就使用short或者unsigned short變量。
7. 不要用不直接的調用
這是透過包含傳遞參數的函數指針的調用,因為那會產生不可預知的邊際效應(如修改全局變量),使最佳化難以進行。
8. 編寫返回數值的函數
9. 傳遞變量時使用數值而不是指針或者全局變量
傳遞大結構的數據時才使用指針。每個透過數值被傳遞的結構都應該在函數調用入口處被完全拷貝儲存過。
10. 使用變量地址
因為本地變量的地址會引起混淆,降低程式性能,與全局變量一樣。
11. 用const聲明指針參數
如果函數體內不會修改到指針指向的對象,就要用const聲明指針參數,這樣可以讓編譯器避免不必要的反面假設。
12. 使用數組而不是指針
13. 編寫簡單易懂的程式碼
編譯器擅長製作複雜的最佳化,如函數嵌入和在適當的時候循環體展開。但編譯器不擅長簡化程式碼,他們不會合併循環或者不用函數嵌入。在原始程式中為了支援某些處理器架構進行的手工循環體展開會降低程式的可移植性,因為這阻止了編譯器自動為其他處理器架構進行正確的循環體展開和函數嵌入。
14. 避免編寫參數數量可變的函數
如果一定要這麼做,使用ANSI標準方法:stdarg.h.。使用數據表替代if-then-else或者switch分支處理。
15. 依靠libc函數庫(比如:strcpy、strlen、strcmp、bcopy、bzero、memset和memcpy)。這些函數是經過精心最佳化的。

參考資料:
http://www.eettaiwan.com/login.do?fromWhere=/ART_8800437317_676964_TA_81216f32.HTM

加分題:

PHP,原文的意思是「PHP: Hypertext Preprocessor」,也就是一種內嵌式的HTML語言。所以,它能如同ASP般,去動態產生網頁,回應給使用者。甚至,它也能當成Linux / UNIX 下的一種「 shell scripts」(不太嚴謹的說法,就當成批次檔來看。不過,PHP具備檔案處理、邏輯運算的能力,功能遠比Windows下的批次檔好太多囉)去運用。
話說回來,實務上,PHP很多時候,會和 Apache (Web服務)、MySQL(資料庫)搭配使用。
這麼說好了......
當使用者看網頁時,提供使用者網頁基礎的服務平台,就是Apache,而 PHP 就去負責資料的處理和運算,MySQL就如同大腦般的儲存各式各樣「整理過」的資訊。所以,我們所看到的PHP網頁,自然能照著某些設定的要求,去呈現 「使用者應該看到」的東東喔!好比「線上訂購明細表」之類的玩意!
嗯......說了那麼多,別忘記,PHP的基礎是內嵌在HTML上,所以,練習前,最好能稍懂HTML喔!
這也是和Java Servlet(也是一種動態網頁技術)很大不一樣的地方。
回到正題,由於PHP在穩定度、執行速度上,一直有不錯的評價,因此,非常值得去注意學習喔!
◎版本
目前的版本已經是 PHP 5.1.6 囉!早在1995年時,PHP的第一個版本,就已經對外公佈,而第二個版本就納入了 mSQL 的支援,加上 PHP 3能和Apache緊密結合,造就了今日PHP在動態網頁上的地位。

參考書籍:
PHP函數參考大全。
http://ossacc.moe.edu.tw/
« 最後編輯時間: 一月 09, 2009, 12:58:47 am 由 disally »
已記錄

admin

  • 管理員
  • Hero Member
  • *****
  • 文章: 1505
    • 檢視個人資料
回覆: [期末報告]-Ssystem on chip 95441039
« 回覆文章 #1 於: 一月 15, 2009, 02:32:28 pm »
OK! 18
已記錄
 

SimplePortal Classic 2.0.5