C代碼在TMS320C54X上的手工匯編優(yōu)化._第1頁
C代碼在TMS320C54X上的手工匯編優(yōu)化._第2頁
C代碼在TMS320C54X上的手工匯編優(yōu)化._第3頁
C代碼在TMS320C54X上的手工匯編優(yōu)化._第4頁
C代碼在TMS320C54X上的手工匯編優(yōu)化._第5頁
免費預覽已結束,剩余1頁可下載查看

下載本文檔

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

文檔簡介

1、C代碼在TMS320C54上的手工匯編優(yōu)化1 引言 隨著DSP技術的不斷發(fā)展和完善,數字信號處理的應用范圍越來越廣泛。工控、計算機、通信和消費電子產品中,都會找到它的影子。近年來,隨著多媒體通信的蓬勃發(fā)展,DSP也越來越多的應用在多媒體通信中,而 在多媒體通信中DSP多用于語音壓縮和圖像處理等方面,而這些都需要巨大的 計算量,在實時通信中一些低速 DSPt以滿足要求,而使用高速 DSP會大大提 高成本,所以對代碼進行優(yōu)化是現在 DSP開發(fā)中常用的一種方法。由于 DS P的 特殊結構,編譯器的編譯效率都比較低,難以將 DSP計算能力全部發(fā)揮出來, 所以就必須根據DSP的特殊結構和指令集代碼進行手

2、工的匯編優(yōu)化。本文結合筆者在 TI公司的TMS320VC5402 DSP上的對G.729算法的優(yōu)化經驗,提出一些優(yōu)化的方法和建議,而這些方法也適用其他 54系列的DSP。2 芯片介紹TMS320C54是 TI公司于1996年推出的新一代定點數字處理器,它具有功耗小、高度并行等優(yōu)點,可以滿足電信等眾多領域的實時處理要 求。54系列有很多不同型號的芯片,它們的結構都是一樣的,只是在接口和存 儲器空間上有些不同。在 54系列眾多DSP芯片中 TMS320VC540是使用最廣 泛的一種芯片,接下來將以TMS320VC540為例介紹54系列DSP的性能特點: 線器法 運算速度最高達 100MIPS 具有

