www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁(yè) > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]目前,C語(yǔ)言和匯編語(yǔ)言的混合編程已經(jīng)在TI公司的TMS320C62X上成為一種最流行的編程方法。闡述了基于TMS320C62X的C語(yǔ)言和匯編語(yǔ)言混合編程應(yīng)遵循的接口規(guī)范以及并行匯編代碼的編寫(xiě)。給出了一個(gè)基于TMS320C62X的運(yùn)動(dòng)補(bǔ)償?shù)幕旌暇幊淘O(shè)計(jì)實(shí)例。

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

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

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

  (1)采用C語(yǔ)言和匯編語(yǔ)言混合編程時(shí),TMS320C62X定義了一套嚴(yán)格的寄存器規(guī)則。這個(gè)寄存器規(guī)則表明了編譯器如何使用這些寄存器以及在函數(shù)調(diào)用過(guò)程中如何保護(hù)這些寄存器。

  調(diào)用函數(shù)保護(hù)了寄存器A0~A9和B0~B9,這就使得在編寫(xiě)匯編程序的時(shí)候可以任意的使用這幾個(gè)寄存器而不需保護(hù)它們。但當(dāng)使用到寄存器A10~A15或B10~B15的時(shí)候,則必須自行對(duì)它們進(jìn)行保護(hù)。長(zhǎng)型、雙精度型或者是長(zhǎng)雙精度型的數(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ù)頁(yè)指針寄存器,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ù)是長(zhǎng)型、雙精度型或者是長(zhǎng)雙精度型,則將參數(shù)依次放入寄存器組A5:A4、B5:B4、A7:A6等,并將剩下的變量按相反的順序放在堆棧里。注意,如果傳遞的參數(shù)是一個(gè)結(jié)構(gòu)類型的參數(shù),則傳遞的是該結(jié)構(gòu)類型的地址?!?/P>

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

  (4)編譯器為所有的外部對(duì)象指定一個(gè)鏈接時(shí)的名字。當(dāng)寫(xiě)匯編語(yǔ)言代碼時(shí),必須用與這個(gè)名字相同的名字。對(duì)于只在匯編語(yǔ)言模塊中用到的變量的標(biāo)識(shí)符,不能從下劃線開(kāi)始。任何一個(gè)在匯編語(yǔ)言中聲明的對(duì)象都要使其在C/C++中是可訪問(wèn)的,那么在匯編語(yǔ)言中必須用.def 或.global將其聲明為外部變量。同樣在匯編語(yǔ)言中要引用C/C++函數(shù)或?qū)ο髸r(shí),必須用.ref 或.global將C/C++對(duì)象聲明,這將產(chǎn)生一個(gè)在匯編語(yǔ)言函數(shù)中沒(méi)有定義的由鏈接器辨識(shí)的外部引用。

  還有一些細(xì)節(jié)也需要注意,如中斷子程序必須把該子程序?qū)⒁玫降乃屑拇嫫鬟M(jìn)行入棧處理;除了全局變量的初始化外,匯編語(yǔ)言的模塊不得因?yàn)槿魏文康亩褂?cinit段;匯編代碼的結(jié)束需用指令B.s2 B3將程序執(zhí)行從被調(diào)用函數(shù)返回到C語(yǔ)言調(diào)用函數(shù)中。

2 并行匯編代碼的編寫(xiě)

  C6000的匯編代碼格式如下:

標(biāo)號(hào): 并行標(biāo)記  [條件寄存器]指令助記符 功能單元  操作數(shù) ;注釋。如:

       LDW  .D2  *B4,B2

       ||  [A1]SHL   .S2X  A4,B4 ;用到了交叉數(shù)據(jù)通道

  TMS320C62X片內(nèi)有8個(gè)并行的處理單元,分為相同的兩組。其體系結(jié)構(gòu)采用超長(zhǎng)指令字(VLIW)結(jié)構(gòu),一個(gè)指令包里的8條并行指令可同時(shí)分配到8個(gè)處理單元并行運(yùn)行。這種一個(gè)指令包里有8條指令并行執(zhí)行也給并行匯編代碼的編寫(xiě)帶來(lái)很多要考慮的問(wèn)題,具體如下:  

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

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

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

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

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

  (6)在一個(gè)指令周期內(nèi)對(duì)同一寄存器讀取多于四次是不允許的,但條件寄存器不在此限制之列。在一個(gè)指令周期內(nèi),不能 同時(shí)存在兩條寫(xiě)入同一寄存器的指令,只有在寫(xiě)操作不是在同一個(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分量都是整象素長(zhǎng)度,則直接在參考幀中找出參考?jí)K。如果為半象素長(zhǎng)度,則需要通過(guò)內(nèi)插運(yùn)算計(jì)算出參考?jí)K,計(jì)算出的參考?jí)K需要加上解碼得出的誤差塊才能得到當(dāng)前參考?jí)K。本文給出了運(yùn)動(dòng)矢量的X分量和Y分量都是整象素長(zhǎng)度時(shí)的運(yùn)動(dòng)補(bǔ)償方法。根據(jù)運(yùn)動(dòng)矢量可直接在參考幀中找到參考?jí)K(8×8)。完成此功能的C語(yǔ)言函數(shù)如下:

void mc_case_a2(unsigned  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è)字,長(zhǎng)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ǔ)償來(lái)重構(gòu)圖像,這是一個(gè)很費(fèi)時(shí)的操作,而且其代碼也是圖像處理中的核心代碼,這樣就要求編寫(xiě)高效的程序來(lái)完成此操作。為了使代碼的運(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程序中不能用和匯編程序同樣的方法來(lái)對(duì)程序進(jìn)行優(yōu)化),如運(yùn)動(dòng)矢量除以4以后的余數(shù)為1,為了使要取的8個(gè)象素對(duì)準(zhǔn)字訪問(wèn)方式,則要按圖1進(jìn)行操作。

 

  根據(jù)運(yùn)動(dòng)矢量參數(shù)進(jìn)行移位使其對(duì)準(zhǔn)字訪問(wèn)的核心代碼的程序?yàn)?

    MVK     .S2  0xFFFC,temp        ;獲得地址的LSB位

    ADD     .L1X  pSrc,offset,pSrc      ;參考?jí)K第一個(gè)元素的地址

    AND     .L2X pSrc,temp,tmp_pSrc     ;字對(duì)準(zhǔn)訪問(wèn)的地址

    AND     .S1  0x0003,pSrc,rshiftA    ;用兩個(gè)LSB位得

                                        ;到了需右移幾個(gè)字

  SUB   .L1  0x04,rshiftA,lshiftA   ;需左移幾個(gè)字

  MPY    .M1  rshiftA,8,rshiftA ;需右移的#bit數(shù)

  MPY     .M1  lshiftA,8,lshiftA ;需左移的#bit數(shù)

  作為一個(gè)說(shuō)明C語(yǔ)言與匯編程序混合編程的設(shè)計(jì)例子,采用并行匯編實(shí)現(xiàn)了這個(gè)函數(shù)的優(yōu)化。這里只給出部分匯編程序:

  .text                     ;將該段匯編代碼安排在.text

                               段,當(dāng)然通過(guò)在C語(yǔ)言中用

                              #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中的操作過(guò)程

    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  *++stack[1],r_w4

    LDW   .D2T2  *++stack[1],ocsr       ;對(duì)被調(diào)用函數(shù)中自己保護(hù)的寄存器作恢復(fù)處理

    MVC   .S2    ocsr, CSR               ;恢復(fù)中斷環(huán)境

    B     .S2     B3                        ;返回到調(diào)用函數(shù)處

              ……

  在TI CCS上用其庫(kù)函數(shù)CLOCK()對(duì)這個(gè)算法的C語(yǔ)言程序和并行匯編程序分別進(jìn)行了性能測(cè)試。在純C語(yǔ)言中,運(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è)周期。而將其用并行匯編代碼編寫(xiě),其周期數(shù)恒定為33個(gè)指令周期。33個(gè)指令周期的執(zhí)行時(shí)間,對(duì)于這個(gè)函數(shù)基本上是達(dá)到了函數(shù)的最大優(yōu)化。

  由此可見(jiàn),程序的核心算法的代碼用并行匯編程序編寫(xiě),而主體的C語(yǔ)言程序則以函數(shù)調(diào)用的形式調(diào)用這些核心算法的并行匯編函數(shù),是提高程序代碼執(zhí)行效率的一種有效方法。

 

參考文獻(xiàn)

1 TMS320C6000 CPU and Instruction Set Reference Guide. Texas Instruments Incorprated,2000

2 TMS320C600 Programmer’s Guide. Texas Instruments Incorporated, 2001

3 MS320C6000 Optimizing Compiler User’s Guide. Texas Instruments Incorporated,2001

4 任麗香,馬淑芬,李方慧. TMS320C6000系列DSPs的原理與應(yīng)用.北京:電子工業(yè)出版社,2000.7

5 鐘玉琢, 王 琪, 賀玉方.基于對(duì)象的多媒體數(shù)據(jù)壓縮編碼國(guó)際標(biāo)準(zhǔn)-MPEG-4及其校驗(yàn)?zāi)P?北京:科學(xué)出版社,2000

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

