浓毛老太交欧美老妇热爱乱,蜜臀性色av免费,妺妺窝人体色www看美女,久久久久久久久久久大尺度免费视频,麻豆人妻无码性色av专区

位置:51電子網(wǎng) » 技術(shù)資料 » 其它綜合

ADSP-TSl01S嵌入式系統(tǒng)的混合編程

發(fā)布時(shí)間:2007/8/28 0:00:00 訪問次數(shù):694

來源:單片機(jī)及嵌入式系統(tǒng)應(yīng)用  作者:西安電子科技大學(xué) 劉瓊 蘇濤 趙洋浩


摘要 C語言和匯編語言混合編程兼顧了程序的高效率和可讀性,已經(jīng)成為DSP芯片嵌入式系統(tǒng)開發(fā)的一種流行的編程方法。闡述基于ADI公司的ADSP-TSl01 DSP的C語言和匯編語言混合鳊程應(yīng)遵循的接口規(guī)范以及C程序的優(yōu)化方法。


關(guān)鍵詞 ADSP-TSl01S C語言 匯編語言 混合編程


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


1 混合編程的接口規(guī)范和標(biāo)準(zhǔn)
①在C/C++環(huán)境下,TigerSHARC定義了一套嚴(yán)格的寄存器規(guī)則,它分為三類:
第一類是保留寄存器,j16~j25、k16~k25、xr24~xr31、yr24~yr31,共40個(gè),作為編譯系統(tǒng)庫函數(shù)專門使用的寄存器。編寫程序時(shí)應(yīng)避免使用這些寄存器,以免誤改了系統(tǒng)庫函數(shù)。若在子程序中使用到,必須在被調(diào)用時(shí)保存,調(diào)用完后釋放。
第二類是堆棧專用寄存器,k26、27和j26、j27四個(gè),這些寄存器在調(diào)用時(shí)都需要保護(hù)。
第三類是高速暫存寄存器,包括除了以上兩類寄存器以外的所有寄存器。用法和匯編中的普通寄存器是一樣的,使用前不需要保存寄存器內(nèi)容。

在默認(rèn)情況下,cjmp寄存器用作存放被調(diào)函數(shù)的返回地址,但在嵌套調(diào)用中,這個(gè)值會被修改。為了保證安全返回,一般把返回地址存放在堆棧頂偏移地址為0的地方。

函數(shù)調(diào)用有時(shí)需要參數(shù)傳遞,通常,若參數(shù)少于5個(gè),則通過寄存器傳遞,如表1所列。



如果在C/C++調(diào)用函數(shù)中作了正確的函數(shù)返回聲明,則被調(diào)用的匯編函數(shù)可使用寄存器j8、xr8和xr9返回有效值。j8用于返回整數(shù)或地址;xr9:8可提供雙字結(jié)果返回。若返回值大于2個(gè)字長,則必須為它們分配存儲空間,令j8為返回值,指向該空間的首地址即可。

②在C/C++中聲明的全局變量及函數(shù),匯編中加“一”前綴才能使用;在匯編中的對象必須用”一”前綴命名,并用.g10bal聲明為全局變量,才可在C/C++中訪問到。具體格式如表2所列。



2 混合編程的調(diào)用和中斷
2.1 函數(shù)調(diào)用

C編譯器對函數(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è)過程離不開堆棧操作。函數(shù)調(diào)用中的堆棧結(jié)構(gòu)示意圖如圖1所示。



ADSP-TSl01S的堆棧是一個(gè)先入后出存儲區(qū)(如圖1),用堆棧指針(j/k27)和幀指針(j/k26)來管理堆棧。調(diào)用函數(shù)時(shí),編譯器在運(yùn)行棧中建立一個(gè)幀以存儲信息,當(dāng)前函數(shù)幀稱為局部幀。j/k26指向當(dāng)前函數(shù)的局部幀的開始,即棧底。j/k27指向棧頂,工作方式是向低地址變化。每調(diào)用一次函數(shù),就建立一個(gè)新幀。C環(huán)境利用局部幀來實(shí)現(xiàn)如下功能:

①保護(hù)函數(shù)的返回地址及相關(guān)寄存器:把函數(shù)返回地址保存在j27+0的位置(棧頂),同時(shí)設(shè)置jZ6為j27-0x40(棧底),得到長度為64的棧區(qū),并在棧區(qū)內(nèi)保護(hù)相關(guān)寄存器。
②分配局部變量:在局部變量賦初值的時(shí)候,系統(tǒng)在堆棧內(nèi)給它分配一個(gè)空間。
③傳遞函數(shù)參數(shù):前4個(gè)參數(shù)傳遞給相應(yīng)寄存器(見表1),后續(xù)參數(shù)按順序裝載到堆棧j