3、先進的多總線結構 ,三條 16 位數據存儲器總線和一條程序存儲器總40位算術邏輯單元(ALU,包括一個40位桶形移位器和兩個40位累加一個 17bit X17bit 乘法器和 40位專用加法器,允許 16位帶/不帶符號乘8 個輔助寄存器和一個軟件棧內部采用改進的哈佛結構,程序空間和數據空間分開,允許同時取指令和 取操作數,并且允許在程序和數據空間相互傳送數據 最大64KX16bit外部數據空間,最大1MX 16bit外部程序空間, 4KX 16bit 片內 ROM 16KX 16bit 片內 RAM 內置可編程等待狀態(tài)發(fā)生器、鎖相環(huán)(PLL)時鐘發(fā)生器、兩個多通道緩沖 串口、一個 8位并行與外

4、部處理器通信的 HPI 口、兩個 16位定時器以及 6通道 DMA空制器 支持單指令循環(huán)和塊循環(huán),采用六級流水線,將一條指令執(zhí)行所需要的取指、譯碼、取操作數并執(zhí)行等幾個步驟同時完成,是指令周期降到最小適合算法的優(yōu)化3 代碼優(yōu)化對C代碼進行手工匯編優(yōu)化有三種方法:1.對照C代碼寫出匯 編代碼,這種方法優(yōu)化的效率很高,但是開發(fā)難度很大特別是當代碼量很大, 結構很復雜時優(yōu)化很容易出錯; 2.先用編譯器產生匯編代碼,然后改寫匯編代 碼,這種方法優(yōu)化的效率較低,因為框架被限定了,但是開發(fā)難度降低了,不 容易出錯。由于現在常用的一些音頻、圖像處理算法都是結構很復雜的程序,所以建議使 用第二種優(yōu)化方法。3.

5、1 產生匯編代碼TI公司為DSP開發(fā)者提供一套編譯開發(fā)平臺叫CCS (Code Composer Studio),該工具提供了編譯器可以將 C語言的程序 編譯為DSP的匯編語言程序,然后鏈接生成可以在 DSP上執(zhí)行的COFF格式的 out 文件。而CCS自身也提供優(yōu)化器可對C代碼進行優(yōu)化,并產生匯編語 言程序,具體過程如圖 1 所示。CCS提供了 4級的文件優(yōu)化方案,分別是 00 01、02、03,以下具體說明(1)00 寄存器級別執(zhí)行控制流程簡化 用寄存器分配變量 執(zhí)行交替循環(huán) 排除未用的代碼 簡化公式和表述 擴大對內連函數的調用(2)01 局部級別執(zhí)行所有 00級別的優(yōu)化,并且:執(zhí)行局部常

6、量的傳播 排除未用的賦值 排除局部共用表達式(3) O2 函數級別 執(zhí)行所有01級別的優(yōu)化,并且:執(zhí)行循環(huán)優(yōu)化排除全局共用子表達式 排除全局不用的賦值 執(zhí)行打開循環(huán)(4) O3 文件級別 執(zhí)行所有 01 級別的優(yōu)化,并且:排除未被調用的函數 簡化返回值沒被使用的函數 讓小函數變成內聯調用 保存函數說明,以便主函數被優(yōu)化時知道被調用 函數的屬性 識別文件級別的變量的特性在使用 03級別的優(yōu)化時,還可以使用別的選項執(zhí)行更細致的優(yōu)0LN 得到標準庫函數的文件0NN 創(chuàng)造優(yōu)化信息文件PM 執(zhí)行程序級別優(yōu)化,編譯多個源文件而我們在做優(yōu)化時,選的是 02級別的優(yōu)化,因為使用 02級別優(yōu)化后產生的匯編文件帶

7、有比較多的注釋信息,比較容易看懂程序,建議對程 序不太熟和對匯編語言不太熟練的人使用。3.2 手工匯編優(yōu)化 因為匯編語言可讀性很差,并且代碼量很大,所以手工優(yōu)化工作量很大,并且容易出錯。為了確保優(yōu)化不出錯,我們就先制作一段測試序列 即程序的輸入,然后運行程序對其進行處理,生成一段正確的結果序列,檢驗 手工優(yōu)化是否正確就是用優(yōu)化過的程序對相同的測試序列進行處理,比較生成 的結果序列和正確的結果序列是否一樣,一樣的話就代表優(yōu)化無誤。不過測試 序列要比較長,因為有的錯誤開始不會顯現出來,只是慢慢累積,運行一段時 間才會出現。接下來,就開始手工優(yōu)化的工作。下面就是我對手工優(yōu)化的一些經驗。(1) 盡量少

8、進行函數調用。因為進行函數調用的時候,要將PC壓棧,還要將一些寄存器壓棧,函數調用完后,還要出棧,這都是一些不必 要的操作,所以一些小的函數,就不調用,而是直接寫入主函數里,這樣可以 就可以減少那些壓棧出棧的操作,提高速度。(2) 優(yōu)化循環(huán)時,盡量將一些操作放到循環(huán)外面去,減少操作的次數。例如一些賦值和初始化操作,可以提到循環(huán)外面去做,來提高速度。(3) 去除一些冗余的賦值。編譯器產生的代碼有很多賦值,經常將一個值賦給寄存器,再賦給變量,這樣就產生了冗余。(4) 盡量使用RPT和RPTB來執(zhí)行循環(huán)操作。在編譯器產生的代碼里很多循環(huán)操作是通過條件判別來實現的,這樣就多了很多無用的判別代 碼,而5

9、4X的DSP芯片就提供專門的循環(huán)指令:RPT和RPTB RPT的功能就是 循環(huán)執(zhí)行下一條指令,循環(huán)次數由 RC寄存器的值決定,循環(huán)次數是 RC寄存器 的值加1所以執(zhí)行循環(huán)前要將循環(huán)次數減 1賦給RC寄存器;RPTB是塊循環(huán)指 令,它的功能是循環(huán)執(zhí)行一段指令,它的循環(huán)次數由BRC寄存器決定,循環(huán)次數是BRC的寄存器的值加1,所以使用前需將循環(huán)次數減1賦給BRC寄存器。(5) 使用比較快的尋址方式。在數字信號處理里面,會對大量 的數據進行大量的運算,如果使用比較快的尋址方式會大大減少指令周期。因 為數據大多是順序存放,所以我們用寄存器去尋址,操作完后自加 1 而指向下 個數據,這樣尋址會減少很多指

10、令周期。(6) 使用循環(huán)緩沖區(qū)。因為 FFT, FIR 等常用運算中都需要對 數據進行移位操作,如果數據量大的話,程序花在數據移位上的開銷就很大 了,如果使用循環(huán)緩沖區(qū)就可以不進行這些操作從而提高速度。(7) 使用一些專用指令。在 54 的指令系統里,有一些專用指 令執(zhí)行一些特殊的操作,例如平方, FIR 等,如果用其他指令代替需要多個指 令周期, 而使用專用指令值需要一個指令周期。(8)使用并行指令。因為DSP的流水線結構,可以讓一些指令同時運行,就產生了并行指令,使用并行指令會大大減少指令周期。(9) 將一些常用的程序和數據,放在片內 RAM1行。DSP芯片 上一般都帶有RAM而片內RAM

11、勺尋址速度比片外RAM快一至兩倍,所以將常 用程序和數據放在片內,會大大提高運行速度。3.3 優(yōu)化中常遇見的問題 在手工優(yōu)化過程時會遇到很多問題,以下幾點比較常見。(1) 對一些寄存器的設置。因為是手工優(yōu)化,所以對一些寄存 器都要自己賦值,例如ST0 ST1和PMST等,不同的設置會導致運算結果的不 一樣。其中一些用的比較多的位有 SXM OVM和 FRCT SXM是符號擴展位,如果 SXM=(就不進行符號擴展,如果SXM=B進行符號擴展(見圖2a)。OVMl溢 出模式位,當發(fā)生溢出時,如果 OVM=0出的結果就被送往目的寄存器,如果 OVM=就往目的寄存器送最大的正數(007FFFFFFFh

12、或最小的負數(FF80000000h。FRCT是小數模式位,當FRCT=1寸乘法的結果會左移一位 (見圖2b)。以上3個標志位的置位和復位是由 SSBX和 RSBX指令來完成 的。(2) 注意流水線沖突。 5402的芯片有一個 6 級深度的指令流 水線,這 6 級流水線彼此是獨立的,在任何一個機器周期內,可以有 1 至 6 條 不同的指令在工作。這 6 級流水線的功能分別是預取指、取指、譯碼、尋址、 讀數和執(zhí)行。C5402多級流水線操作可以讓多條指令同時指令訪問 CPU資源, 如果多個流水線同時訪問到相同的資源,就可能發(fā)生流水線沖突,有些沖突可 以由CPU!過延遲尋址的方法自動緩解,而有的沖突

13、是不能防止的,需要由程 序重新安排指令或插入空操作來解決。當用 CCS編譯器對C程序進行編譯的時 候,編譯器會自動加入NOP指令來解決流水線沖突,而進行手工優(yōu)化的時候, 就要特別注意這個問題,大部分流水線沖突都是因為同時訪問到某些寄存器, 只要根據等待周期表加入相應的 NOP指令就可以解決。(3) 對一些參數的保存。在手工優(yōu)化的過程中,我們會用某些還有就是某些標志位的保存,因為在調用函數的過程會 所以在調用完后要將其恢復。寄存器來傳遞數據,而在此過程中,如果調用了別的函數,這些寄存器的值就 有可能被改變,所以在調用這些函數的時候,要先將這些參數壓棧保存,調用 完后再將其出?;謴汀8淖冞@些狀態(tài)標

14、志位,(4)循環(huán)緩沖區(qū)地址分配問題。循環(huán)緩沖區(qū)的地址分配必須對 齊,長度為R的緩沖區(qū)必須從N位地址的邊界開始(即循環(huán)緩沖區(qū)基地址的 N 個最低有效位必須為0), N是滿足2NR的最小的整數。例如,長度 R=31的 循環(huán)緩沖區(qū)必須從地址 XXXX XXXX XXX0 00002 (N=5, 2531,該地址的最 低 5 位為 0)。(5)內存泄漏問題。因為DSP使用的是哈佛結構,數據空間和 程序空間是分開的,一般數據的操作不會影響到程序。但是DSP芯片上都帶有RAM而這些空間數據和程序是共享的,所以對該部分的數據進行操作,如果有 泄漏的話會改寫程序,導致程序跑飛。因此程序跑飛的話,就要考慮是否有內 存泄漏。4 結論以上經驗和技巧均是筆者在實際的 DSP工程中總結得出,實踐 證明對實

溫馨提示

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

評論

0/150

提交評論