新聞中心
ADSP-TSl01S是美國(guó)ADI公司推出的一款具有極高性能的數(shù)字信號(hào)處理器(DSP)芯片,其專(zhuān)為大信號(hào)處理任務(wù)和通信應(yīng)用進(jìn)行了結(jié)構(gòu)上的優(yōu)化設(shè)計(jì),在嵌人式信號(hào)處理中得到廣泛應(yīng)用。ADSP-TSl01S的軟件設(shè)計(jì)可以采用匯編語(yǔ)言、高級(jí)語(yǔ)言(C/C++)或高級(jí)語(yǔ)言與匯編語(yǔ)言混合編程。完全采用匯編編程,執(zhí)行效率高,但對(duì)于復(fù)雜算法編寫(xiě)難度大,開(kāi)發(fā)周期長(zhǎng),可讀性和可移植性差;而完全采用C編程雖然可以彌補(bǔ)匯編的缺陷,但是程序的執(zhí)行效率相對(duì)較低,大概只有匯編程序的10%~20%,對(duì)于實(shí)時(shí)性要求很高的處理,如雷達(dá)信號(hào)處理,很難滿足要求。采用混合語(yǔ)言編程,用c語(yǔ)言構(gòu)建框架,用匯編完成運(yùn)算量較大的核心處理模塊及硬件底層管理,就可以把兩者的優(yōu)點(diǎn)有效地結(jié)合起來(lái)。C和匯編語(yǔ)言的混合編程有三種形式:一是對(duì)C程序編譯后形成的匯編程序進(jìn)行手工修改與優(yōu)化;二是直接在C代碼中插入?yún)R編語(yǔ)句,只需在匯編語(yǔ)句兩邊加上雙引號(hào)和括號(hào),在括號(hào)前面加上標(biāo)識(shí)“asm,如asm(“匯編語(yǔ)句”);三是分別編寫(xiě)C程序和匯編程序,再獨(dú)立編譯成目標(biāo)代碼模塊鏈接。***種方法對(duì)程序可讀性負(fù)面影響較大。第二種方法適用于C與匯編效率差異較大的情況,如進(jìn)入中斷的中斷子程序等。第三種方法最常用,需要遵循一些規(guī)定的接口規(guī)范和標(biāo)準(zhǔn)。

