《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 設計應用 > TMS320C54X DSP混合編程的方法研究
TMS320C54X DSP混合編程的方法研究
胡洪凱 鄭 紅 吳 冠
摘要: 提出并分析了在考慮程序代碼效率,、執(zhí)行效率和程序的可讀性及可移植性的情況下,,對于TMS320C54X系列,采用C語言和匯編語言混合編程的優(yōu)點;詳細闡述了混合編程方法的特點,、應遵循的規(guī)則和詳細接口規(guī)范;給出了程序設計實例,。
關鍵詞: DSP TMS320C54x TI
Abstract:
Key words :

  摘  要: 提出并分析了在考慮程序代碼效率,、執(zhí)行效率和程序的可讀性及可移植性的情況下,對于title="TMS320C54X">TMS320C54X系列,,采用C語言和匯編語言混合編程的優(yōu)點;詳細闡述了混合編程方法的特點,、應遵循的規(guī)則和詳細接口規(guī)范;給出了程序設計實例。

  關鍵詞: 數(shù)字信號處理(DSP)  TMS320C54X  混合編程

 

  數(shù)字信號處理技術是一門涉及許多學科的新技術,,廣泛應用于軍事,、工業(yè)、航空,、航天等諸多領域,。數(shù)字信號處理技術由于其運算量大和實現(xiàn)算法復雜,,通常采用專用的DSP芯片來實現(xiàn)。美國TI公司的TMS320C54X系列芯片是為實現(xiàn)低功耗和高性能而專門設計的定點DSP芯片,。

  TMS320C54X的主要特點包括:高運算速度,、優(yōu)化的CPU結構、低功耗方式和智能外設等,。

  使用專用DSP芯片進行設計與開發(fā)包括硬件和軟件兩個方面,。通常有以下三種軟件設計方式:

  (1)完全用C語言開發(fā)。TI公司提供了用于C語言開發(fā)的CCS(CODE COMPOSER STUDIO)平臺,。該平臺包括了優(yōu)化ANSI C編譯器,,從而可以在C源程序級進行開發(fā)調試。這種方式大大提高了軟件的開發(fā)速度和可讀性,,方便了軟件的修改和移植,。但是,在某些情況下,,C代碼的效率還是無法與手工編寫的匯編代碼的效率相比,,如FFT程序。這是因為即使最佳的C編譯器,,也無法在所有的情況下都能夠最合理地利用DSP芯片所提供的各種資源,。此外,用 C語言實現(xiàn)DSP芯片的某些硬件控制也不如匯編程序方便,,有些甚至無法用C語言實現(xiàn),。

  (2)完全用匯編語言開發(fā)。TI公司提供了用于匯編語言開發(fā)的針對TMS320C54X的匯編語言,。用戶可以用它進行軟件開發(fā),。此種方式可以更為合理地充分利用DSP 芯片提供的硬件資源,其代碼效率高,,程序執(zhí)行速度快,。但是用DSP芯片的匯編語言編寫程序是比較繁雜的。一般來說,,不同公司的芯片匯編語言是不同的,,即使是同一公司的芯片,由于芯片類型的不同(如定點和浮點),,芯片的升級換代,,其匯編語言也不同。因此,,用匯編語言開發(fā)基于某種DSP芯片的產品周期較長,,并且軟件的修改和升級較困難,這些都是因為匯編語言的可讀性和可移植性較差所致,。

  (3)用C語言和匯編語言混合編程開發(fā),。為了充分利用DSP芯片的資源,,更好地發(fā)揮C語言和匯編語言進行軟件開發(fā)的各自的優(yōu)點,可以將兩者有機結合起來,,兼顧兩者的優(yōu)點,避免其弊端,。因此,,在很多情況下,采用混合編程方法能更好地達到設計要求,,完成設計功能,。但是,采用C語言和匯編語言混合編程必須遵循一些有關的規(guī)則,,否則會遇到一些意想不到的問題,,給開發(fā)設計帶來許多麻煩。

  本文提出了基于DSP(TMS320C54X)的C語言和匯編語言混合編程的程序設計方法,,并給出了混合編程應遵循的規(guī)則和需要注意的一些問題,。

