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

TMS320C62X DSP的混合編程研究

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

1 C語言與匯編語言混合編程的接口規(guī)范和標(biāo)準(zhǔn)

用C語言編寫的代碼中核心代碼常常只是整個(gè)程序代碼的5%,但是卻占用了整個(gè)程序約95%的執(zhí)行時(shí)間。對(duì)這些核心代碼采用匯編語言編寫,可以大大提高代碼的執(zhí)行效率,而C語言程序可以象調(diào)用C程序的一個(gè)函數(shù)那樣去調(diào)用這個(gè)匯編函數(shù)。為了實(shí)現(xiàn)C語言和匯編語言的混合編程,需要注意一些規(guī)定的接口規(guī)范和標(biāo)準(zhǔn)。

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

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

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

(4)編譯器為所有的外部對(duì)象指定一個(gè)鏈接時(shí)的名字。當(dāng)寫匯編語言代碼時(shí),必須用與這個(gè)名字相同的名字。對(duì)于只在匯編語言模塊中用到的變量的標(biāo)識(shí)符,不能從下劃線開始。任何一個(gè)在匯編語言中聲明的對(duì)象都要使其在C/C++中是可訪問的,那么在匯編語言中必須用.def 或.global將其聲明為外部變量。同樣在匯編語言中要引用C/C++函數(shù)或?qū)ο髸r(shí),必須用.ref 或.global將C/C++對(duì)象聲明,這將產(chǎn)生一個(gè)在匯編語言函數(shù)中沒有定義的由鏈接器辨識(shí)的外部引用。 還有一些細(xì)節(jié)也需要注意,如中斷子程序必須把該子程序?qū)⒁玫降乃屑拇嫫鬟M(jìn)行入棧處理;除了全局變量的初始化外,匯編語言的模塊不得因?yàn)槿魏文康亩褂?cinit段;匯編代碼的結(jié)束需用指令B.s2 B3將程序執(zhí)行從被調(diào)用函數(shù)返回到C語言調(diào)用函數(shù)中。 2 并行匯編代碼的編寫 C6000的匯編代碼格式如下: 標(biāo)號(hào): 并行標(biāo)記 條件寄存器指令助記符 功能單元 操作數(shù) ;注釋。如: LDW  .D2 B4,B2 || A1SHL .S2X A4,B4 ;用到了交叉數(shù)據(jù)通道 TMS320C62X片內(nèi)有8個(gè)并行的處理單元,分為相同的兩組。其體系結(jié)構(gòu)采用超長指令字(VLIW)結(jié)構(gòu),一個(gè)指令包里的8條并行指令可同時(shí)分配到8個(gè)處理單元并行運(yùn)行。這種一個(gè)指令包里有8條指令并行執(zhí)行也給并行匯編代碼的編寫帶來很多要考慮的問題?具體如下:  

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

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

(3)使用同一條交叉通路的兩條指令不能被安排在同一個(gè)執(zhí)行指令包中,這是因?yàn)閺募拇嫫鹘MA~B或者從B~A都只有一條交叉通路。

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

5 每一個(gè)執(zhí)行包里只能允許每一寄存器組處理一個(gè)長定點(diǎn)類型數(shù)據(jù)。

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

3 基于TMS320C62X的運(yùn)動(dòng)補(bǔ)償?shù)幕旌暇幊淘O(shè)計(jì)實(shí)例

