ADSP-TSl01S嵌入式系統的混合編程
發布時間:2007/8/28 0:00:00 訪問次數:679
來源:單片機及嵌入式系統應用 作者:西安電子科技大學 劉瓊 蘇濤 趙洋浩
摘要 C語言和匯編語言混合編程兼顧了程序的高效率和可讀性,已經成為DSP芯片嵌入式系統開發的一種流行的編程方法。闡述基于ADI公司的ADSP-TSl01 DSP的C語言和匯編語言混合鳊程應遵循的接口規范以及C程序的優化方法。
關鍵詞 ADSP-TSl01S C語言 匯編語言 混合編程
ADSP-TSl01S是美國ADI公司推出的一款具有極高性能的數字信號處理器(DSP)芯片,其專為大信號處理任務和通信應用進行了結構上的優化設計,在嵌人式信號處理中得到廣泛應用。ADSP-TSl01S的軟件設計可以采用匯編語言、高級語言(C/C++)或高級語言與匯編語言混合編程。完全采用匯編編程,執行效率高,但對于復雜算法編寫難度大,開發周期長,可讀性和可移植性差;而完全采用C編程雖然可以彌補匯編的缺陷,但是程序的執行效率相對較低,大概只有匯編程序的10%~20%,對于實時性要求很高的處理,如雷達信號處理,很難滿足要求。采用混合語言編程,用c語言構建框架,用匯編完成運算量較大的核心處理模塊及硬件底層管理,就可以把兩者的優點有效地結合起來。C和匯編語言的混合編程有三種形式:一是對C程序編譯后形成的匯編程序進行手工修改與優化;二是直接在C代碼中插入匯編語句,只需在匯編語句兩邊加上雙引號和括號,在括號前面加上標識“asm",如asm(“匯編語句”);三是分別編寫C程序和匯編程序,再獨立編譯成目標代碼模塊鏈接。第一種方法對程序可讀性負面影響較大。第二種方法適用于C與匯編效率差異較大的情況,如進入中斷的中斷子程序等。第三種方法最常用,需要遵循一些規定的接口規范和標準。
1 混合編程的接口規范和標準
①在C/C++環境下,TigerSHARC定義了一套嚴格的寄存器規則,它分為三類:
第一類是保留寄存器,j16~j25、k16~k25、xr24~xr31、yr24~yr31,共40個,作為編譯系統庫函數專門使用的寄存器。編寫程序時應避免使用這些寄存器,以免誤改了系統庫函數。若在子程序中使用到,必須在被調用時保存,調用完后釋放。
第二類是堆棧專用寄存器,k26、27和j26、j27四個,這些寄存器在調用時都需要保護。
第三類是高速暫存寄存器,包括除了以上兩類寄存器以外的所有寄存器。用法和匯編中的普通寄存器是一樣的,使用前不需要保存寄存器內容。
在默認情況下,cjmp寄存器用作存放被調函數的返回地址,但在嵌套調用中,這個值會被修改。為了保證安全返回,一般把返回地址存放在堆棧頂偏移地址為0的地方。
函數調用有時需要參數傳遞,通常,若參數少于5個,則通過寄存器傳遞,如表1所列。
如果在C/C++調用函數中作了正確的函數返回聲明,則被調用的匯編函數可使用寄存器j8、xr8和xr9返回有效值。j8用于返回整數或地址;xr9:8可提供雙字結果返回。若返回值大于2個字長,則必須為它們分配存儲空間,令j8為返回值,指向該空間的首地址即可。
②在C/C++中聲明的全局變量及函數,匯編中加“一”前綴才能使用;在匯編中的對象必須用”一”前綴命名,并用.g10bal聲明為全局變量,才可在C/C++中訪問到。具體格式如表2所列。
2 混合編程的調用和中斷
2.1 函數調用
C編譯器對函數調用有一系列嚴格的規則。除了特殊的運行支持函數外.任何函數與c函數互調都必須遵循這些規則。函數調用的標準運行模式為:①調用者將參數莊人堆棧。壓入時按照反序進行,即最右邊的參數位于堆棧的頂部。②調用函數。③調用結束時,調用者將參數彈出堆棧并返回。整個過程離不開堆棧操作。函數調用中的堆棧結構示意圖如圖1所示。
ADSP-TSl01S的堆棧是一個先入后出存儲區(如圖1),用堆棧指針(j/k27)和幀指針(j/k26)來管理堆棧。調用函數時,編譯器在運行棧中建立一個幀以存儲信息,當前函數幀稱為局部幀。j/k26指向當前函數的局部幀的開始,即棧底。j/k27指向棧頂,工作方式是向低地址變化。每調用一次函數,就建立一個新幀。C環境利用局部幀來實現如下功能:
①保護函數的返回地址及相關寄存器:把函數返回地址保存在j27+0的位置(棧頂),同時設置jZ6為j27-0x40(棧底),得到長度為64的棧區,并在棧區內保護相關寄存器。
②分配局部變量:在局部變量賦初值的時候,系統在堆棧內給它分配一個空間。
③傳遞函數參數:前4個參數傳遞給相應寄存器(見表1),后續參數按順序裝載到堆棧j
來源:單片機及嵌入式系統應用 作者:西安電子科技大學 劉瓊 蘇濤 趙洋浩
摘要 C語言和匯編語言混合編程兼顧了程序的高效率和可讀性,已經成為DSP芯片嵌入式系統開發的一種流行的編程方法。闡述基于ADI公司的ADSP-TSl01 DSP的C語言和匯編語言混合鳊程應遵循的接口規范以及C程序的優化方法。
關鍵詞 ADSP-TSl01S C語言 匯編語言 混合編程
ADSP-TSl01S是美國ADI公司推出的一款具有極高性能的數字信號處理器(DSP)芯片,其專為大信號處理任務和通信應用進行了結構上的優化設計,在嵌人式信號處理中得到廣泛應用。ADSP-TSl01S的軟件設計可以采用匯編語言、高級語言(C/C++)或高級語言與匯編語言混合編程。完全采用匯編編程,執行效率高,但對于復雜算法編寫難度大,開發周期長,可讀性和可移植性差;而完全采用C編程雖然可以彌補匯編的缺陷,但是程序的執行效率相對較低,大概只有匯編程序的10%~20%,對于實時性要求很高的處理,如雷達信號處理,很難滿足要求。采用混合語言編程,用c語言構建框架,用匯編完成運算量較大的核心處理模塊及硬件底層管理,就可以把兩者的優點有效地結合起來。C和匯編語言的混合編程有三種形式:一是對C程序編譯后形成的匯編程序進行手工修改與優化;二是直接在C代碼中插入匯編語句,只需在匯編語句兩邊加上雙引號和括號,在括號前面加上標識“asm",如asm(“匯編語句”);三是分別編寫C程序和匯編程序,再獨立編譯成目標代碼模塊鏈接。第一種方法對程序可讀性負面影響較大。第二種方法適用于C與匯編效率差異較大的情況,如進入中斷的中斷子程序等。第三種方法最常用,需要遵循一些規定的接口規范和標準。
1 混合編程的接口規范和標準
①在C/C++環境下,TigerSHARC定義了一套嚴格的寄存器規則,它分為三類:
第一類是保留寄存器,j16~j25、k16~k25、xr24~xr31、yr24~yr31,共40個,作為編譯系統庫函數專門使用的寄存器。編寫程序時應避免使用這些寄存器,以免誤改了系統庫函數。若在子程序中使用到,必須在被調用時保存,調用完后釋放。
第二類是堆棧專用寄存器,k26、27和j26、j27四個,這些寄存器在調用時都需要保護。
第三類是高速暫存寄存器,包括除了以上兩類寄存器以外的所有寄存器。用法和匯編中的普通寄存器是一樣的,使用前不需要保存寄存器內容。
在默認情況下,cjmp寄存器用作存放被調函數的返回地址,但在嵌套調用中,這個值會被修改。為了保證安全返回,一般把返回地址存放在堆棧頂偏移地址為0的地方。
函數調用有時需要參數傳遞,通常,若參數少于5個,則通過寄存器傳遞,如表1所列。
如果在C/C++調用函數中作了正確的函數返回聲明,則被調用的匯編函數可使用寄存器j8、xr8和xr9返回有效值。j8用于返回整數或地址;xr9:8可提供雙字結果返回。若返回值大于2個字長,則必須為它們分配存儲空間,令j8為返回值,指向該空間的首地址即可。
②在C/C++中聲明的全局變量及函數,匯編中加“一”前綴才能使用;在匯編中的對象必須用”一”前綴命名,并用.g10bal聲明為全局變量,才可在C/C++中訪問到。具體格式如表2所列。
2 混合編程的調用和中斷
2.1 函數調用
C編譯器對函數調用有一系列嚴格的規則。除了特殊的運行支持函數外.任何函數與c函數互調都必須遵循這些規則。函數調用的標準運行模式為:①調用者將參數莊人堆棧。壓入時按照反序進行,即最右邊的參數位于堆棧的頂部。②調用函數。③調用結束時,調用者將參數彈出堆棧并返回。整個過程離不開堆棧操作。函數調用中的堆棧結構示意圖如圖1所示。
ADSP-TSl01S的堆棧是一個先入后出存儲區(如圖1),用堆棧指針(j/k27)和幀指針(j/k26)來管理堆棧。調用函數時,編譯器在運行棧中建立一個幀以存儲信息,當前函數幀稱為局部幀。j/k26指向當前函數的局部幀的開始,即棧底。j/k27指向棧頂,工作方式是向低地址變化。每調用一次函數,就建立一個新幀。C環境利用局部幀來實現如下功能:
①保護函數的返回地址及相關寄存器:把函數返回地址保存在j27+0的位置(棧頂),同時設置jZ6為j27-0x40(棧底),得到長度為64的棧區,并在棧區內保護相關寄存器。
②分配局部變量:在局部變量賦初值的時候,系統在堆棧內給它分配一個空間。
③傳遞函數參數:前4個參數傳遞給相應寄存器(見表1),后續參數按順序裝載到堆棧j