国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

C代碼在TMS320C54X上的手工匯編優化

發布時間:2010-9-1 09:09    發布者:techshare
關鍵詞: TMS320C54x , 代碼 , 匯編
1 引言

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

本文結合筆者在TI公司的TMS320VC5402 DSP上的對G.729算法的優化經驗,提出一些優化的方法和建議,而這些方法也適用其他54系列的DSP。


2 芯片介紹

TMS320C54X是TI公司于1996年推出的新一代定點數字處理器,它具有功耗小、高度并行等優點,可以滿足電信等眾多領域的實時處理要求。54系列有很多不同型號的芯片,它們的結構都是一樣的,只是在接口和存儲器空間上有些不同。在54系列眾多DSP芯片中 TMS320VC5402是使用最廣泛的一種芯片,接下來將以TMS320VC5402為例介紹54系列DSP的性能特點:

● 運算速度最高達100MIPS
● 具有先進的多總線結構,三條16 位數據存儲器總線和一條程序存儲器總線
● 40位算術邏輯單元(ALU),包括一個40位桶形移位器和兩個40位累加器
● 一個17bit×17bit乘法器和40位專用加法器,允許16位帶/不帶符號乘法
● 8個輔助寄存器和一個軟件棧
● 內部采用改進的哈佛結構,程序空間和數據空間分開,允許同時取指令和取操作數,并且允許在程序和數據空間相互傳送數據
● 最大64K×16bit外部數據空間,最大1M×16bit外部程序空間,4K×16bit片內ROM,16K×16bit片內RAM
● 內置可編程等待狀態發生器、鎖相環(PLL)時鐘發生器、兩個多通道緩沖串口、一個8位并行與外部處理器通信的HPI口、兩個16位定時器以及6通道DMA控制器
● 支持單指令循環和塊循環,采用六級流水線,將一條指令執行所需要的取指、譯碼、取操作數并執行等幾個步驟同時完成,是指令周期降到最小適合算法的優化

3 代碼優化

對C代碼進行手工匯編優化有三種方法:1.對照C代碼寫出匯編代碼,這種方法優化的效率很高,但是開發難度很大特別是當代碼量很大,結構很復雜時優化很容易出錯;2.先用編譯器產生匯編代碼,然后改寫匯編代碼,這種方法優化的效率較低,因為框架被限定了,但是開發難度降低了,不容易出錯。

由于現在常用的一些音頻、圖像處理算法都是結構很復雜的程序,所以建議使用第二種優化方法。

3.1 產生匯編代碼

TI公司為DSP開發者提供一套編譯開發平臺叫CCS (Code Composer Studio),該工具提供了編譯器可以將C語言的程序編譯為DSP的匯編語言程序,然后鏈接生成可以在DSP上執行的COFF格式的out文件。



而CCS自身也提供優化器可對C代碼進行優化,并產生匯編語言程序,具體過程如圖1所示。

CCS提供了4級的文件優化方案,分別是O0、O1、O2、O3,以下具體說明。

(1) O0 寄存器級別

● 執行控制流程簡化
● 用寄存器分配變量
● 執行交替循環
● 排除未用的代碼
● 簡化公式和表述
● 擴大對內連函數的調用

(2) O1 局部級別

執行所有O0級別的優化,并且:

● 執行局部常量的傳播
● 排除未用的賦值
● 排除局部共用表達式

(3) O2 函數級別

執行所有O1級別的優化,并且:

● 執行循環優化
● 排除全局共用子表達式
● 排除全局不用的賦值
● 執行打開循環

(4) O3 文件級別

執行所有O1級別的優化,并且:

● 排除未被調用的函數
● 簡化返回值沒被使用的函數
● 讓小函數變成內聯調用
● 保存函數說明,以便主函數被優化時知道被調用函數的屬性
● 識別文件級別的變量的特性

在使用O3級別的優化時,還可以使用別的選項執行更細致的優化

● OLN 得到標準庫函數的文件
● ONN 創造優化信息文件
● PM 執行程序級別優化,編譯多個源文件

而我們在做優化時,選的是O2級別的優化,因為使用O2級別優化后產生的匯編文件帶有比較多的注釋信息,比較容易看懂程序,建議對程序不太熟和對匯編語言不太熟練的人使用。

