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

TMS320C62X DSP的混合編程研究

發布時間:2010-11-25 12:00    發布者:eetech
關鍵詞: dsp , TMS320C62X , 混合編程
TMS320C62X是美國德州儀器公司TI的新一代高性能定點數字信號處理器(DSP)芯片。基于DSP的軟件設計問題,就是采用編程語言進行算法實現并使程序效率盡量滿足實時性要求。TI DSP的軟件設計可以采用匯編語言、高級語言C/C++ 以及C語言與匯編語言的混合編程。完全采用匯編語言編程復雜性高、開發周期長,而完全采用C語言編程則程序的執行效率相對較低,不能滿足實時性的要求。為了設計出性價比最好、開發周期較短、比較復雜的DSP系統,可以采用混合語言編程,把C語言和匯編語言的優點有效地結合起來。C語言和匯編語言的混合編程有三種形式:在編寫C語言代碼中插入匯編語句只需在匯編語句兩邊加上雙引號和括號,在括號前面加上標識asm,如asm“匯編語句” ;在編寫C代碼的過程中調用內聯函數TMS320C62X中有一些直接映射為內聯的C6000指令的特殊函數,內聯函數用前下劃線_ 表示,使用時同調用C語言的庫函數一樣調用它,如b=_nassertN>=10 ;匯編代碼以C代碼可以調用的函數出現。本文采用第三種形式。為了使程序代碼的執行具有盡可能高的執行效率,本文將著重點放在并行匯編代碼的編程,而不是線性匯編代碼的編程。

1 C語言與匯編語言混合編程的接口規范和標準

用C語言編寫的代碼中核心代碼常常只是整個程序代碼的5%,但是卻占用了整個程序約95%的執行時間。對這些核心代碼采用匯編語言編寫,可以大大提高代碼的執行效率,而C語言程序可以象調用C程序的一個函數那樣去調用這個匯編函數。為了實現C語言和匯編語言的混合編程,需要注意一些規定的接口規范和標準。

(1)采用C語言和匯編語言混合編程時,TMS320C62X定義了一套嚴格的寄存器規則。這個寄存器規則表明了編譯器如何使用這些寄存器以及在函數調用過程中如何保護這些寄存器。 調用函數保護了寄存器A0~A9和B0~B9,這就使得在編寫匯編程序的時候可以任意的使用這幾個寄存器而不需保護它們。但當使用到寄存器A10~A15或B10~B15的時候,則必須自行對它們進行保護。長型、雙精度型或者是長雙精度型的數據對象要放在一個奇/偶寄存器對(如A1:A0)里,奇數寄存器存放著數據的符號位、指數位和最高有效位,而偶數寄存器則存放著低有效位。 在默認情況下,A3用作返回結構指針寄存器,B3用作被調用函數返回地址寄存器,A15用作幀指針寄存器,B14用作數據頁指針寄存器,B15用作堆棧指針寄存器。這些寄存器在被調用的匯編函數中用到時都要進行保護。

(2)調用函數將參數傳遞到被調用函數中,前十個參數將被從左到右依次放入寄存器A4、B4、A6、B6、A8、B8、A10、B10、A12和B12,如果傳遞的參數是長型、雙精度型或者是長雙精度型,則將參數依次放入寄存器組A5:A4、B5:B4、A7:A6等,并將剩下的變量按相反的順序放在堆棧里。注意,如果傳遞的參數是一個結構類型的參數,則傳遞的是該結構類型的地址。

(3)如果在C/C++調用函數中做了正確的函數返回聲明,則被調用的匯編函數可以返回有效值。如果返回值是整型或32位的浮點型,則放在寄存器A4中返回;如果返回值是雙精度或是長雙精度型,則放在A5:A4中返回;如果返回值是一個結構類型,則將其結構的地址放在A3中返回。

