新聞中心

        EEPW首頁 > 手機與無線通信 > 設計應用 > 基于網絡的嵌入式IP可視電話設計方案

        基于網絡的嵌入式IP可視電話設計方案

        作者: 時間:2012-05-15 來源:網絡 收藏

        第3階段是編寫線性匯編代碼 從C代碼中抽出對性能影響很大的代碼段,用線性匯編重新編寫這段代碼,然后使用匯編優化器優化該代碼。

        2.1 C代碼的開發和優化

        開發過程中要充分利用Tl公司為用戶提供的功能強大的函數庫,比如IMAGE.LIB庫中就包含許多常用函數,可以實現DCT/IDCT變換、DCT量化、自適應濾波等功能。這些函數都是優化過的,完全能夠實現軟件流水,效率很高。另外,開發C語言代碼還需要考慮的要點包括:① 使用適當的數據結構- - 對定點乘法,應盡可能使用short型數據;對循環計數器應使用int或者無符號int 類型。②使用查找表或常數值代替通過直接計算得到結果的語句或函數。

        代碼分析結果顯示DCT、IDCT 、運動估計占程序總運算量的比重很大,因此這部分是程序優化的重點。優化C 代碼包括使用編譯器選項、使用內聯函數、使用軟件流水等。

        (1)向編譯器指明不相關的指令。

        為使指令并行操作,編譯器必須確定指令間的相關性,只有不相關的指令才可并行執行。若編譯器不能確定兩條指令是不相關的,則只能安排它們串行執行。用戶可通過如下方法指明相關的指令:

        ①關鍵字cons t 表示一個變量或一個變量的存儲單元保持不變,使用const 可提高代碼的性能和適應性。

        ②使用-mt 選項向編譯器說明在代碼中不存在存儲器相關性,即允許編譯器在無存儲器相關性的假設下進行優化。

        (2)使用內聯函數(intrinsics)。

        可用內聯函數快速優化C 代碼。如在算術操作中,常對計算的結果做飽和(saturation)處理,使用intrinsics只須調用SADD, 一個指令周期便可得到最終結果。比花費兩個嵌套的條件判斷語句來判斷結果是否溢出,最后得到結果效率要高得多。

        (3)使用軟件流水。

        在編譯時,使用-o2 選項和-o3 選項,編譯器可對循環代碼實現軟件流水。為填滿軟件流水線,軟件流水結構需要執行的最小循環迭代次數稱為最小循環次數。循環總數小于最小循環次數時,執行不流水形式循環; 循環總數大于最小循環次數時,執行軟件流水形式循環。可以使用-ms 選項,使編譯器根據循環次數僅產生一種循環形式; 可使用-o3 和-pm 選項,使優化器訪問整個程序,了解循環次數信息; 使用-nassert 內聯函數,防止冗余循環產生;使用-mh 選項,消除軟件流水循環的排空,從而減小代碼尺寸。

        由于在嵌套循環中編譯器僅對最里面的循環執行軟件流水,因此對于執行周期很少的內循環進行循環展開,對外循環進行軟件流水。

        使用軟件流水應當注意的問題: 盡管軟件流水循環可以包含內聯函數,但不能包含函數調用; 在循環中不使用break 語句; 循環控制變量不能與循環體內的語句有關; 如果循環體內復雜的條件代碼需要超過5 個條件寄存器或者32 個以上寄存器,則這個循環不可進行軟件流水。

        (4)片內存儲器的分配及DMA技術的運用。

        DM643 內部有16 KB 的一級程序緩存、16 KB 的一級數據緩存和256 KB 的程序數據共享二級緩存,遠小于執行程序和待處理圖像數據,不可能將程序和圖像數據都在片內RAM 中緩存,因此合理地配置和使用存儲空間,對系統整體效率影響很大。

        提高算法程序執行速度的關鍵是使核心循環代碼和要訪問的數據在第1 次訪問之后全部發生L1P 和L1D 命中。核心循環代碼占的空間很小,執行過一次之后,完全可以全部在L1P 中緩存,因此,不用考慮代碼如何在存儲器中存放,主要問題是圖像數據的存放。

        由于L1D 采取LRU (Least Recently Used)分配機制,因此對于小于等于16 KB 的連續存放的數據塊可完全在L1D 中命中。以解碼過程為例,IDCT 和運動補償模塊都是以宏塊為單位進行運算的,IDCT 數據類型為short型,運動補償中的預測幀和當前幀的數據類型為unsignedchar 型。計算一個宏塊(420 格式)的IDCT 和運動補償要訪問的數據大小共需1 536 字節,運動補償的數據包括預測宏塊和當前宏塊的數據,實際解碼中以6 個宏塊(10 KB)作為1 次處理對象。待處理的數據要從外部存儲器搬到L2 中連續的存儲空間,可利用EDMA 與CPU 并行工作的特點,采取Ping??Pong 技術,使CPU 在處理Ping空間數據的同時,由EDMA 將下次要處理的數據搬到Pong 空間中; 當CPU 處理Pong 空間數據時,再由EDMA將Ping 空間已處理好的數據搬回外部存儲器,并將下次要處理的數據搬到Ping 空間,這樣就可達到CPU 的最大計算能力。Ping、Pong 空間各占用的大小為20 KB, 兩個總共約40 KB.L2 中的剩余空間分出64 KB 留給數據空間,用于解碼中常用的解碼表、量化步長、輸入壓縮碼流緩沖區和輸出碼流緩沖區等。64 KB 的程序空間用于存儲H. 264 算法中的運動預測、運動補償和中斷服務程序等關鍵代碼。L2 其余部分配置為Cache, 操作與L1D 類似。

        2. 2 編寫線性匯編代碼

        為了提高代碼性能,對影響處理速度的關鍵C 代碼段可以用線性匯編重新編寫。線性匯編代碼類似于匯編代碼,不同的是線性匯編代碼中不需要給出匯編代碼必須指出的所有信息(如所使用的寄存器、指令的并行與否、指令的延遲周期和指令使用的功能單元等),匯編優化器會根據代碼的情況確定這些信息。當然,如果能夠事先確定一些信息(如循環的執行次數、存儲區的地址等),則編寫的線性匯編代碼的效率更高。具體的優化措施如下:

        ①使用偽指令向匯編優化器提供較為詳細的信息。

        ②畫出指令的相關圖,根據相關圖合理分配邏輯單元,最大限度地保證指令的并行執行。

        ③充分使用C64x DSP 提供的強大包處理指令處理數據(包處理指令可同時處理2 個l6 位數據和4 個8 位數據)。本系統中使用了AVGU4、MIN2、M AX2、SPACKU4、PACK2、D0T P2、D0T PN2 和UNPKLU4 等指令。C64x DSP 還提供了STDW(STNDW)、LDDW(LDNDW)指令,可一次存取連續的64 位數據。可利用LDDW 指令,將作1 次行變換所需數據1 次取來,并將處理后的結果利用STDW 指令一次存好。這樣大大縮短了代碼長度,提高了代碼效率。

        ④利用Schedule Table 確定循環的重復間隔,合理安排功能單元,進行軟件的流水。

        linux操作系統文章專題:linux操作系統詳解(linux不再難懂)
        鎖相環相關文章:鎖相環原理


        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 斗六市| 濮阳市| 拉孜县| 益阳市| 高邮市| 中宁县| 三江| 会宁县| 新巴尔虎右旗| 雷波县| 嘉禾县| 黑山县| 新竹县| 三台县| 宁城县| 工布江达县| 乐业县| 甘南县| 巴中市| 衡水市| 丹棱县| 临夏县| 吉林市| 淮南市| 盐津县| 都匀市| 嘉峪关市| 石景山区| 县级市| 南召县| 南华县| 历史| 葫芦岛市| 南京市| 瓦房店市| 时尚| 江津市| 大余县| 大同县| 峨眉山市| 鄄城县|