3.2 手工匯編優化

因為匯編語言可讀性很差,并且代碼量很大,所以手工優化工作量很大,并且容易出錯。為了確保優化不出錯,我們就先制作一段測試序列即程序的輸入,然后運行程序對其進行處理,生成一段正確的結果序列,檢驗手工優化是否正確就是用優化過的程序對相同的測試序列進行處理,比較生成的結果序列和正確的結果序列是否一樣,一樣的話就代表優化無誤。不過測試序列要比較長,因為有的錯誤開始不會顯現出來,只是慢慢累積,運行一段時間才會出現。

接下來,就開始手工優化的工作。下面就是我對手工優化的一些經驗。

(1) 盡量少進行函數調用。因為進行函數調用的時候,要將PC壓棧,還要將一些寄存器壓棧,函數調用完后,還要出棧,這都是一些不必要的操作,所以一些小的函數,就不調用,而是直接寫入主函數里,這樣可以就可以減少那些壓棧出棧的操作,提高速度。

(2) 優化循環時,盡量將一些操作放到循環外面去,減少操作的次數。例如一些賦值和初始化操作,可以提到循環外面去做,來提高速度。

(3) 去除一些冗余的賦值。編譯器產生的代碼有很多賦值,經常將一個值賦給寄存器,再賦給變量,這樣就產生了冗余。

(4) 盡量使用RPT和RPTB來執行循環操作。在編譯器產生的代碼里很多循環操作是通過條件判別來實現的,這樣就多了很多無用的判別代碼,而54x的DSP芯片就提供專門的循環指令:RPT和RPTB。RPT的功能就是循環執行下一條指令,循環次數由RC寄存器的值決定,循環次數是RC寄存器的值加1,所以執行循環前要將循環次數減1賦給RC寄存器;RPTB是塊循環指令,它的功能是循環執行一段指令,它的循環次數由BRC寄存器決定,循環次數是BRC的寄存器的值加1,所以使用前需將循環次數減1賦給BRC寄存器。

(5) 使用比較快的尋址方式。在數字信號處理里面,會對大量的數據進行大量的運算,如果使用比較快的尋址方式會大大減少指令周期。因為數據大多是順序存放,所以我們用寄存器去尋址,操作完后自加1而指向下個數據,這樣尋址會減少很多指令周期。

(6) 使用循環緩沖區。因為FFT,FIR等常用運算中都需要對數據進行移位操作,如果數據量大的話,程序花在數據移位上的開銷就很大了,如果使用循環緩沖區就可以不進行這些操作從而提高速度。

(7) 使用一些專用指令。在54的指令系統里,有一些專用指令執行一些特殊的操作,例如平方,FIR等,如果用其他指令代替需要多個指令周期,而使用專用指令值需要一個指令周期。



(8) 使用并行指令。因為DSP的流水線結構,可以讓一些指令同時運行,就產生了并行指令,使用并行指令會大大減少指令周期。

(9) 將一些常用的程序和數據,放在片內RAM運行。DSP芯片上一般都帶有RAM,而片內RAM的尋址速度比片外RAM快一至兩倍,所以將常用程序和數據放在片內,會大大提高運行速度。

3.3 優化中常遇見的問題

在手工優化過程時會遇到很多問題,以下幾點比較常見。

(1) 對一些寄存器的設置。因為是手工優化,所以對一些寄存器都要自己賦值,例如ST0、ST1和PMST等,不同的設置會導致運算結果的不一樣。其中一些用的比較多的位有SXM、OVM和FRCT。SXM是符號擴展位,如果SXM=0就不進行符號擴展,如果SXM=1就進行符號擴展(見圖2a)。OVM是溢出模式位,當發生溢出時,如果OVM=0溢出的結果就被送往目的寄存器,如果OVM=1就往目的寄存器送最大的正數(007FFFFFFFh)或最小的負數(FF80000000h)。FRCT是小數模式位,當FRCT=1時乘法的結果會左移一位(見圖2b)。以上3個標志位的置位和復位是由SSBX和 RSBX指令來完成的。




