【DM642】H.264源代碼在DM642上的移植

    TI公司提供了用於C語言開發的CCSCode Composer Studio),該平臺包括了優化的ANSI編譯器,使之可以使用C語言開發DSP程序。這種方法不僅使DSP開發的速度大大加快,而且DSP程序的可讀性和可移植性大大增加,程序修改也很方便。由於CCSDSP的專用開發環境,因此CCS下的C與一般計算機使用的C又有所區別,主要表現在:DSPC語言不包括同外設聯繫的擴展部分;DSPC語言的編譯過程分兩步:首先把C編譯爲彙編(asm)代碼,再把彙編代碼編譯爲可執行(obj)代碼,C和彙編代碼直接對應,關係非常明確,便於人工優化;DSP的代碼需要絕對定位,主機的C的代碼由操作系統定位;DSPC代碼效率較高,非常適合於嵌入式系統。

 

移植過程中主要應解決如下問題:

 

1. 庫文件的改動

 

因爲CCS是對應DSP專用的開發環境,其支持庫也和DSP硬件相聯繫,所以對VC的部分庫函數包含的頭文件要做相應的改變,使其適應CCS運行環境。例如VC中支持的malloccalloc等動態存儲分佈函數,在CCS中都包含在stdlib庫中,因此,必須對原來的include文件進行修改。

 

2. 變量存取方式的調整

 

CCS中程序按段式存儲,各主要段存放內容如下:

 

.text:存放可執行代碼

 

.cinit:存放初始化全局變量和靜態變量表

 

.switch:用於存放分支跳轉表

 

.bss:存放靜態和全局變量

 

.far:用於存放聲明爲far調用的全局和局部變量

 

.stack:存放系統棧

 

.system:存放動態存儲空間分配堆

 

CCSC編譯器支持兩種內存模式:小模式和大模式。不同的內存模式影響對.bss段變量的訪問。程序中的全局和靜態變量都分佈在.bss段內,小模式下,其總和不能超過32K

 

3. 數據類型的調整

 

CCS沒有定義long long類型long表示40長整型,double表示64位浮點型;而在VClongint都表示32位整型。因爲C64系列通用寄存器均爲32位,訪問40位數據時,要對兩個寄存器進行讀寫操作,從節約CPU處理時間角度考慮,應對其進行相應的數據類型調整。

 

4. 存儲空間的分配

 

CCS中,存儲空間的分配是通過配置.cmd文件實現的。存儲空間分配前,必須瞭解芯片整個可用的內外存儲空間大小。編譯後程序跑飛一般是因爲是對不存在的存儲區訪問造成的。一般來說,有些調用比較頻繁的執行代碼要放在片內,提高代碼的執行速度。

 

其次,要重新分配堆(heap)和棧(stack)的大小。通過.cmd文件中設置-heap-stack可以實現大小的配置。heap用於動態存儲空間的分配,對應於.system段,stack用於保存函數的返回地址,對應於.stack段。在視頻解碼過程中,存儲參考幀及其它結構體需要很大的動態存儲開銷,應儘量多分配heap空間,而DM642片內存儲空間只有1M,所以heap空間只能開在片外32M的空間中。Stack空間的分配可以根據使用情況而定,程序不正常跑飛時應注意檢查是否堆棧溢出。

 

5. 部分結構的初始化

 

未賦初值的結構體成員在VC中會被自動初始化爲0,而在CCS中卻不會被初始化,通常會是一個比較大的數,如果不進行初始化程序就容易出錯。因此,要對一些結構進行必要的初始化。

 

6. 數據寬度的調整

 

DM642中,寄存器都是32位大小,一次可以同時處理32bit數據。如果程序中的存儲地址不是合法的32位字地址,在程序裝入數據的時候,LDW指令會對這個地址自動進行調整使之成爲一個合法的字地址。

 

7.冗餘代碼的刪除

 

 

PC機上實現的的代碼裏面有許多和DSP上實現無關的代碼,可以進行刪除處理,以提高代碼執行效率。例如,原始代碼中有大量debug信息,trace信息,assert信息以及printf函數等,這些都是代碼編寫過程中調試所需要的信息,在實現到DSP端時,可以刪除掉。還有一些數據分析計算的函數,如計算SNR的函數以及大量的統計函數,運算量也頗大,而這些函數對於我們實現一個緊湊的編碼系統則可以不予考慮,沒必要由DSP來同步完成。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章