成都創(chuàng)新互聯(lián)2013年開(kāi)創(chuàng)至今,是專(zhuān)業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目網(wǎng)站建設(shè)、成都網(wǎng)站制作網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元盤(pán)龍做網(wǎng)站,已為上家服務(wù),為盤(pán)龍各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:028-86922220
1 混合編程的接口規(guī)范和標(biāo)準(zhǔn)
①在C/C++環(huán)境下,TigerSHARC定義了一套嚴(yán)格的寄存器規(guī)則,它分為三類(lèi):
***類(lèi)是保留寄存器,j16~j25、k16~k25、xr24~xr31、yr24~yr31,共40個(gè),作為編譯系統(tǒng)庫(kù)函數(shù)專(zhuān)門(mén)使用的寄存器。編寫(xiě)程序時(shí)應(yīng)避免使用這些寄存器,以免誤改了系統(tǒng)庫(kù)函數(shù)。若在子程序中使用到,必須在被調(diào)用時(shí)保存,調(diào)用完后釋放。
第二類(lèi)是堆棧專(zhuān)用寄存器,k26、27和j26、j27四個(gè),這些寄存器在調(diào)用時(shí)都需要保護(hù)。
第三類(lèi)是高速暫存寄存器,包括除了以上兩類(lèi)寄存器以外的所有寄存器。用法和匯編中的普通寄存器是一樣的,使用前不需要保存寄存器內(nèi)容。
在默認(rèn)情況下,cjmp寄存器用作存放被調(diào)函數(shù)的返回地址,但在嵌套調(diào)用中,這個(gè)值會(huì)被修改。為了保證安全返回,一般把返回地址存放在堆棧頂偏移地址為0的地方。
函數(shù)調(diào)用有時(shí)需要參數(shù)傳遞,通常,若參數(shù)少于5個(gè),則通過(guò)寄存器傳遞,如表1所列。
如果在C/C++調(diào)用函數(shù)中作了正確的函數(shù)返回聲明,則被調(diào)用的匯編函數(shù)可使用寄存器j8、xr8和xr9返回有效值。j8用于返回整數(shù)或地址;xr9:8可提供雙字結(jié)果返回。若返回值大于2個(gè)字長(zhǎng),則必須為它們分配存儲(chǔ)空間,令j8為返回值,指向該空間的首地址即可。
②在C/C++中聲明的全局變量及函數(shù),匯編中加“一”前綴才能使用;在匯編中的對(duì)象必須用”一”前綴命名,并用.g10bal聲明為全局變量,才可在C/C++中訪問(wèn)到。具體格式如表2所列。
2 混合編程的調(diào)用和中斷
2.1 函數(shù)調(diào)用
C編譯器對(duì)函數(shù)調(diào)用有一系列嚴(yán)格的規(guī)則。除了特殊的運(yùn)行支持函數(shù)外.任何函數(shù)與c函數(shù)互調(diào)都必須遵循這些規(guī)則。函數(shù)調(diào)用的標(biāo)準(zhǔn)運(yùn)行模式為:①調(diào)用者將參數(shù)莊人堆棧。壓入時(shí)按照反序進(jìn)行,即最右邊的參數(shù)位于堆棧的頂部。②調(diào)用函數(shù)。③調(diào)用結(jié)束時(shí),調(diào)用者將參數(shù)彈出堆棧并返回。整個(gè)過(guò)程離不開(kāi)堆棧操作。函數(shù)調(diào)用中的堆棧結(jié)構(gòu)示意圖如圖1所示。
①保護(hù)函數(shù)的返回地址及相關(guān)寄存器:把函數(shù)返回地址保存在j27+0的位置(棧頂),同時(shí)設(shè)置jZ6為j27-0x40(棧底),得到長(zhǎng)度為64的棧區(qū),并在棧區(qū)內(nèi)保護(hù)相關(guān)寄存器。
②分配局部變量:在局部變量賦初值的時(shí)候,系統(tǒng)在堆棧內(nèi)給它分配一個(gè)空間。
③傳遞函數(shù)參數(shù):前4個(gè)參數(shù)傳遞給相應(yīng)寄存器(見(jiàn)表1),后續(xù)參數(shù)按順序裝載到堆棧j27+0xC起始的空間中。注意,如果傳遞的參數(shù)是結(jié)構(gòu)類(lèi)型,則其所有元素將入棧。例:第五個(gè)參數(shù)是兩元素的結(jié)構(gòu)體,則元素一放于jZ7+0xC,元素二放于j27+0xD,匯編子程序在使用參數(shù)時(shí)只需從對(duì)應(yīng)的位置上讀取即可。
C環(huán)境在調(diào)用C函數(shù)時(shí)自動(dòng)管理這些操作,當(dāng)匯編與C接口時(shí),必須采用與C一樣的方式進(jìn)行操作。這個(gè)過(guò)程可用圖1詳細(xì)描述。特別需要注意的是,由于C編譯器不提供檢查堆棧溢出的任何手段,因此必須保證有足夠的空間用于堆棧;否則若發(fā)生溢出現(xiàn)象,將破壞程序的運(yùn)行環(huán)境,從而導(dǎo)致程序的癱瘓。
2.2 中 斷
中斷是DSP控制程序執(zhí)行的重要方式。通常,DSP工作在包含多個(gè)外部異步事件的環(huán)境中,這些異步事件的隨機(jī)發(fā)生要求DSP能中斷當(dāng)前的處理程序并轉(zhuǎn)向執(zhí)行該事件處理程序,執(zhí)行完后又要求返回被中斷的原程序繼續(xù)處理步驟,這一過(guò)程就是中斷。中斷源可以來(lái)自片內(nèi)或片外的設(shè)備,例如時(shí)鐘、A/D等。中斷的設(shè)置包含兩步——①打開(kāi)中斷屏蔽寄存器的相應(yīng)中斷位,②設(shè)置中斷服務(wù)程序的入口地址,這樣就能實(shí)現(xiàn)中斷的正常運(yùn)行。中斷服務(wù)程序是特殊的函數(shù),不能帶返回值,不能傳遞參數(shù),內(nèi)容須短而有效。標(biāo)準(zhǔn)運(yùn)行模式為:①保存斷點(diǎn)地址并保護(hù)所有用到的寄存器,②執(zhí)行中斷服務(wù)程序,③釋放寄存器并返回。
3 程序優(yōu)化
程序優(yōu)化包括匯編優(yōu)化和C優(yōu)化。手寫(xiě)匯編程序的優(yōu)化空間相當(dāng)大,可以產(chǎn)生非常高效的程序代碼。由于許多相關(guān)書(shū)籍都有介紹,就不再贅述,這里主要介紹C程序的優(yōu)化。
一般DSP的C編譯器都會(huì)提供優(yōu)化編譯器,采用優(yōu)化編譯就可以生成效率更高的匯編代碼,在某些情況下,執(zhí)行優(yōu)化的程序代碼要快10~20倍。從某種程度上說(shuō),C程序的效率主要取決于C編譯器所能進(jìn)行優(yōu)化的范圍和數(shù)量。應(yīng)說(shuō)明的是,TSl01S編譯器的默認(rèn)設(shè)置是不使用優(yōu)化器,它可以進(jìn)行以下幾個(gè)不同級(jí)別的優(yōu)化,優(yōu)化程度由低到高:
本文題目:DSP-TSl01S嵌入式系統(tǒng)的混合編程
URL鏈接:http://www.dlmjj.cn/article/dhppsdp.html


咨詢
建站咨詢