(2) 注意流水線沖突。5402的芯片有一個6級深度的指令流水線,這6級流水線彼此是獨立的,在任何一個機器周期內,可以有1至6條不同的指令在工作。這6級流水線的功能分別是預取指、取指、譯碼、尋址、讀數和執行。C5402多級流水線操作可以讓多條指令同時指令訪問CPU資源,如果多個流水線同時訪問到相同的資源,就可能發生流水線沖突,有些沖突可以由CPU通過延遲尋址的方法自動緩解,而有的沖突是不能防止的,需要由程序重新安排指令或插入空操作來解決。當用CCS編譯器對C程序進行編譯的時候,編譯器會自動加入NOP指令來解決流水線沖突,而進行手工優化的時候,就要特別注意這個問題,大部分流水線沖突都是因為同時訪問到某些寄存器,只要根據等待周期表加入相應的NOP指令就可以解決。




(3) 對一些參數的保存。在手工優化的過程中,我們會用某些寄存器來傳遞數據,而在此過程中,如果調用了別的函數,這些寄存器的值就有可能被改變,所以在調用這些函數的時候,要先將這些參數壓棧保存,調用完后再將其出棧恢復。還有就是某些標志位的保存,因為在調用函數的過程會改變這些狀態標志位,所以在調用完后要將其恢復。

(4) 循環緩沖區地址分配問題。循環緩沖區的地址分配必須對齊,長度為R的緩沖區必須從N位地址的邊界開始(即循環緩沖區基地址的N個最低有效位必須為0),N 是滿足2N>R的最小的整數。例如,長度R=31的循環緩沖區必須從地址XXXX XXXX XXX0 00002(N=5,25>>31,該地址的最低5位為0)。

(5) 內存泄漏問題。因為DSP使用的是哈佛結構,數據空間和程序空間是分開的,一般數據的操作不會影響到程序。但是DSP芯片上都帶有RAM,而這些空間數據和程序是共享的,所以對該部分的數據進行操作,如果有泄漏的話會改寫程序,導致程序跑飛。因此程序跑飛的話,就要考慮是否有內存泄漏。

4 結論

以上經驗和技巧均是筆者在實際的DSP工程中總結得出,實踐證明對實際開發非常有幫助。以筆者對G.729算法優化為例,在優化之前,G.729的運算量為1000MIPS,優化后的運算量為30MIPS,提高了30多倍,可見優化的效果很明顯。以上這些經驗主要是針對TI公司的 54系列,但對于別的型號的DSP也有借鑒作用。
本文地址:http://m.qingdxww.cn/thread-24978-1-1.html     【打印本頁】

本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
您需要登錄后才可以發表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區
  • 使用SAM-IoT Wx v2開發板演示AWS IoT Core應用程序
  • 使用Harmony3加速TCP/IP應用的開發培訓教程
  • 集成高級模擬外設的PIC18F-Q71家族介紹培訓教程
  • 探索PIC16F13145 MCU系列——快速概覽
  • 貿澤電子(Mouser)專區

相關視頻

關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品国产高清嫩草影院| 日本a网站| 青青青草视频| 午夜在线播放| 五月香蕉网| 在线视频免费观看| 国产精品色午夜视频免费看| 欧美做真爱欧免费看| 中国少妇内射XXXHD免费| 天天插天天插| 日本道高清| 亚洲乱码国产一区网址| 亚洲国产成人久久一区二区三区| 最新自拍偷拍视频| 精品人妻无码一区二区三区蜜桃臀 | 亚洲综合图| 亚洲高清视频免费| acg全彩无遮挡口工漫画网址| 达达兔欧美午夜国产亚洲| 男插女高潮一区二区| 综合人妻久久一区二区精品| 亚洲页码| 特一级毛片| 偷拍综合网| 99爱在线观看精品视频| 老师xxxx69动漫| 诱受H嗯啊巨肉各种play| 日本成人黄色片| 四虎国产在线观看| 四虎欧美永久在线精品免费| 在线国产视频| 精品国产中文字幕在线视频| 亚洲国产成人精品无码区5566| 四虎影视免费永久在线观看黄| 日韩精品一区二区三区中文在线 | 完整秽淫刺激长篇小说| 1a级毛片免费观看| 乱码中字在线观看一二区| 中文字幕无码一区二区免费| 热久久免费视频| 天天干天天干天天|