當前位置:首頁 > 嵌入式 > 嵌入式教程
[導讀]ADSP-TSl01S嵌入式系統(tǒng)的混合編程

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

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

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

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

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

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

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

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

    C編譯器對函數(shù)調(diào)用有一系列嚴格的規(guī)則。除了特殊的運行支持函數(shù)外.任何函數(shù)與c函數(shù)互調(diào)都必須遵循這些規(guī)則。函數(shù)調(diào)用的標準運行模式為:①調(diào)用者將參數(shù)莊人堆棧。壓入時按照反序進行,即最右邊的參數(shù)位于堆棧的頂部。②調(diào)用函數(shù)。③調(diào)用結束時,調(diào)用者將參數(shù)彈出堆棧并返回。整個過程離不開堆棧操作。函數(shù)調(diào)用中的堆棧結構示意圖如圖1所示。

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

    ①保護函數(shù)的返回地址及相關寄存器:把函數(shù)返回地址保存在j27+0的位置(棧頂),同時設置jZ6為j27-0x40(棧底),得到長度為64的棧區(qū),并在棧區(qū)內(nèi)保護相關寄存器。
    ②分配局部變量:在局部變量賦初值的時候,系統(tǒng)在堆棧內(nèi)給它分配一個空間。
    ③傳遞函數(shù)參數(shù):前4個參數(shù)傳遞給相應寄存器(見表1),后續(xù)參數(shù)按順序裝載到堆棧j27+0xC起始的空間中。注意,如果傳遞的參數(shù)是結構類型,則其所有元素將入棧。例:第五個參數(shù)是兩元素的結構體,則元素一放于jZ7+0xC,元素二放于j27+0xD,匯編子程序在使用參數(shù)時只需從對應的位置上讀取即可。

    C環(huán)境在調(diào)用C函數(shù)時自動管理這些操作,當匯編與C接口時,必須采用與C一樣的方式進行操作。這個過程可用圖1詳細描述。特別需要注意的是,由于C編譯器不提供檢查堆棧溢出的任何手段,因此必須保證有足夠的空間用于堆棧;否則若發(fā)生溢出現(xiàn)象,將破壞程序的運行環(huán)境,從而導致程序的癱瘓。

2.2 中 斷
   
中斷是DSP控制程序執(zhí)行的重要方式。通常,DSP工作在包含多個外部異步事件的環(huán)境中,這些異步事件的隨機發(fā)生要求DSP能中斷當前的處理程序并轉向執(zhí)行該事件處理程序,執(zhí)行完后又要求返回被中斷的原程序繼續(xù)處理步驟,這一過程就是中斷。中斷源可以來自片內(nèi)或片外的設備,例如時鐘、A/D等。中斷的設置包含兩步——①打開中斷屏蔽寄存器的相應中斷位,②設置中斷服務程序的入口地址,這樣就能實現(xiàn)中斷的正常運行。中斷服務程序是特殊的函數(shù),不能帶返回值,不能傳遞參數(shù),內(nèi)容須短而有效。標準運行模式為:①保存斷點地址并保護所有用到的寄存器,②執(zhí)行中斷服務程序,③釋放寄存器并返回。

    ADSP-TSl01s中C語言中斷實現(xiàn)有兩種方法:一種是采用interrupt(int,vuid(*func(int)))函數(shù)來設置中斷矢量表,這個函數(shù)定義在signal.h頭文件中。第一個參量表示需響應的中斷位,在這個頭文件中也有定義;第二個參數(shù)即是中斷服務程序。應該引起注意的是,采用這種方法時,IMASK寄存器的異常中斷位必須打開,因為interrupt()庫函數(shù)要使用trap語句來產(chǎn)生陷阱,必須打開異常中斷,陷阱才能設置成功,中斷矢量表的設置才能完成,否則,中斷來l臨并不會進入指定的中斷服務程序。另一種與匯編語言中斷服務程序的實現(xiàn)類似。以定時器O為例,設置好IMASK后,用_builtin_sysreg_write(_ⅣTIMEROHP,(int)timer0h_isr)函數(shù)設置中斷矢量表,用#pragma interrupt來標識中斷服務程序即可。這種方法更簡單快捷,但它只適用于Visua1DSP++3.5以上版本,而第一種方法適用于任何版本。

3 程序優(yōu)化
   