來源:單片機(jī)及嵌入式系統(tǒng)應(yīng)用  作者:西安電子科技大學(xué) 劉瓊 蘇濤 趙洋浩


摘要 C語言和匯編語言混合編程兼顧了程序的高效率和可讀性,已經(jīng)成為DSP芯片嵌入式系統(tǒng)開發(fā)的一種流行的編程方法。闡述基于ADI公司的ADSP-TSl01 DSP的C語言和匯編語言混合鳊程應(yīng)遵循的接口規(guī)范以及C程序的優(yōu)化方法。


關(guān)鍵詞 ADSP-TSl01S C語言 匯編語言 混合編程


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


1 混合編程的接口規(guī)范和標(biāo)準(zhǔn)
①在C/C++環(huán)境下,TigerSHARC定義了一套嚴(yán)格的寄存器規(guī)則,它分為三類:
第一類是保留寄存器,j16~j25、k16~k25、xr24~xr31、yr24~yr31,共40個(gè),作為編譯系統(tǒng)庫函數(shù)專門使用的寄存器。編寫程序時(shí)應(yīng)避免使用這些寄存器,以免誤改了系統(tǒng)庫函數(shù)。若在子程序中使用到,必須在被調(diào)用時(shí)保存,調(diào)用完后釋放。
第二類是堆棧專用寄存器,k26、27和j26、j27四個(gè),這些寄存器在調(diào)用時(shí)都需要保護(hù)。
第三類是高速暫存寄存器,包括除了以上兩類寄存器以外的所有寄存器。用法和匯編中的普通寄存器是一樣的,使用前不需要保存寄存器內(nèi)容。

在默認(rèn)情況下,cjmp寄存器用作存放被調(diào)函數(shù)的返回地址,但在嵌套調(diào)用中,這個(gè)值會被修改。為了保證安全返回,一般把返回地址存放在堆棧頂偏移地址為0的地方。

函數(shù)調(diào)用有時(shí)需要參數(shù)傳遞,通常,若參數(shù)少于5個(gè),則通過寄存器傳遞,如表1所列。



如果在C/C++調(diào)用函數(shù)中作了正確的函數(shù)返回聲明,則被調(diào)用的匯編函數(shù)可使用寄存器j8、xr8和xr9返回有效值。j8用于返回整數(shù)或地址;xr9:8可提供雙字結(jié)果返回。若返回值大于2個(gè)字長,則必須為它們分配存儲空間,令j8為返回值,指向該空間的首地址即可。

②在C/C++中聲明的全局變量及函數(shù),匯編中加“一”前綴才能使用;在匯編中的對象必須用”一”前綴命名,并用.g10bal聲明為全局變量,才可在C/C++中訪問到。具體格式如表2所列。



2 混合編程的調(diào)用和中斷
2.1 函數(shù)調(diào)用

C編譯器對函數(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è)過程離不開堆棧操作。函數(shù)調(diào)用中的堆棧結(jié)構(gòu)示意圖如圖1所示。



ADSP-TSl01S的堆棧是一個(gè)先入后出存儲區(qū)(如圖1),用堆棧指針(j/k27)和幀指針(j/k26)來管理堆棧。調(diào)用函數(shù)時(shí),編譯器在運(yùn)行棧中建立一個(gè)幀以存儲信息,當(dāng)前函數(shù)幀稱為局部幀。j/k26指向當(dāng)前函數(shù)的局部幀的開始,即棧底。j/k27指向棧頂,工作方式是向低地址變化。每調(diào)用一次函數(shù),就建立一個(gè)新幀。C環(huán)境利用局部幀來實(shí)現(xiàn)如下功能:

①保護(hù)函數(shù)的返回地址及相關(guān)寄存器:把函數(shù)返回地址保存在j27+0的位置(棧頂),同時(shí)設(shè)置jZ6為j27-0x40(棧底),得到長度為64的棧區(qū),并在棧區(qū)內(nèi)保護(hù)相關(guān)寄存器。
②分配局部變量:在局部變量賦初值的時(shí)候,系統(tǒng)在堆棧內(nèi)給它分配一個(gè)空間。
③傳遞函數(shù)參數(shù):前4個(gè)參數(shù)傳遞給相應(yīng)寄存器(見表1),后續(xù)參數(shù)按順序裝載到堆棧j

相關(guān)IC型號

熱門點(diǎn)擊

 

推薦技術(shù)資料

羅盤誤差及補(bǔ)償
    造成羅盤誤差的主要因素有傳感器誤差、其他磁材料干擾等。... [詳細(xì)]
版權(quán)所有:51dzw.COM
深圳服務(wù)熱線:13751165337  13692101218
粵ICP備09112631號-6(miitbeian.gov.cn)
公網(wǎng)安備44030402000607
深圳市碧威特網(wǎng)絡(luò)技術(shù)有限公司
付款方式


 復(fù)制成功!