(4)編譯器為所有的外部對象指定一個鏈接時的名字。當寫匯編語言代碼時,必須用與這個名字相同的名字。對于只在匯編語言模塊中用到的變量的標識符,不能從下劃線開始。任何一個在匯編語言中聲明的對象都要使其在C/C++中是可訪問的,那么在匯編語言中必須用.def 或.global將其聲明為外部變量。同樣在匯編語言中要引用C/C++函數或對象時,必須用.ref 或.global將C/C++對象聲明,這將產生一個在匯編語言函數中沒有定義的由鏈接器辨識的外部引用。 還有一些細節也需要注意,如中斷子程序必須把該子程序將要用到的所有寄存器進行入棧處理;除了全局變量的初始化外,匯編語言的模塊不得因為任何目的而使用.cinit段;匯編代碼的結束需用指令B.s2 B3將程序執行從被調用函數返回到C語言調用函數中。 2 并行匯編代碼的編寫 C6000的匯編代碼格式如下: 標號: 并行標記 條件寄存器指令助記符 功能單元 操作數 ;注釋。如: LDW  .D2 B4,B2 || A1SHL .S2X A4,B4 ;用到了交叉數據通道 TMS320C62X片內有8個并行的處理單元,分為相同的兩組。其體系結構采用超長指令字(VLIW)結構,一個指令包里的8條并行指令可同時分配到8個處理單元并行運行。這種一個指令包里有8條指令并行執行也給并行匯編代碼的編寫帶來很多要考慮的問題?具體如下:  

(1)TMS320C62X指令的執行可以用延遲間隙來說明。延遲間隙在數量上等于從指令的源操作數被讀取到執行的結果可以被訪問所用的指令周期。如對于乘法指令(MPY),源操作數從第i個周期被讀取,則其計算結果在第(i+2)個周期才可用。

(2)使用相同功能單元的兩條指令不能被安排為并行指令。

(3)使用同一條交叉通路的兩條指令不能被安排在同一個執行指令包中,這是因為從寄存器組A~B或者從B~A都只有一條交叉通路。

4 將數據讀入到(或存儲自)相同寄存器組的兩條讀(寫)指令不能被安排在同一個執行包中。

5 每一個執行包里只能允許每一寄存器組處理一個長定點類型數據。

6 在一個指令周期內對同一寄存器讀取多于四次是不允許的,但條件寄存器不在此限制之列。在一個指令周期內,不能同時存在兩條寫入同一寄存器的指令,只有在寫操作不是在同一個指令周期發生時,才可以將具有同一目的地址的兩條指令安排并行。

3 基于TMS320C62X的運動補償的混合編程設計實例

