TMS320C54x C編譯器的使用

admin @ 2014-03-26 , reply:0

摘要   介紹了TI公司提供的TMS320C54x C編譯器的使用特點,討論了關於移植、與彙編的介面等問題。

1 前言

    TMS320C54x 是TI公司針對通信應用推出的中高檔16位定點DSP系列器件。該系列器件功能強大、靈活,較之TMS320C2xx ,具有以下突出優點:
   (1)速度更快:40~100MIPS;
   (2)指令集更為豐富;
   (3)更多的定址方式選擇;   (4)兩個40位的累加器;
(5)硬體堆棧指針;
(6)支持塊重複和環型緩衝區管理。

    TMS320C54x 的應用一般較為複雜,因此,完全採用彙編語言進行編程將是一件很困難、也很低效的事情。而C語言以其靈活性、易移植性,已成為單片機開發的一種趨勢,對於更為複雜的DSP應用來說,更是如此。

    TI公司為TMS320C54x提供了功能強大的C編譯器,支持優化功能。下面就對使用TMS320C54x C編譯器中的一些體會介紹給讀者。作者在實踐中使用的TMS320C54x C編譯器的版本為1.10版,以下的討論都基於該版本。

2 C語言的移植

    在進行複雜演算法開發時,一般的做法是先在PC上用高級語言(如C語言)進行模擬,然後再移植到DSP平台中。考慮到效率問題,可進一步進行手工彙編的調整。編譯器的工作方式大致可分為兩類:一類直接由高級語言產生目標代碼;另一類則是先生成中間的彙編代碼,再彙編成目標代碼。TI公司提供的C編譯器屬於後者。這樣,用戶可方便地根據中間的彙編代碼進行手工調整和改寫。

    在進行C語言移植時,涉及到兩個問題:一是庫函數的使用,二是字長問題。TI的TMS320C54x C編譯器提供符合ANSI C的函數庫。至於字長,要取決於硬體機器字長和操作系統,但一般來說,在不同的系統中,short型為16位,long型為32位,而int型卻有所不同。如,在VC環境中,int型為32位,而對於TMS320C54x C編譯器來說,int型則為16位。因此,在將C源程序由模擬環境向TMS320C54x平台移植時,應根據各變數的取值範圍,儘可能地將int型歸類為 short型或long型。

3 段的分配

    雖然,C語言是一種相對高效的高級語言,並且TI提供的C編譯器還結合硬體特點支持三級優化功能,但生成的彙編代碼效率仍可能會不盡人意。如作者預使用環型緩衝區管理功能,這就要求該緩衝區應被定位到相對特定的位置。因此,用戶對C編譯器究竟是如何進行存儲分配的,應有一定的了解。

    目標碼是以段為單位組織的。至於TMS320C54x 彙編器是如何具體分配段,而連接器又是如何進行連接的,這些並非本文的要旨,詳細內容請參見關於TMS320C54x 彙編/連接器的使用一書。這裡,僅結合C語言的特點,簡單介紹一下幾種常用段的使用。

    總的來說,可將所有的段分為兩類:已初始化段和未初始化段。

    已初始化段中包含數據表和可執行代碼,常用的有3個:.text 段、.cinit段和.const段。其中,.text 段中包含所有可執行的代碼以及常量;.cinit段中包含未用const聲明的外部(external)或靜態(static)數據表;.const段中則包含已用const聲明的外部或靜態數據表以及字元串常量。

    未初始化段在存儲器(通常為RAM)中保留空間,用於程序運行時創建和存儲變數,常用的有兩個:.bss段和.stack段。其中,.bss段用於為全局和靜態變數保留空間,在程序開始執行時,由C引導程序將.cinit段中的已初始化數據複製到.bss段中。.stack段用作C的系統堆棧,向被調函數傳遞參數,並為局部變數分配空間。

    在上述五個常用段中,.text 段和.cinit段被固定連接至程序空間,存儲器類型可以是ROM或RAM(一般為ROM,具體取決於編譯時RAM或ROM方式的選擇);.bss段和.stack段則被固定連接至數據空間,存儲器類型只能是RAM。

    而.const段的使用則較為靈活。.const段被固定連接至數據空間,但存儲器類型可以是ROM或RAM。這就有別於.cinit段:.cinit段被連接至程序空間,程序執行時,再被複制到數據空間中的.bss段中。這樣,一張未用const聲明的數據表要同時佔用程序(.cinit段)和數據空間(.bss段)的一部分。與之相比較,如果系統支持數據ROM,則該數據表改用const聲明后,只需佔用數據空間(.const段)的一部分。

    如果程序較為複雜,由C編譯器生成的.bss段會比較龐大,這種情況下對.bss段進行特定操作就比較困難。如將幾個常用的數據表連接至片內RAM,而非片外RAM;或需對某個數據表進行特殊定址。這時,即使目標系統不支持數據ROM,也有必要使用.const段。這就需要在連接時對.const段作如下規定:在程序空間中載入,而在數據空間中運行。C引導程序對其處理的方法類似與.cinit段,將其從程序空間複製到數據空間。具體實現,請參見 TMS320C54x C編譯器的用戶指南。但作者在使用1.10版的TMS320C54x C編譯器時發現,該版本的引導程序並不支持.const段的載入。通過閱讀C編譯器所帶的庫函數的源代碼,參照引導程序對.cinit段的處理,作者修改了該段引導程序,使之支持對.const段的載入。

    除上述五個常見段外,TMS320C54x C編譯器還可能產生兩個段:.switch段和.sysmem段。其中,.switch段包含用於開關(switch)語句的數據表;而.sysmem段則用於動態存儲分配。如果直接使用了彙編,還可能用到.data段以及自命名的已初始化(代碼)段和未初始化(變數)段。

