- 相關(guān)推薦
TMS320C62X DSP的混合編程研究
摘要:目前,C語(yǔ)言和匯編語(yǔ)言的混合編程已經(jīng)在TI公司的TMS320C62X上成為一種最流行的編程方法。闡述了基于TMS320C62X的C語(yǔ)言和匯編語(yǔ)言混合編程應遵循的接口規范以及并行匯編代碼的編寫(xiě)。給出了一個(gè)基于TMS320C62X的運動(dòng)補償的混合編程設計實(shí)例。TMS320C62X是美國德州儀器公司?TI?的新一代高性能定點(diǎn)數字信號處理器(DSP)芯片;冢模樱械能浖O計問(wèn)題,就是采用編程語(yǔ)言進(jìn)行算法實(shí)現并使程序效率盡量滿(mǎn)足實(shí)時(shí)性要求。TI DSP的軟件設計可以采用匯編語(yǔ)言、高級語(yǔ)言?C/C++?以及C語(yǔ)言與匯編語(yǔ)言的混合編程。完全采用匯編語(yǔ)言編程復雜性高、開(kāi)發(fā)周期長(cháng),而完全采用C語(yǔ)言編程則程序的執行效率相對較低,不能滿(mǎn)足實(shí)時(shí)性的要求。為了設計出性?xún)r(jià)比最好、開(kāi)發(fā)周期較短、比較復雜的DSP系統,可以采用混合語(yǔ)言編程,把C語(yǔ)言和匯編語(yǔ)言的優(yōu)點(diǎn)有效地結合起來(lái)。C語(yǔ)言和匯編語(yǔ)言的混合編程有三種形式:在編寫(xiě)C語(yǔ)言代碼中插入匯編語(yǔ)句?只需在匯編語(yǔ)句兩邊加上雙引號和括號,在括號前面加上標識asm,如asm?“匯編語(yǔ)句”?;在編寫(xiě)C代碼的過(guò)程中調用內聯(lián)函數?TMS320C62X中有一些直接映射為內聯(lián)的C6000指令的特殊函數,內聯(lián)函數用前下劃線(xiàn)?_?表示,使用時(shí)同調用C語(yǔ)言的庫函數一樣調用它,如b=_nassert?N>=10?;匯編代碼以C代碼可以調用的函數出現。本文采用第三種形式。為了使程序代碼的執行具有盡可能高的執行效率,本文將著(zhù)重點(diǎn)放在并行匯編代碼的編程,而不是線(xiàn)性匯編代碼的編程。
1 C語(yǔ)言與匯編語(yǔ)言混合編程的接口規范和標準
用C語(yǔ)言編寫(xiě)的代碼中核心代碼常常只是整個(gè)程序代碼的5%,但是卻占用了整個(gè)程序約95%的執行時(shí)間。對這些核心代碼采用匯編語(yǔ)言編寫(xiě),可以大大提高代碼的執行效率,而C語(yǔ)言程序可以象調用C程序的一個(gè)函數那樣去調用這個(gè)匯編函數。為了實(shí)現C語(yǔ)言和匯編語(yǔ)言的混合編程,需要注意一些規定的接口規范和標準。
(1)采用C語(yǔ)言和匯編語(yǔ)言混合編程時(shí),TMS320C62X定義了一套嚴格的寄存器規則。這個(gè)寄存器規則表明了編譯器如何使用這些寄存器以及在函數調用過(guò)程中如何保護這些寄存器。
調用函數保護了寄存器A0~A9和B0~B9,這就使得在編寫(xiě)匯編程序的時(shí)候可以任意的使用這幾個(gè)寄存器而不需保護它們。但當使用到寄存器A10~A15或B10~B15的時(shí)候,則必須自行對它們進(jìn)行保護。長(cháng)型、雙精度型或者是長(cháng)雙精度型的數據對象要放在一個(gè)奇/偶寄存器對(如A1:A0)里,奇數寄存器存放著(zhù)數據的符號位、指數位和最高有效位,而偶數寄存器則存放著(zhù)低有效位。
在默認情況下,A3用作返回結構指針寄存器,B3用作被調用函數返回地址寄存器,A15用作幀指針寄存器,B14用作數據頁(yè)指針寄存器,B15用作堆棧指針寄存器。這些寄存器在被調用的匯編函數中用到時(shí)都要進(jìn)行保護。
(2)調用函數將參數傳遞到被調用函數中,前十個(gè)參數將被從左到右依次放入寄存器A4、B4、A6、B6、A8、B8、A10、B10、A12和B12,如果傳遞的參數是長(cháng)型、雙精度型或者是長(cháng)雙精度型,則將參數依次放入寄存器組A5:A4、B5:B4、A7:A6等,并將剩下的變量按相反的順序放在堆棧里。注意,如果傳遞的參數是一個(gè)結構類(lèi)型的參數,則傳遞的是該結構類(lèi)型的地址。
(3)如果在C/C++調用函數中做了正確的函數返回聲明,則被調用的匯編函數可以返回有效值。如果返回值是整型或32位的浮點(diǎn)型,則放在寄存器A4中返回;如果返回值是雙精度或是長(cháng)雙精度型,則放在A5:A4中返回;如果返回值是一個(gè)結構類(lèi)型,則將其結構的地址放在A3中返回。
(4)編譯器為所有的外部對象指定一個(gè)鏈接時(shí)的名字。當寫(xiě)匯編語(yǔ)言代碼時(shí),必須用與這個(gè)名字相同的名字。對于只在匯編語(yǔ)言模塊中用到的變量的標識符,不能從下劃線(xiàn)開(kāi)始。任何一個(gè)在匯編語(yǔ)言中聲明的對象都要使其在C/C++中是可訪(fǎng)問(wèn)的,那么在匯編語(yǔ)言中必須用.def 或.global將其聲明為外部變量。同樣在匯編語(yǔ)言中要引用C/C++函數或對象時(shí),必須用.ref 或.global將C/C++對象聲明,這將產(chǎn)生一個(gè)在匯編語(yǔ)言函數中沒(méi)有定義的由鏈接器辨識的外部引用。
還有一些細節也需要注意,如中斷子程序必須把該子程序將要用到的所有寄存器進(jìn)行入棧處理;除了全局變量的初始化外,匯編語(yǔ)言的模塊不得因為任何目的而使用.cinit段;匯編代碼的結束需用指令B.s2 B3將程序執行從被調用函數返回到C語(yǔ)言調用函數中。
2 并行匯編代碼的編寫(xiě)
C6000的匯編代碼格式如下:
標號: 并行標記 ?條件寄存器?指令助記符 功能單元 操作數 ;注釋。如:
LDW .D2 ?B4,B2
|| ?A1?SHL .S2X A4,B4 ;用到了交叉數據通道
TMS320C62X片內有8個(gè)并行的處理單元,分為相同的兩組。其體系結構采用超長(cháng)指令字(VLIW)結構,一個(gè)指令包里的8條并行指令可同時(shí)分配到8個(gè)處理單元并行運行。這種一個(gè)指令包里有8條指令并行執行也給并行匯編代碼的編寫(xiě)帶來(lái)很多要考慮的問(wèn)題?具體如下:
(1)TMS320C62X指令的執行可以用延遲間隙來(lái)說(shuō)明。延遲間隙在數量上等于從指令的源操作數被讀取到執行的結果可以被訪(fǎng)問(wèn)所用的指令周期。如對于乘法指令(MPY),源操作數從第i個(gè)周期被讀取,則其計算結果在第(i+2)個(gè)周期才可用。
(2)使用相同功能單元的兩條指令不能被安排為并行指令。
(3)使用同一條交叉通路的兩條指令不能被安排在同一個(gè)執行指令包中,這是因為從寄存器組A~B或者從B~A都只有一條交叉通路!
?4?將數據讀入到(或存儲自)相同寄存器組的兩條讀(寫(xiě))指令不能被安排在同一個(gè)執行包中。
?5?每一個(gè)執行包里只能允許每一寄存器組處理一個(gè)長(cháng)定點(diǎn)類(lèi)型數據。
?6?在一個(gè)指令周期內對同一寄存器讀取多于四次是不允許的,但條件寄存器不在此限制之列。在一個(gè)指令周期內,不能同時(shí)存在兩條寫(xiě)入同一寄存器的指令,只有在寫(xiě)操作不是在同一個(gè)指令周期發(fā)生時(shí),才可以將具有同一目的地址的兩條指令安排并行。
3 基于TMS320C62X的運動(dòng)補償的混合編程設計實(shí)例
運動(dòng)補償是MPEG-4標準中的一種重要算法。運動(dòng)補償是指根據運動(dòng)矢量在參考幀中找出參考塊。如果運動(dòng)矢量的X分量和Y分量都是整象素長(cháng)度,則直接在參考幀中找出參考塊。如果為半象素長(cháng)度,則需要通過(guò)內插運算計算出參考塊,計算出的參考塊需要加上解碼得出的誤差塊才能得到當前參考塊。本文給出了運動(dòng)矢量的X分量和Y分量都是整象素長(cháng)度時(shí)的運動(dòng)補償方法。根據運動(dòng)矢量
【TMS320C62X DSP的混合編程研究】相關(guān)文章:
DOS下DSP播音的編程03-03
LabVIEW與MATLAB混合編程03-19
基于DSP的數控二維橢圓及圓插補算法簡(jiǎn)化編程研究11-22
FFT算法的研究與DSP實(shí)現03-07
通過(guò)JTAG口對DSP外部Flash存儲器的在線(xiàn)編程03-26
混合動(dòng)力汽車(chē)混合度設計方法研究03-07
JDBC數據庫編程的研究03-15
TMS320C32 DSP的中斷編程方法及BOOT功能實(shí)現03-18
混合身份共犯研究03-21