運動補償是MPEG-4標準中的一種重要算法。運動補償是指根據運動矢量在參考幀中找出參考塊。如果運動矢量的X分量和Y分量都是整象素長度,則直接在參考幀中找出參考塊。如果為半象素長度,則需要通過內插運算計算出參考塊,計算出的參考塊需要加上解碼得出的誤差塊才能得到當前參考塊。本文給出了運動矢量的X分量和Y分量都是整象素長度時的運動補償方法。根據運動矢量可直接在參考幀中找到參考塊(8%26;#215;8)。完成此功能的C語言函數如下: void mc_case_a2unsigned char pSrc short SrcOffset short SrcWidth unsigned char pDst short RoundCtrl   …… for i=0 i<8 i++   tmp_P_Dst+i  = tmp_P_Src+i  ...... } } 參數運動矢量SrcOffset對4(4個字節為一個字,長32位)的余數可能是0、1、2、3。當余數是0的時候,編譯后執行代碼是按字讀取(LDW)的,這充分體現了TMS320C62X的優點,也使程序的運行效率比較高。而當余數不為0的時候,則可能是按字節讀取(LDB)或是按半字讀取(LDH),這使程序的運行效率較低。視頻的編碼和解碼都要用到運動補償來重構圖像,這是一個很費時的操作,而且其代碼也是圖像處理中的核心代碼,這樣就要求編寫高效的程序來完成此操作。為了使代碼的運行效率更高,且結合TMS320C62X的硬件特點,希望對于不同的運動矢量,做運動補償的時候都能采用按字讀取和存儲的方式。這需要對運動矢量參數除以4,根據余數調整指針,使指針始終指向字對齊方式?而在C程序中當前塊是char型的以字節方式存儲的,對其進行移位處理只能是一個字節一個字節地進行移位,這就使得在C程序中不能用和匯編程序同樣的方法來對程序進行優化 ,如運動矢量除以4以后的余數為1,為了使要取的8個象素對準字訪問方式,則要按圖1進行操作。




根據運動矢量參數進行移位使其對準字訪問的核心代碼的程序為: MVK .S2  0xFFFCtemp  ;獲得地址的LSB位 ADD   .L1X pSrcoffsetpSrc ;參考塊第一個元素的 地址 AND   .L2X pSrctemptmp_pSrc ;字對準訪問的地址 AND   .S1  0x0003pSrcrshiftA ;用兩個LSB位得 ;到了需右移幾個字 SUB  .L1  0x04rshiftAlshiftA ;需左移幾個字 MPY  .M1  rshiftA8rshiftA ;需右移的#bit數 MPY  .M1  lshiftA8lshiftA ;需左移的#bit數 作為一個說明C語言與匯編程序混合編程的設計例子,采用并行匯編實現了這個函數的優化。這里只給出部分匯編程序: .text ;將該段匯編代碼安排在.text 段,當然通過在C語言中用 #program_section也可以將其安排 在其它自己命名的段中。 .global mc_case_a  ;函數名,用.def或.gloal對其進行 聲明,使得C代碼調用該函數 _mc_case_a  ;標號,是C調用函數和匯編 被調用函數的接口處 …… .asg B10,ocsr .asg B11,rw_4  STW .D2 ocsr,stack--1  ;被調用函數用到了 B10~B15,A10 STW .D2 r_w4,stack--1 ;~A15的寄存器,則 需對它們保護 MVC .S2 CSR,ocsr AND .S2 -2,ocsr,ocsr MVC .S2 ocsr,CSR ;關閉某些中斷 …… loop LDW .D2 tmp_pSrc++src_width1,r_w1 ;讀取第一個字 LDW .D1 pSrc++1,r-w2 ;讀取第二個字 LDW .D1 pSrc++src_width2,r-w3 ;讀取第三個字  SHRU .S2 r_w1,rshiftB, r-w1 SHL .S1 r_w3,lshiftA, r_w3 SHL .S2X r_w2,rshiftB,r_w4 SHRU .S1 r_w2,rshiftA, r_w2 OR .L2 r_w1,r_w4, r_w1 OR .L1 r_w1,r_w3,r_w2 ;這幾步作了圖a 中的操作過程 STW .D2 r_w1,pDst++2 STW .D1 r_w2,tmpDst++2 ;存儲取得的兩 個字 B .S2 loop ;延遲跳轉到標號 loop處,實現循環 …… LDW .D2T2 ++stack1,r_w4 LDW .D2T2 ++stack1,ocsr ;對被調用函數 中自己保護的寄 存器作恢復處理 MVC .S2 ocsr CSR   ;恢復中斷環境 B .S2 B3  ;返回到調用函數處 …… 在TI CCS上用其庫函數CLOCK()對這個算法的C語言程序和并行匯編程序分別進行了性能測試。在純C語言中,運動矢量對4的偏移量的余數為0 時約為33個指令周期 余數為1時約為93個指令周期 余數為2 時約為 51個指令周期余數為3 時約為 93個指令周期平均約耗時 67個周期。而將其用并行匯編代碼編寫其周期數恒定為33個指令周期。33個指令周期的執行時間,對于這個函數基本上是達到了函數的最大優化。

由此可見,程序的核心算法的代碼用并行匯編程序編寫,而主體的C語言程序則以函數調用的形式調用這些核心算法的并行匯編函數,是提高程序代碼執行效率的一種有效方法。
本文地址:http://m.qingdxww.cn/thread-41596-1-1.html     【打印本頁】

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

廠商推薦

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

相關視頻

關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产成人aaa在线视频免费观看 | 日韩黄网站 | 欧美精品一区二区三区四区 | 男女一边摸一边做羞羞视频免费 | 午夜精品视频 | 高清不卡一区二区 | 国产日韩精品一区在线不卡 | 动漫免费观看网站 | 精品麻豆| 亚洲一区二区三区高清不卡 | 日本天堂视频在线观看 | 日韩男女视频 | 高清一级毛片免免费看 | 精品一区二区三区在线观看l | 在线免费日韩 | 精品国产综合成人亚洲区 | 亚洲成人在线免费观看 | 四虎网址大全 | 免费人成网 | www.天堂在线观看 | 亚洲毛片在线播放 | 国产精品欧美亚洲日本综合 | 中文字幕亚洲色图 | www.色亚洲| 日韩视频在线免费观看 | 欧美一区二区三区免费不卡 | 中文字幕一区二区三区四区五区 | 久视频在线观看久视频 | 日本在线一区 | 99爱视频免费高清在线观看 | 中文字幕日本一区久久 | 在线播放国产一区二区三区 | 香蕉成人在线视频 | 青青青青草原国产免费 | 99在线观看视频 | 国产成人精品福利网站在线观看 | 一级特黄aaa大片 | 日本福利片国产午夜久久 | 99视频在线精品 | 性8成人有声小说在线播放 性88分钟在线播放 性88分钟 | 黄视频网站免费观看 |