《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 設計應用 > 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ī)范;給出了程序設計實例。

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

 

  數字信號處理技術是一門涉及許多學科的新技術,廣泛應用于軍事、工業(yè)、航空、航天等諸多領域。數字信號處理技術由于其運算量大和實現算法復雜,通常采用專用的DSP芯片來實現。美國TI公司的TMS320C54X系列芯片是為實現低功耗和高性能而專門設計的定點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語言實現DSP芯片的某些硬件控制也不如匯編程序方便,有些甚至無法用C語言實現。

  (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程序中定義的變量。但用戶必須自己維護各匯編模塊的入口和出口代碼,自己計算傳遞的參數在堆棧中的偏移量,工作量稍大,但能做到對程序的絕對控制。

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

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

  ①括號中的匯編語句必須以標號、空格、tab、分號開頭,這和通常的匯編編程的語法一樣。

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

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

  ④匯編語句不要改變C程序中變量的值。

  ⑤不要在匯編語句中加入匯編器選項而改變匯編環(huán)境。

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

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

2.1 寄存器規(guī)則

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

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

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

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

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

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

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

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

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

2.3 函數調用規(guī)則

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

2.3.1 參數傳遞

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

2.3.2 結果返回

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

2.3.3 函數調用時需注意的一些問題

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

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

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

  下面給出具體例子。

  C程序:

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

                                 /*注意函數名前不要加下劃線*/

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

  main( )

  {

  int  i=3;

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

  }

      匯編程序:

  _asmfunc:                   ;函數名前一定要有下劃線

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

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

        RETD                     ;子程序返回

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

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

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

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

  C程序:

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

                             /*函數名前不必加下劃線*/

  main( )                  /*主程序*/

  {

  int adlength=2048;      /*數據的采樣長度*/

  int adfreq=40;          /*數據的采樣頻率*/

       .

       .

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

       .

       .

  }

    匯編程序:

       .mmregs

  FP   .set AR7

        .sect       ″.text″

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

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

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

      .

      .

      .

  _ad1247:                  ;程序入口

  PSHM AR6                   ;保護AR6

  PSHM AR7                   ;保護AR7

  PSHM AR1                   ;保護AR1

  FRAME #-16                 ;為建立的局部幀分配空間函數體

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

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

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

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

    .

    .

    .

    .

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

       POPM AR1                  ;恢復 AR1 

       POPM AR7                  ;恢復 AR7 

       POPM AR6                  ;恢復 AR6 

       RET                       ;返回 

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

 

 

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

  由以上的例子可以看出,采用C語言和匯編語言混合編程的方法,可以大大提高編程的效率,使程序設計者可以把精力更多地集中到算法的實現上,而不必關心寄存器的使用和安排;在一些要求代碼執(zhí)行效率高的地方可以用匯編語言來實現,從而可以編寫出高效的處理程序,將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 數字信號處理器結構原理及應用. 南京航空航天大學,2000.6

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

此內容為AET網站原創(chuàng),未經授權禁止轉載。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
欧美人体xx| 激情国产一区| 久久天堂成人| 亚洲欧美激情一区二区| 日韩亚洲不卡在线| 最新日韩在线视频| 亚洲高清免费在线| 欧美一区二区三区啪啪| 午夜亚洲激情| 午夜精品视频在线观看| 午夜精品久久久久| 午夜伦理片一区| 亚洲影院色无极综合| 亚洲视频狠狠| 亚洲少妇中出一区| 亚洲视频axxx| 亚洲宅男天堂在线观看无病毒| 日韩亚洲精品视频| 一本久久综合亚洲鲁鲁五月天| 一区二区久久久久| 日韩亚洲欧美成人| 国产精品99久久99久久久二8 | 亚洲精品乱码久久久久久黑人| 亚洲成人资源| 亚洲人成在线观看一区二区| 亚洲精品看片| 在线亚洲欧美| 亚洲主播在线| 久久成人免费视频| 亚洲激情在线观看视频免费| 日韩亚洲欧美一区| 亚洲一区影音先锋| 先锋影音国产精品| 久久激情视频免费观看| 老司机精品久久| 欧美大片第1页| 欧美日本高清视频| 国产精品va在线播放| 国产精品日日摸夜夜添夜夜av| 国产日韩欧美不卡| 在线成人亚洲| 一区二区欧美在线| 西西人体一区二区| 最新国产成人av网站网址麻豆| 中文欧美字幕免费| 西瓜成人精品人成网站| 久久精品一二三区| 欧美成人中文字幕在线| 欧美色中文字幕| 国产日本欧美一区二区| 亚洲电影免费观看高清完整版在线 | 亚洲日本中文字幕| 亚洲图片欧美午夜| 久久国产一区二区三区| 欧美成人在线影院| 国产精品日日摸夜夜添夜夜av| 狠狠色狠狠色综合日日五| 亚洲精品一二区| 亚洲影音一区| 亚洲三级网站| 欧美一区二区网站| 欧美精品18videos性欧美| 国产精品日本| 亚洲国产美女| 午夜精品在线| 99精品99| 久久全球大尺度高清视频| 欧美三级电影网| 韩国一区二区三区在线观看| 夜夜嗨av一区二区三区网站四季av| 午夜在线观看欧美| 亚洲麻豆av| 久久久在线视频| 国产精品每日更新| 亚洲国产婷婷香蕉久久久久久99| 亚洲一区三区视频在线观看| 亚洲三级毛片| 久久精品30| 欧美性色视频在线| 国产在线一区二区三区四区| 一本久久精品一区二区| 亚洲高清在线| 小黄鸭视频精品导航| 欧美黄网免费在线观看| 国产亚洲综合在线| 亚洲图片欧洲图片av| 日韩亚洲欧美在线观看| 久久米奇亚洲| 国产精品亚洲欧美| 99爱精品视频| 亚洲精品一区在线观看香蕉| 久久久久亚洲综合| 国产欧美日韩一区| 亚洲愉拍自拍另类高清精品| 一区二区三区av| 欧美韩日亚洲| 亚洲国产高清自拍| 亚洲国产欧美一区二区三区同亚洲| 欧美亚洲系列| 国产精品久久久久久久app| 亚洲人成网站在线观看播放| 亚洲国产精品欧美一二99| 久久久久久久网站| 国产亚洲福利一区| 午夜精品久久久久久久久久久| 亚洲免费视频中文字幕| 欧美视频在线观看免费| 亚洲麻豆国产自偷在线| 亚洲人成啪啪网站| 浪潮色综合久久天堂| 国产一区二区三区四区| 亚洲欧美激情四射在线日| 亚洲女人天堂成人av在线| 欧美色图麻豆| 一区二区激情| 亚洲免费在线观看| 国产精品高潮呻吟| 亚洲视频一区在线观看| 亚洲一区久久| 国产精品人人做人人爽| 亚洲伊人网站| 欧美一区二区在线观看| 国产精品毛片在线| 亚洲免费小视频| 欧美在线观看网址综合| 国产精品一区久久| 亚洲伊人一本大道中文字幕| 欧美一区二区三区四区在线观看地址| 国产精品视频久久一区| 亚洲在线成人| 久久黄色小说| 黄色日韩精品| 亚洲全部视频| 欧美日韩国产成人精品| 中国日韩欧美久久久久久久久| 午夜国产精品视频免费体验区| 国产精品一区二区久久| 欧美亚洲综合久久| 狼狼综合久久久久综合网| 亚洲电影第三页| 一本色道久久综合亚洲91| 国产精品wwwwww| 午夜伦理片一区| 久久综合九九| 91久久午夜| 亚洲女同性videos| 国产一区二区三区直播精品电影| 亚洲国产精品久久久久秋霞蜜臀| 欧美电影在线观看| 日韩性生活视频| 欧美在线视频日韩| 精品av久久707| 夜夜精品视频一区二区| 国产精品老牛| 亚洲国产91色在线| 欧美激情综合亚洲一二区| 亚洲一区二区三区在线播放| 六月婷婷一区| 99一区二区| 欧美专区在线| 亚洲精品视频一区二区三区| 亚洲欧美日韩在线高清直播| 狠狠色综合网| 亚洲深夜影院| 国内精品久久久久伊人av| 日韩视频中文字幕| 国产伦精品一区二区三区| 亚洲精品国产拍免费91在线| 欧美性感一类影片在线播放| 久久精品视频在线观看| 欧美日韩国产精品一区| 亚洲欧美成人一区二区三区| 欧美成va人片在线观看| 亚洲一区在线观看免费观看电影高清| 久久综合狠狠| 亚洲午夜高清视频| 噜噜噜噜噜久久久久久91| 亚洲视频免费在线观看| 免播放器亚洲一区| 亚洲欧美激情视频在线观看一区二区三区| 免费亚洲电影| 亚洲一区二区三区涩| 欧美寡妇偷汉性猛交| 欧美亚洲免费| 国产精品劲爆视频| 亚洲精品久久久久| 国产麻豆精品theporn| 一本久久a久久免费精品不卡| 韩国av一区二区| 亚洲欧美日本视频在线观看| 亚洲电影免费观看高清| 久久se精品一区精品二区| 99精品国产高清一区二区| 免费在线观看成人av| 欧美一级在线亚洲天堂| 欧美午夜精品久久久久久人妖 | 亚洲五月六月| 欧美精品久久一区| 久久精品日产第一区二区三区 | 99精品黄色片免费大全|