1 TMS320C54X的C語言和匯編語言混合編程方法

  C語言和匯編語言的混合編程有以下幾種方法:

  (1)獨立編寫匯編程序和C程序,分開編譯或匯編形成各自的目標代碼模塊,,用鏈接器將C模塊和匯編模塊鏈接起來,,這是一種靈活性較大的方法。采用這種方法,,C程序可以調用匯編程序,,并且可以訪問匯編程序中定義的變量。同樣,,匯編程序也可以調用C程序或訪問C程序中定義的變量,。但用戶必須自己維護各匯編模塊的入口和出口代碼,自己計算傳遞的參數(shù)在堆棧中的偏移量,,工作量稍大,,但能做到對程序的絕對控制。

  (2)在C程序中直接內嵌匯編語句,。此種方法可以在C程序中實現(xiàn)C語言無法實現(xiàn)的一些硬件控制功能,,如修改中斷控制寄存器、中斷標志寄存器等,。嵌入?yún)R編語句的方法比較簡單,,只需在匯編語句的兩邊加上括號和雙引號,并且在括號前加上asm標識符即可,,即asm(“匯編語句”),。

  但是,采用此種方法必須注意以下幾點:

 ?、倮ㄌ栔械膮R編語句必須以標號,、空格,、tab、分號開頭,,這和通常的匯編編程的語法一樣,。

  ②不要破壞C環(huán)境,,因為C編譯器并不檢查和分析嵌入的匯編語句,。

  ③插入跳轉語句和標號會產生不可預測的結果,。

 ?、軈R編語句不要改變C程序中變量的值。

 ?、莶灰趨R編語句中加入?yún)R編器選項而改變匯編環(huán)境,。

  (3)將C程序編譯生成相應的匯編程序,手工修改和優(yōu)化C編譯器生成的匯編代碼,。采用此種方法可以控制C編譯器從而產生具有交叉列表的匯編程序,,而且程序員可以對其中的匯編語句進行修改。之后,,對匯編程序進行匯編可產生目標文件,。注意,修改匯編語句時切勿破壞C環(huán)境,。

2 混合編程應遵循的規(guī)則和詳細的接口規(guī)范

2.1 寄存器規(guī)則

  在C環(huán)境中,,定義了嚴格的寄存器規(guī)則。寄存器規(guī)則明確了編譯器如何使用寄存器以及在函數(shù)調用過程中如何保護寄存器,。調用函數(shù)時,,被調用函數(shù)負責保護某些寄存器,這些寄存器不必由調用者來保護,。如果調用者需要使用沒有保護的寄存器,,則調用者在調用函數(shù)前必須予以保護。下面具體說明寄存器規(guī)則:

  (1)輔助寄存器AR1,、AR6,、AR7由被調用函數(shù)保護,即可以在函數(shù)執(zhí)行過程中修改,,但在函數(shù)返回時必須恢復,。在TMS320C54X中,編譯器將AR1 和AR6用作寄存器變量,。其中,,AR1被用作第一個寄存器變量,AR6被用作第二個寄存器變量,,其順序不能改變,。

  AR0,、AR2、AR3,、AR4,、AR5可以自由使用,即在函數(shù)執(zhí)行過程中可以修改,,而且不必恢復,。

  (2)堆棧指針SP在函數(shù)調用時必須予以保護,但其是自動保護的,,即在返回時,,壓入堆棧的內容都將被全部彈出,。

  (3)ARP在函數(shù)進入和返回時,,必須為0,即當前輔助寄存器為AR0,。函數(shù)執(zhí)行時可以是其它值,。

  (4)在缺省的情況下,編譯器總是認為OVM為0,。因此,,若在匯編程序中將OVM置為1,則在返回C環(huán)境時,,必須將其恢復為0,。

  (5)其它狀態(tài)位和寄存器在子程序中可以任意使用,不必恢復,。