程序優(yōu)化包括匯編優(yōu)化和C優(yōu)化。手寫匯編程序的優(yōu)化空間相當大,可以產(chǎn)生非常高效的程序代碼。由于許多相關書籍都有介紹,就不再贅述,這里主要介紹C程序的優(yōu)化。

    一般DSP的C編譯器都會提供優(yōu)化編譯器,采用優(yōu)化編譯就可以生成效率更高的匯編代碼,在某些情況下,執(zhí)行優(yōu)化的程序代碼要快10~20倍。從某種程度上說,C程序的效率主要取決于C編譯器所能進行優(yōu)化的范圍和數(shù)量。應說明的是,TSl01S編譯器的默認設置是不使用優(yōu)化器,它可以進行以下幾個不同級別的優(yōu)化,優(yōu)化程度由低到高:

    ①Debugging:“-g”開啟。編譯器產(chǎn)生調(diào)試信息,以確保目標碼與相應的源代碼匹配。
    ②DefauIt:編譯器進行基本的高級優(yōu)化。例如對明確標明的內(nèi)聯(lián)函數(shù)進行內(nèi)聯(lián)。 
    ③Procedural optimization:“-o”啟動。編譯器對要編譯的文件中的每一過程進行高級優(yōu)化。如果同時開啟“-g”,由于“-O”項有更高的優(yōu)先級,會限制調(diào)試功能。
    ④Interprocedural optimization:“-ipa"打開。除了基本優(yōu)化外,編譯器將對所有源文件的整個程序進行高級優(yōu)化操作,將刪除從沒被調(diào)用的函數(shù)和變量,會明顯減少代碼長度。

    以上“-g”、“-O”、“-ipa”在編譯信息中可以看到。優(yōu)化級越高,優(yōu)化的范圍就越廣。應注意的是,使用C優(yōu)化編譯可以提高程序的運行效率,但由于優(yōu)化時采用了一些優(yōu)化措施,使得C和匯編的交叉列表文件不如在不用優(yōu)化時得到的那樣清晰。因此,在調(diào)試程序時,最好先不用優(yōu)化編譯進行調(diào)試,待程序調(diào)試成功后再用優(yōu)化編譯進行優(yōu)化。采用C優(yōu)化編譯時,為了保證程序的正確性,特別需要注意幾點:

    ①使用asm行匯編語句時必須特別小心。優(yōu)化器在優(yōu)化過程中會對程序代碼重新進行組織,寄存器使用也比較靈活,同時程序中的有些變量或表達式可能會被刪除。雖然asm語句不會被刪除,但asm語句的前后環(huán)境可能因優(yōu)化而發(fā)生很大的變化。因此,當asm語句涉及到C環(huán)境或訪問C變量時,使用優(yōu)化器可能會得到不正確的結果。此時,必須對編譯后得到的匯編語句進行仔細的檢查,以確保asm語句在程序中的正確性。一般而言,當asm語句僅涉及諸如控制中斷寄存器或I/0口等硬件操作時,使用優(yōu)化是比較安全的。

    ②在高級優(yōu)化中,C語言源函數(shù)中從未使用過的變量和函數(shù)將被刪除。若匯編子函數(shù)的C外部變量在C程序中從未使用過,有可能被刪除并導致編譯失敗。使用retain_name pragma可以避免變量和函數(shù)因優(yōu)化而被刪除。例如:
    保留函數(shù)

   
    ③使用volatile變量避免優(yōu)化。一個定義為volatile的變量是說這個變量可能會被意想不到地改變,比如,并行設備的硬件寄存器(如狀態(tài)寄存器),一個中斷服務子程序中會訪問到的非自動變量,多線程應用中被幾個任務共享的變量。采用volatile限定詞,優(yōu)化器在用到這個變量時必須每次都重新讀取這個變量的值,而不是使用保存在寄存器里的備份。

    ④C語言程序應盡量避免使用指針運算。指針轉換會在一定程度上降低運行效率。
    ⑤在“-ipa'’使能的情況下,在循環(huán)前使用#pragmann_alias可以起到進一步優(yōu)化程序的功能。一般來說,對于循環(huán)中不存在迭代運算(使用上一次結果)的情況,優(yōu)化效果很好。
    ⑥使用PM限定詞定義數(shù)據(jù)塊。默認情況下數(shù)組存放在DM區(qū),即第一塊數(shù)據(jù)區(qū)(0x80000-0x8ffff)中。使用PM限定的數(shù)組放在第二塊數(shù)據(jù)區(qū)(0x100000-0x10ffff)中。由于兩塊數(shù)據(jù)區(qū)有獨立的128位數(shù)據(jù)總線相連,因此可以實現(xiàn)單周期內(nèi)的雙數(shù)據(jù)同時訪問。

4 混合編程在系統(tǒng)程序管理中的應用
   
下面是一個嵌入式系統(tǒng)管理實例。系統(tǒng)由4片DSP構成,作為系統(tǒng)管理的DSP0負責通過IRQ0接收控制臺從RS232串口傳來的控制字,譯碼,并通過控制flag3產(chǎn)生下降沿觸發(fā)IRQ3中斷來啟動其他各片DSP。這里用C搭建框架,匯編控制底層硬件,效率高,可讀性強。由于篇幅限制,這里略去了串口初始化、串口數(shù)據(jù)接收函數(shù)以及其他芯片的處理程序。

    以下是系統(tǒng)管理中的混合編程。
    Main.c文件:

   

   

   

5 總 結
   
實踐證明,采用混合編程的軟件更加符合一般系統(tǒng)對時間和空間的嚴格約束。設計良好的混合編程軟件既能有效滿足嵌入式系統(tǒng)對功能與性能的需求,也可以為程序的擴展和移植預留足夠的空間。總之混合編程嵌入式系統(tǒng)軟件優(yōu)化的重要途徑。

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

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉型技術解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務中斷的風險,如企業(yè)系統(tǒng)復雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務連續(xù)性,提升韌性,成...

關鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關鍵字: 華為 12nm EDA 半導體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權最終是由生態(tài)的繁榮決定的。

關鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務引領增長 以科技創(chuàng)新為引領,提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術學會聯(lián)合牽頭組建的NVI技術創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術創(chuàng)新聯(lián)...

關鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關鍵字: BSP 信息技術
關閉
關閉