色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > DSP集成開發(fā)環(huán)境中的混合編程及FFT算法的實現(xiàn)

          DSP集成開發(fā)環(huán)境中的混合編程及FFT算法的實現(xiàn)

          ——
          作者:許四湖 許飛云 賈民平 時間:2007-04-17 來源:嵌入開發(fā)網(wǎng) 收藏

           1  引言

                 CCS(Code Composer Studio)是TI公司的DSP。它提供了環(huán)境配置、源文件編輯、程序調(diào)試、跟蹤和分析等工具,幫助用戶在一個軟件環(huán)境下完成編輯、編譯鏈接、調(diào)試和數(shù)據(jù)分析等工作。與TI提供的早期軟件開發(fā)工具相比,利用CCS能夠加快軟件開發(fā)進程,提高工作效率。CCS一般工作在兩種模式下:軟件仿真器和與硬件開發(fā)板相結(jié)合的在線編程。前者可以脫離DSP芯片,在PC機上模擬DSP指令集與工作機制,主要用于前期算法實現(xiàn)和調(diào)試。后者實時運行在DSP芯片上,可以在線編制和調(diào)試應(yīng)用程序。 

                 2  C語言和匯編語言的混合編程

                 TMS320 C5000系列的軟件設(shè)計通常有三種方法:

                 (1  
          ) 用C語言開發(fā);

                 (2) 用匯編語言開發(fā);

                 (3) C和匯編的混合開發(fā)。

                 其中用C語言開發(fā)具有兼容性和可移植的優(yōu)點,有利于縮短開發(fā)周期和減少開發(fā)難度,但是在運算量較大的情況下,C代碼的效率還是無法和手工編寫的匯編代碼的效率相比,比如FFT運算,用匯編語言開發(fā)的效率高,程序執(zhí)行速度快,而且可以合理利用芯片的硬件資源,但是開發(fā)難度較大,開發(fā)周期長,而且可讀性和可移植性差。C和匯編的混合編程則可以充分利用前兩者的優(yōu)點,以達到最佳利用DSP資源的目的。但是,采用C和匯編語言混合編程必須遵循相關(guān)函數(shù)調(diào)用規(guī)則和寄存器調(diào)用規(guī)則,否則會給程序的開發(fā)帶來意想不到的問題。

                 2.1  C語言和匯編語言混合編程的四種方法

                 (1) 獨立編寫匯編程序和C程序,分開編譯或匯編成各自的目標代碼模塊,再用鏈接器將二者鏈接起來。這種方法比較靈活,但是設(shè)計者必須自己維護各匯編模塊的入口和出口代碼,自己計算傳遞的參數(shù)在堆棧中的偏移量,工作量較大,但是能做到對程序的絕對控制。

                 (2) 在C程序中使用匯編程序中定義的變量和常數(shù)。

                 (3) 在C程序中內(nèi)嵌匯編語句。這種方法可以實現(xiàn)C語言無法實現(xiàn)的一些硬件控制功能,如修改中斷控制寄存器。

                 (4) 將C語言編譯生成相應(yīng)的匯編代碼,手工修改和優(yōu)化C編譯器生成的匯編代碼。采用這種方法可以控制C編譯器,從而產(chǎn)生具有交叉列表的匯編程序,而設(shè)計者可以對其中的匯編語句進行修改,然后對匯編程序進行編譯,產(chǎn)生目標文件。

                 后3種方法由于在C中直接嵌入了匯編語言,易造成程序混亂,破壞C環(huán)境,甚至導(dǎo)致程序崩潰,而開發(fā)者又很難對不良結(jié)果進行預(yù)期和有效控制。而如果采用第一種方法,只要遵循有關(guān)C語言函數(shù)調(diào)用規(guī)則和寄存器規(guī)則,就能預(yù)見到程序運行的結(jié)果,保證程序正確。

                 2.2  編程注意事項

                 C編譯器對函數(shù)調(diào)用制定了一組嚴格的規(guī)則。除了特殊的運行時間支持庫函數(shù)外,任何調(diào)用函數(shù)和被C函數(shù)調(diào)用的函數(shù)都必須遵守這些規(guī)則。結(jié)合作者在編程中的實際情況和切身體會,提出在編程時要注意以下幾點:

                 (1) 必須保護任何被函數(shù)修正的專用寄存器。這些專用寄存器包括:AR1,AR6,AR72和堆棧指針(SP)。其中,如果對SP正常使用,則不必明顯的保存。換句話說,只要匯編函數(shù)在調(diào)用返回時彈出壓入的對象,實際上就已經(jīng)保護了SP。

                 (2) 中斷函數(shù)必須保存其使用的所有寄存器。

                 (3) 從匯編函數(shù)中調(diào)用C函數(shù)時,第一個參數(shù)(最左邊的)必須放入累加器A中,剩下的參數(shù)按照自右向左的順序壓入堆棧。 

                (4) 如果函數(shù)有返回值,則返回值存放在累加器A中。

                 (5) 調(diào)用C函數(shù)時,注意C函數(shù)只保護了幾個特定的寄存器,對于其他寄存器C函數(shù)是可以自由使用的。

                 (6) 長整數(shù)和浮點數(shù)存儲在存儲器中的方法是最高有效字在低位地址。

                 (7) 匯編語言模塊不能改變由C模塊產(chǎn)生的.cinit段,如果改變其中的內(nèi)容將會引起不可預(yù)測的后果。

                 (8) 在匯編語言模塊中,對可以從C中訪問的變量和函數(shù)名需加上前綴“_”。對于僅用于匯編語言模塊中的標識符,不用加下劃線。而且如果僅在匯編中使用,只要不加下劃線,即使與C程序中定義的對象名相同,也不會造成沖突。

             
                 (9) 任何在匯編語言模塊中聲明的將要從C訪問或調(diào)用的對象或函數(shù),都必須在匯編語言中用.global偽指令聲明為全局變量。同樣,任何在C程序中定義而將在匯編中訪問或調(diào)用的對象或函數(shù),在匯編中也必須用.global聲明。

                 (10) 在默認的情況下,編譯器總是認為CPL為1。因此,若在匯編程序中將CPL清0,則在返回C環(huán)境時,必須將其恢復(fù)為1;在默認的情況下,編譯器總是認為 OVM為0。因此,若在匯編程序中將OVM置為1,則返回C環(huán)境時,必須將其恢復(fù)為0;ARP在函數(shù)進入和返回時,必須為0,即當前輔助寄存器為AR0。函數(shù)執(zhí)行時可以為其他值。 {{分頁}} 


                 3  編程實例

                 3.1  FFT算法簡介

                 FFT是一種高效實現(xiàn)離散傅立葉變換的算法,在數(shù)字信號處理系統(tǒng)中,F(xiàn)FT作為一個非常重要的工具,甚至成為DSP運算能力的一個考核因素。如何將FFT算法很好的應(yīng)用到DSP系統(tǒng)中對于DSP系統(tǒng)的設(shè)計具有重要的意義。

                 一個優(yōu)化的實數(shù)FFT算法是一個組合以后的算法。該算法主要分為以下幾步,首先將輸入的2N點實序列進行位倒序組合成一個N點的復(fù)序列,之后對復(fù)序列進行N 點的FFT運算,最后再由N點的復(fù)數(shù)輸出拆散成2N點的復(fù)數(shù)序列,這2N點的復(fù)數(shù)序列與原始的2N點的實數(shù)輸入序列的DFT輸出一致。(詳細的算法介紹可參考相關(guān)信號處理書籍)。

                 3.2  C主程序

          #include "stdlib.h"
          extern void fft();  // FFT運算函數(shù)
          int DisData[256];  // 輸出結(jié)果
          int SimData[256]={
          0,6270,11585,15137, 16384, 15137, 11585,6270,
          0, -6270, -11585,-15137,-16384,-15137,-11585,-6270,
          ……
          0,6270,11585,15137,16384,15137,11585,6270,
          0,-6270,-11585,-15137,-16384,-15137,-11585,-6270
          };  
          // 輸入數(shù)據(jù)
          int  main()
          {
          rfft();  
          // 調(diào)用FFT函數(shù)
          while(1)  ;
          }

                 本程序中FFT運算所用到的數(shù)據(jù)是通過matlab仿真產(chǎn)生的,然后通過全局數(shù)組進行傳值,這種方式的優(yōu)點是數(shù)據(jù)的通用性強,方便對數(shù)據(jù)進行其他相關(guān)處理; 也可通過其他C程序產(chǎn)生然后保存到一個文本文件中,再由匯編程序?qū)⒃摂?shù)據(jù)文件拷到數(shù)據(jù)存儲器中參與FFT運算。這種方式的優(yōu)點是程序的可讀性強,缺點是當輸入數(shù)據(jù)修改后,必須進行重新編譯、匯編和鏈接。

          3.3  匯編程序

            .mmregs
            .global  sav_sin,sav_idx,sav_grp,_rFFT,_DisData
            .data 
          DATA .space 1024   ;數(shù)據(jù)緩沖區(qū)
          INPUT .set     0x9000 ;輸入數(shù)據(jù)起始地址
          N  .set 128  ;復(fù)數(shù)點數(shù)
          LOGN .set 7     ;碟形運算級數(shù)
          sav_grp .usect "tempv",3 ;定義組變量值
          sav_sin .set sav_grp+1 ;定義旋轉(zhuǎn)因子表
          sav_idx .set sav_grp+2
            .copy  "twiddle1.inc" ;正弦表系數(shù)
            .copy  "twiddle2.inc" ;余弦表系數(shù)
            .text
          _rfft:
            SSBX TC
            SSBX C
            RSBX OVA
            RSBX OVB
            LD  #0,DP
            RSBX CPL
            SSBX XF
            SSBX SX  
          M
            LD  #00,ASM   
            SSBX FRCT
            ……   {{分頁}}

                 本程序主要是對輸入的256點實數(shù)作FFT運算,通過修改N和LOGN可以完成16-1024點的FFT運算。在編寫匯編程序的時候要注意以下幾個方面:

                 (1) 由于采用循環(huán)尋址來對旋轉(zhuǎn)因子表尋址,因此每張表的開始地址必須是10個LSB位為0的地址。如:正弦表系數(shù)可以放在0400h開始的地址,余弦表系數(shù)可以放在0800h開始的地址;

                 (2) 在匯編程序的入口處要注意設(shè)置好匯編程序所需要的運行環(huán)境(見前述程序),如果此處按照編譯器默認的環(huán)境將得不到正確的結(jié)果。詳細的匯編程序可參考TI公司提供的例程。

                 3.4  運算結(jié)果

                 輸入正弦信號的頻率為f=16Hz,幅值為1(單位),采樣長度為2N=256點,采樣頻率為fs=256Hz。CCS提供了很多方法將程序產(chǎn)生的數(shù)據(jù)畫圖顯示,包括時域/頻域波形顯示等??赏ㄟ^查看相關(guān)圖像來檢驗FFT運算的正確性。由鏈接命令文件可以知道輸入信號存儲在程序存儲區(qū)0900h開始的256 個單元中,經(jīng)程序計算得到的信號幅值譜存放在數(shù)據(jù)存儲區(qū)0200h開始的256個單元中。在CCS中選擇View——>Graph——> Time/Frequency命令,相關(guān)設(shè)置可參考圖1:  

                 

                                   圖1  FFT運算結(jié)果查看選項設(shè)置參考

                 輸入信號的時域波形見圖2。 

            


            圖2     輸入信號的時域波形

                 經(jīng)FFT運算后得到的信號幅值譜圖見圖3。 



               圖3     信號幅值譜圖

               將輸入信號通過Matlab仿真進行驗證。輸入信號的時域波形見圖4。  {{分頁}}

          圖4     輸入信號的時域波形

                 經(jīng)FFT運算后得到的信號幅值譜圖見圖5。 


            圖5     信號幅值譜圖  


                 通過比較CCS中的輸出圖形和Matlab中的仿真輸出圖形, 可以看到二者是一致的,說明本程序的結(jié)果是正確的。

                 4  結(jié)束語

                 本文通過實例,說明了TMS320 C5000系列DSP芯片的混合編程方法,利用混合編程達到了提高程序的可讀性與編程效率的目的,是開發(fā)DSP軟件的常用方法。本文介紹的混合編程方法不但適用于TI C5000系列DSP芯片,同樣也適用于TI其他系列的DSP芯片,如C2000系列、C6000系列,甚至對其他芯片,如51系列等,實現(xiàn)混合編程也有很大參考價值。



          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