2.2 標識符命名規(guī)則

  C編譯器將C程序中定義的所有標識符前都加一下劃線(__),。因此,必須將在C程序中要引用的匯編變量和匯編模塊子程序的名字前加上下劃線(__),。如果變量僅在匯編模塊中使用,,則不加下劃線(__)的變量名可以任意使用,而不會與C標識符發(fā)生沖突,。

2.3 函數(shù)調用規(guī)則

  C編譯器規(guī)定了一組嚴格的函數(shù)調用規(guī)則,。除了特殊的運行支持函數(shù)外,任何調用C函數(shù)或被C函數(shù)所調用的函數(shù)都必須遵循這些規(guī)則,,否則就會破壞C環(huán)境,,造成不可預測的結果。

2.3.1 參數(shù)傳遞

  函數(shù)調用前,,將參數(shù)以逆序壓入運行堆棧,,即最右邊的參數(shù)最先入棧,然后自右向左將參數(shù)依次入棧,。但是,,對于TMS320C54X,,在函數(shù)調用時,第一個參數(shù)放入累加器A中進行傳遞,。若參數(shù)是長整型和浮點數(shù)時,,則低位字先壓棧,高位字后壓棧,。若參數(shù)中有結構形式,,則調用函數(shù)給結構分配空間,其地址通過累加器A傳遞給被調用函數(shù),。

2.3.2 結果返回

  函數(shù)調用結束后,,將返回值置于累加器A中。整數(shù)和指針在累加器A的低16位中返回,,浮點數(shù)和長整型數(shù)在累加器A的32位中返回,。

2.3.3 函數(shù)調用時需注意的一些問題

  參數(shù)不是由被調用函數(shù)彈出堆棧,而是由調用函數(shù)彈出,。因此調用函數(shù)可以傳遞任意數(shù)目的參數(shù)至函數(shù),,而且函數(shù)不必知道有多少個參數(shù)傳遞。

  在匯編程序中,,除了自動初始化全局變量外,,不要將.cinit段用作其它用途。C程序在boot.asm中的啟動程序認為.cinit段中放置的全部是初始化表,,因此將其它一些信息放入.cinit段將產生不可預料的結果,。

  如果要定義在C程序中訪問的匯編變量或調用的匯編子程序,則必須在匯編程序中用.global說明為外部;同樣,,如果要定義在匯編程序中要調用的C函數(shù)或訪問變量,,也必須在C程序中將其以extern說明為外部。

  下面給出具體例子,。

  C程序:

  extern  int  asmfunc( ),;    /*聲明外部的匯編子程序*/

                                 /*注意函數(shù)名前不要加下劃線*/

  int gvar;                   /* 定義全局變量 */

  main( )

  {

  int  i=3,;

  i=asmfunc(i),;                /*進行函數(shù)調用*/

  }

      匯編程序:

  _asmfunc:                   ;函數(shù)名前一定要有下劃線

      ADD *(_gvar),,A          ,;i的值在累加器A中

        STL A,*(_gvar)          ,;返回結果在累加器A中

        RETD                     ,;子程序返回