4 C與彙編語言的混用

    在C語言中使用彙編語言,可採取兩種方式:一是調用彙編語言子程序;二是使用嵌入彙編。

4.1 調用彙編語言子程序

    在TMS320C54x C程序中調用彙編語言子程序,必須遵循其函數調用規則和寄存器使用規則。

    TMS320C54x C編譯器在處理函數調用時,關於如何傳遞入口參數以及如何返回出口參數制定了一套嚴格的規則。詳細內容請參見文獻[2]。

    TMS320C54x 共有8個通用寄存器(AR0~AR7),其中AR1、AR6和AR7可能會被編譯器所使用,其中AR1一般用作局部變數暫存,而AR7常被用作全局變數。所以,如果所調用的彙編語言子程序中使用了這3個寄存器,應作上下文保護。

    TMS320C54x C編譯器支持寄存器變數的使用,最多兩個,分別為:AR1和AR6。通常的用法是創建全局寄存器變數。較之一般存儲單元,C54x 對寄存器的存取速度最快。因此,對一些使用頻率很高的變數來說,將其聲明為寄存器變數,可顯著提高處理速度。

    如果使用了全局寄存器變數,應採用-r選項對所有代碼(包括庫函數)進行重新編譯,以禁止C編譯器對AR1或AR6的使用。

4.2 嵌入彙編

    雖然TMS320C54x C編譯器提供了三級優化功能,但作者實際使用的體會仍不夠滿意。而在C中調用彙編語言子程序,又要求嚴格遵循其參數傳遞規則。由於TMS320C54x C編譯器支持在C源代碼中直接用asm語句嵌入彙編,故在C編譯器所產生的中間彙編代碼的基礎上,可局部使用嵌入彙編。這樣,一方面可大大提高一些頻繁使用的代碼段的效率,另一方面,又不用改變原來的函數框架,也便於對照模擬結果進行調試。

    在進行嵌入彙編時,要特別注意流水線的衝突。TMS320C54x 採用6級流水線結構,在出現流水線衝突的地方,可插入空操作(nop)指令來解決。常見的易產生流水線衝突的指令如STLM、ADDM等。

    關於1.10版,還有一個值得注意的問題,即如何由兩個短整數獲得32位的長整數乘積。

如:
    short    m1,m2;
    long     result;
    result = (long) (m1 * m2);         (1)
    result = ((long) m1 * (long) m2);  (2)

    對於(1),1.10版的編譯器只是將乘積的低16位存入result;而對於(2),得到的是一個32位的長整數乘積,但卻是調用了兩個長整數相乘的庫函數(L$$MPY)而得到的,這對於含有大量乘加運算的DSP應用來說,效率上難以令人接受。為此,採用嵌入彙編可方便地解決這個問題。

5 結語

    上述討論中的1.10版的TMS320C54x C編譯器是一個DOS下的工具,相應的模擬調試環境也不夠友好。目前,TI公司針對TMS320C54x 系列已經推出了一個功能強大的集成開發環境。

參 考 文 獻

1 TMS320C54x Optimizing C Compilier User’s Guide. Texas Instruments Inc., 1997
2 TMS320C54x Assembly Language Tools User’s Guide. Texas Instruments Inc., 1997
3 TMS320C54x DSP CPU and Peripherals. Texas Instruments Inc., 1996
4 TMS320C54x DSP Mnomonic Instruction Set. Texas Instruments Inc., 1996




[admin via 研發互助社區 ] TMS320C54x C編譯器的使用已經有638次圍觀

http://www.cocdig.com/docs/show-post-45151.html