運(yùn)動(dòng)補(bǔ)償是MPEG-4標(biāo)準(zhǔn)中的一種重要算法。運(yùn)動(dòng)補(bǔ)償是指根據(jù)運(yùn)動(dòng)矢量在參考幀中找出參考?jí)K。如果運(yùn)動(dòng)矢量的X分量和Y分量都是整象素長度,則直接在參考幀中找出參考?jí)K。如果為半象素長度,則需要通過內(nèi)插運(yùn)算計(jì)算出參考?jí)K,計(jì)算出的參考?jí)K需要加上解碼得出的誤差塊才能得到當(dāng)前參考?jí)K。本文給出了運(yùn)動(dòng)矢量的X分量和Y分量都是整象素長度時(shí)的運(yùn)動(dòng)補(bǔ)償方法。根據(jù)運(yùn)動(dòng)矢量可直接在參考幀中找到參考?jí)K(8%26;#215;8)。完成此功能的C語言函數(shù)如下: 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  ...... } } 參數(shù)運(yùn)動(dòng)矢量SrcOffset對(duì)4(4個(gè)字節(jié)為一個(gè)字,長32位)的余數(shù)可能是0、1、2、3。當(dāng)余數(shù)是0的時(shí)候,編譯后執(zhí)行代碼是按字讀取(LDW)的,這充分體現(xiàn)了TMS320C62X的優(yōu)點(diǎn),也使程序的運(yùn)行效率比較高。而當(dāng)余數(shù)不為0的時(shí)候,則可能是按字節(jié)讀取(LDB)或是按半字讀取(LDH),這使程序的運(yùn)行效率較低。視頻的編碼和解碼都要用到運(yùn)動(dòng)補(bǔ)償來重構(gòu)圖像,這是一個(gè)很費(fèi)時(shí)的操作,而且其代碼也是圖像處理中的核心代碼,這樣就要求編寫高效的程序來完成此操作。為了使代碼的運(yùn)行效率更高,且結(jié)合TMS320C62X的硬件特點(diǎn),希望對(duì)于不同的運(yùn)動(dòng)矢量,做運(yùn)動(dòng)補(bǔ)償?shù)臅r(shí)候都能采用按字讀取和存儲(chǔ)的方式。這需要對(duì)運(yùn)動(dòng)矢量參數(shù)除以4,根據(jù)余數(shù)調(diào)整指針,使指針始終指向字對(duì)齊方式?而在C程序中當(dāng)前塊是char型的以字節(jié)方式存儲(chǔ)的,對(duì)其進(jìn)行移位處理只能是一個(gè)字節(jié)一個(gè)字節(jié)地進(jìn)行移位,這就使得在C程序中不能用和匯編程序同樣的方法來對(duì)程序進(jìn)行優(yōu)化 ,如運(yùn)動(dòng)矢量除以4以后的余數(shù)為1,為了使要取的8個(gè)象素對(duì)準(zhǔn)字訪問方式,則要按圖1進(jìn)行操作。




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

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

本站部分文章為轉(zhuǎn)載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀點(diǎn)和對(duì)其真實(shí)性負(fù)責(zé);文章版權(quán)歸原作者及原出處所有,如涉及作品內(nèi)容、版權(quán)和其它問題,我們將根據(jù)著作權(quán)人的要求,第一時(shí)間更正或刪除。
您需要登錄后才可以發(fā)表評(píng)論 登錄 | 立即注冊(cè)

廠商推薦

  • Microchip視頻專區(qū)
  • 使用SAM-IoT Wx v2開發(fā)板演示AWS IoT Core應(yīng)用程序
  • 使用Harmony3加速TCP/IP應(yīng)用的開發(fā)培訓(xùn)教程
  • 集成高級(jí)模擬外設(shè)的PIC18F-Q71家族介紹培訓(xùn)教程
  • 探索PIC16F13145 MCU系列——快速概覽
  • 貿(mào)澤電子(Mouser)專區(qū)

相關(guān)視頻

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權(quán)所有   京ICP備16069177號(hào) | 京公網(wǎng)安備11010502021702
快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 丝袜秘书ol连裤袜在线播放| a视频免费看| 99久久国产免费福利| 久草大| 嗯呐啊唔高H兽交| 欧美日韩国产高清视频| 欧美性极品xxxxx| 天天干天天射天天| 四虎b7s22c0m| 99视频在线免费| 麻豆狠色伊人亚洲综合网站| 亚洲免费无码中文在线| 夜夜嗨影视| 亚洲成人第一| 亚洲国产精品a一区| 97视频在线免费播放| 漂亮的保姆6在线观看中文| 竹菊精品久久久久久久99蜜桃| 亚洲国产精品美女| 天堂网亚洲| 温茜邹叔在线免费阅读小说| 宅男撸66首页在线观看| 国产毛片女人高潮叫声| 亚洲午夜性春猛交XXXX| 日韩美一区二区三区| 午夜激情福利网| 亚洲ⅴa偷拍在线影院| 97一期涩涩97片久久久久久久| 全黄h全肉细节文在线观看| 欧美亚洲综合一区| 天天干夜夜骑| 四虎在线精品观看免费| 综合 欧美 国产 视频二区| 欧美 日韩 亚洲 在线| 日本看片网址| 天天爱天天色天天干| 亚洲一区色图| 东京热 百度影音| 亚洲精品第一页| 亚洲一区二区三区日本久久九| 日夜夜操|