3  C語言和匯編語言混合編程軟件設計要點和具體設計實例

  在智能測振儀表的軟件設計中,要完成對振動信號進行數(shù)據(jù)采集,從而進行頻譜分析的主要功能,。在這個具體實例中,,主程序要完成系統(tǒng)的初始化,進行用戶操作界面顯示,,并且進行鍵值查詢,,根據(jù)按鍵值決定程序的流程,從而完成儀器設計要求的各項功能,。主程序對運行速度和代碼效率要求不高,,但要求可讀性強且修改維護容易,因此采用C語言實現(xiàn),。另外一些子程序如FFT算法,,對運行速度要求較高,可用匯編語言實現(xiàn),。而DSP與PC機的通訊與硬件串口有關,,采用匯編語言易于實現(xiàn)編程,因此也采用匯編語言將其做成子程序,,而在C語言編寫的主程序中調用它,。

  在實際的系統(tǒng)軟件設計中,,可以根據(jù)具體情況來選擇將某一模塊或某一子程序用C語言或匯編語言來實現(xiàn),,從而更充分地發(fā)揮兩者的優(yōu)勢,將DSP技術更加充分地利用于各種系統(tǒng)設計中,。

  在此,,僅以A/D數(shù)據(jù)采集為例來具體說明C語言和匯編語言的相互調用問題。由于篇幅有限,,僅列出與混合編程及相互調用相關的部分程序以供分析和參考,。

  C程序:

  extern void ad1247( );  /*定義外部的匯編函數(shù)*/

                             /*函數(shù)名前不必加下劃線*/

  main( )                  /*主程序*/

  {

  int adlength=2048,;      /*數(shù)據(jù)的采樣長度*/

  int adfreq=40,;          /*數(shù)據(jù)的采樣頻率*/

       .

       .

  ad1247( adfreq,adlength),;/*調用匯編函數(shù)*/

       .

       .

  }

    匯編程序:

       .mmregs

  FP   .set AR7

        .sect       ″.text″

  .global_ad1247             ,;定義匯編子程序,以global說明要被外部的C程序調用,,函數(shù)名前要有下劃線

  .bss len,,1                ;定義局部變量len

    .bss freq,,1               ,;定義局部變量freq,變量名前不必加下劃線

      .

      .

      .

  _ad1247:                  ;程序入口

  PSHM AR6                   ,;保護AR6

  PSHM AR7                   ,;保護AR7

  PSHM AR1                   ;保護AR1

  FRAME #-16                 ,;為建立的局部幀分配空間函數(shù)體

  STL A,,*(len)              ;將置于累加器A的第一個參數(shù)傳給變量len

  SSBX CPL                   ,;用SP的直接尋址方式

  LD @17,,A                  ;第二個參數(shù)的偏移地址

  STL A,,*(freq)             ,;將置于堆棧中的第二個參數(shù)傳給變量freq

    .

    .

    .

    .

       FRAME #16                 ;釋放局部幀的空間

       POPM AR1                  ,;恢復 AR1 

       POPM AR7                  ,;恢復 AR7 

       POPM AR6                  ;恢復 AR6 

       RET                       ,;返回 

  其中有關函數(shù)調用中堆棧的使用和分配,,詳見圖1。

 

 

    注意:為局部幀分配的空間由三部分構成:傳遞的參數(shù)所占的空間;局部變量所占的空間;一個字的空間(這一部分可能不存在),,其有無主要取決于保證使堆棧指針SP為偶地址,。

  由以上的例子可以看出,采用C語言和匯編語言混合編程的方法,,可以大大提高編程的效率,,使程序設計者可以把精力更多地集中到算法的實現(xiàn)上,而不必關心寄存器的使用和安排;在一些要求代碼執(zhí)行效率高的地方可以用匯編語言來實現(xiàn),,從而可以編寫出高效的處理程序,,將DSP技術更加充分地利用于各種系統(tǒng)設計中。

 

參考文獻

1 TMS320C54X Optimizing C Compiler.Texas Insruments,,1999

2 TMS320C54X DSP CPU and Peripherals. Texas Instruments,,1999

3 張雄偉,曹鐵勇. DSP 芯片的原理與開發(fā)應用(第2版).北京:電子工業(yè)出版社,,2000.9

4 戴明楨.TMS320C54X 數(shù)字信號處理器結構原理及應用. 南京航空航天大學,,2000.6

5 莊健敏,余松煜. TMS320C5X的混合語言編程. 電子技術,,2000(2)

此內容為AET網(wǎng)站原創(chuàng),未經授權禁止轉載,。