成都2022年10月19日 /美通社/ -- 近期,平安養(yǎng)老險(xiǎn)積極籌備個(gè)人養(yǎng)老金的產(chǎn)品設(shè)計(jì)和系統(tǒng)開(kāi)發(fā)工作,發(fā)展多樣化的養(yǎng)老金融產(chǎn)品,推動(dòng)商業(yè)養(yǎng)老保險(xiǎn)、個(gè)人養(yǎng)老金、專屬商業(yè)養(yǎng)老保險(xiǎn)等產(chǎn)品供給。 搭養(yǎng)老政策東風(fēng) ...

關(guān)鍵字: 溫度 BSP 東風(fēng) 大眾

廣東佛山2022年10月19日 /美通社/ -- 空間是人居生活的基礎(chǔ)單元,承載著生存與活動(dòng)的最基本功能。而對(duì)于理想空間的解構(gòu)意義卻在物理性容器之外,體現(xiàn)出人們對(duì)于空間和生活深層關(guān)系的思考,同時(shí)也塑造著人與空間的新型連接...

關(guān)鍵字: 溫度 BSP 智能化 進(jìn)程

上海2022年10月19日 /美通社/ -- 10月17日晚間,安集科技披露業(yè)績(jī)預(yù)告。今年前三季度,公司預(yù)計(jì)實(shí)現(xiàn)營(yíng)業(yè)收入7.54億元至8.33億元,同比增長(zhǎng)60.24%至77.03%;歸母凈利潤(rùn)預(yù)計(jì)為1.73億...

關(guān)鍵字: 電子 安集科技 BSP EPS

北京2022年10月19日 /美通社/ -- 10月18日,北京市經(jīng)濟(jì)和信息化局發(fā)布2022年度第一批北京市市級(jí)企業(yè)技術(shù)中心創(chuàng)建名單的通知,諾誠(chéng)健華正式獲得"北京市企業(yè)技術(shù)中心"認(rèn)定。 北京市企業(yè)技...

關(guān)鍵字: BSP ARMA COM 代碼

北京2022年10月18日 /美通社/ -- 10月14日,國(guó)際數(shù)據(jù)公司(IDC)發(fā)布《2022Q2中國(guó)軟件定義存儲(chǔ)及超融合市場(chǎng)研究報(bào)告》,報(bào)告顯示:2022年上半年浪潮超融合銷售額同比增長(zhǎng)59.4%,近5倍于...

關(guān)鍵字: IDC BSP 數(shù)字化 數(shù)據(jù)中心

上海2022年10月18日 /美通社/ -- 2022年9月5日,是首都銀行集團(tuán)成立60周年的紀(jì)念日。趁著首都銀行集團(tuán)成立60周年與首都銀行(中國(guó))在華深耕經(jīng)營(yíng)12年的“大日子”,圍繞作為外資金融機(jī)構(gòu)對(duì)在華戰(zhàn)略的構(gòu)想和業(yè)...

關(guān)鍵字: 數(shù)字化 BSP 供應(yīng)鏈 控制

東京2022年10月18日  /美通社/ -- NIPPON EXPRESS HOLDINGS株式會(huì)社(NIPPON EXPRESS HOLDINGS, INC.)旗下集團(tuán)公司上海通運(yùn)國(guó)際物流有限公司(Nipp...

關(guān)鍵字: 溫控 精密儀器 半導(dǎo)體制造 BSP

廣州2022年10月18日 /美通社/ -- 10月15日,第 132 屆中國(guó)進(jìn)出口商品交易會(huì)("廣交會(huì)")于"云端"開(kāi)幕。本屆廣交會(huì)上高新技術(shù)企業(yè)云集,展出的智能產(chǎn)品超過(guò)140,...

關(guān)鍵字: 中國(guó)智造 BSP 手機(jī) CAN

要問(wèn)機(jī)器人公司哪家強(qiáng),波士頓動(dòng)力絕對(duì)是其中的佼佼者。近來(lái)年該公司在機(jī)器人研發(fā)方面獲得的一些成果令人印象深刻,比如其開(kāi)發(fā)的機(jī)器人會(huì)后空翻,自主爬樓梯等。這不,波士頓動(dòng)力又發(fā)布了其機(jī)器人組團(tuán)跳男團(tuán)舞的新視頻,表演的機(jī)器人包括...

關(guān)鍵字: 機(jī)器人 BSP 工業(yè)機(jī)器人 現(xiàn)代汽車

南京2022年10月17日 /美通社/ -- 日前《2022第三屆中國(guó)高端家電品牌G50峰會(huì)》于浙江寧波落幕,來(lái)自兩百余名行業(yè)大咖、專家學(xué)者共同探討了在形勢(shì)依然嚴(yán)峻的當(dāng)下,如何以科技創(chuàng)新、高端化轉(zhuǎn)型等手段,幫助...

關(guān)鍵字: LINK AI BSP 智能家電

單片機(jī)

21600 篇文章

關(guān)注

發(fā)布文章

編輯精選

技術(shù)子站

關(guān)閉