1. DSP庫函數cfft32_SCALE、cifft32_NOSCALE、cbrev32分別是干什麼的,最好能給出C或C++語言實現
以上DSP的函數雖然是匯編的,但在庫函數的目錄中有相關文檔,其中詳細解釋了C語言的調用規則,還有演算法原理,大部分會有相應C代碼。你可以去目錄中查一下。
匯編是針對DSP進行過優化的,目的是為了實現效率最大化。
2. DSP如何創建一個新的工程以及編譯
新建工程:
1.路徑,文件名不得包含中文。
2.拷貝文件夾:common,headers.
3.添加cmd文件:common/cmd/28335_RAM_link.cmd headers/cmd/DSP28335_Headers_nonBIOS.cmd
4.必須添加的8個Source文件: common/source/ADC_cal.asm /CodeStartBranch.asm
/Defaultisr.c /PieCtrl.c /PieVect.c /SysCtrl.c /usDelay.asm headers/source/GlobalVariadleDefs.c
5.其他的文件在common/source里按需添加
6.添加自己寫的 .c 文件:放置在工程里
7.右擊工程文件,點擊Build options
設置兩個地方:
1.在Compiler下點擊Advanced->將浮點型庫支持選上(fpu32
點擊Preprocesso填寫頭文件路徑:在Path(-i)下寫:
..\..\DSP2833x_headers\include;..\..\DSP2833x_common\include
2.在link的basic下將Suppress Banner(-q)的復選框勾起設置堆棧的大小:Stack Size(-heap)
設置為0x200 的Libraries 下設置Search path(-i):..\..\DSP2833x_common\include
Inic Libraries: rts2800_fpu32.lib
3. DSPIC30F系列單片機中DSP內核的使用方法
C語言編譯器自動給調用DPS指令,用C來寫程序的話直接用普通的C語言運算符即可。不需要關注其他的。
匯編下有專用的DSP指令,因為匯編是面向機器的語言。而C語言則是面向過程面向演算法的語言,編程者不需要關注底層指令如何運算。
如23×32,則是
unsigned int a=23,b=32,c;
c = a*b;
編譯時候,C語言編譯器會自動講上述語句用DSP指令編譯成匯編語句。
而對於快速傅里葉變換直流的操作,C語言並沒有對應的操作指令,可以調用函數庫里的DSP函數。你可以到Microchip網站找「16-Bit Language Tools Libraries」的參考手冊。順便看一下「16-bit MCU and DSC Programmer's Reference Manual」(16位單片機和數字信號控制晶元編程參考指南)
4. 使用DSP編譯器ccs時,如何通過函數的調用處,快速找到函數的定義處。
CCS有這個功能啊!把滑鼠移動到一個函數上面,就顯示一個淡黃色的框,其中顯示函數名稱,點第一行的f符號就跳轉到函數的原型,即函數的正文,點第二行的fx符號就跳轉到這函數在頭文件中的聲明。
5. DSP學習入門
DSP學習入門:
DSP的特點 :
對於沒有使用過DSP的初學者來說,第一個困惑就是DSP其他的嵌入式處理器究竟有什麼不同,它和單片機,ARM有什麼區別.事實上,DSP也是一種嵌入式處理器,它完全可以完成單片機的功能.。
唯一的重要的區別在於DSP支持單時鍾周期的"乘-加"運算.這幾乎是所有廠家的DSP晶元的一個共有特徵.幾乎所有的DSP處理器的指令集中都會有一條MAC指令,這條指令可以把兩個操作數從RAM中取出相乘,然後加到一個累加器中,所有這些操作都在一個時鍾周期內完成.擁有這樣一條指令的處理器就具備了
DSP功能:
具有這條指令就稱之為數字信號處理器的原因在於,所有的數字信號處理演算法中最為常見的算術操作就是"乘-加".這是因為數字信號處理中大量使用了內積,或稱"點積"的運算.無論是FIR濾波,FFT,信號相關,數字混頻,下變頻.所有這些數字信號處理的運算經常是將輸入信號與一個系數表或者與一個本地參考信號相乘然後積分(累加),這就表現為將兩個向量(或稱序列)進行點積,在編程上就變成將輸入的采樣放在一個循環buffer里,本地的系數表或參考信號也放在一個buffer里,然後使用兩個指針指向這兩個buffer.這樣就可以在一個loop裡面使用一個MAC指令將二者進行點積運算.這樣的點積運算對與處理器來說是最快的,因為僅需一個始終周期就可以完成一次乘加.
了解DSP的這一特點後,當我們設計一個嵌入式系統時,首先要考慮處理器所實現的演算法中是否有點積運算,即是否要經常進行兩個數組的乘加,(記住數字濾波,相關等都表現為兩個數組的點積)如果有的話,每秒要做多少次,這樣就能夠決定是否採用DSP,採用多高性能的DSP了.
浮點與定點 :
浮點與定點也是經常是初學者困惑的問題,在選擇DSP器件的時候,是採用浮點還是採用定點,如果用定點是16位還是32位?其實這個問題和你的演算法所要求的信號的動態范圍有關.
定點的計算不過是把一個數據當作整數來處理,通常AD采樣來的都是整數,這個數相對於真實的模擬信號有一個刻度因子,大家都知道用一個16位的AD去采樣一個0到5V的信號,那麼AD輸出的整數除以2^16再乘以5V就是對應的電壓.在定點DSP中是直接對這個16位的采樣進行處理,並不將它轉換成以小數表示的電壓,因為定點DSP無法以足夠的精度表示一個小數,它只能對整數進行計算.
而浮點DSP的優勢在於它可以把這個采樣得到的整數轉換成小數表示的電壓,並不損失精度(這個小數用科學記數法來表示),原因在於科學記數法可以表示很大的動態范圍的一個信號,以IEEE754浮點數為例,
單精度浮點格式: [31] 1位符號 [30-23]8位指數 [22-00]23位小數
這樣的能表示的最小的數是+-2^-149,最大的數是+-(2-2^23)*2^127.動態范圍為20*log(最大的數/最小的數)=1667.6dB 這樣大的動態范圍使得我們在編程的時候幾乎不必考慮乘法和累加的溢出,而如果使用定點處理器編程,對計算結果進行舍入和移位則是家常便飯,這在一定程度上會損失是精度.原因在於定點處理處理的信號的動態范圍有限,比如16位定點DSP,可以表示整數范圍為1-65536,其動態范圍為20*log(65536/1)=96dB.對於32定點DSP,動態范圍為20*log(2^32/1)=192dB,遠小於32位ieee浮點數的1667.6dB,但是,實際上192dB對絕大多數應用所處理的信號已經足夠了。
由於AD轉換器的位數限制,一般輸入信號的動態范圍都比較小,但在DSP的信號處理中,由於點積運算會使中間節點信號的動態范圍增加,所以主要考慮信號處理流程中中間結果的動態范圍,以及演算法對中間結果的精度要求,來選擇相應的DSP.另外就是浮點的DSP更易於編程,定點DSP編程中程序員要不斷調整中間結果的P,Q值,實際就是不斷對中間結果進行移位調整和舍入.。
DSP與RTOS:
TI的CCS提供BIOS,ADI的VDSP提供VDK,都是基於各自DSP的嵌入式多任務內核.DSP編程可以用單用C,也可以用匯編,或者二者結合,一般軟體編譯工具都提供了很好的支持.我不想在這里多說BIOS,VDK怎麼用這在相應的文檔里說的很詳細.我想給初學者說說DSP的RTOS原理.用短短幾段話說這個復雜的東西也是挑戰!
其實DSP的RTOS和基於其他處理器的通用RTOS沒什麼大的區別,現在幾乎人人皆知的uCOSii也很容易移植到DSP上來,只要把寄存器保存與恢復部分和堆棧部分改改就可以.一般在用BIOS和VDK之前,先看看操作系統原理的書比較好.uCOS那本書也不錯.
BIOS和VDK其實是一個RTOS內核函數集,DSP的應用程序會和這些函數連接成一個可執行文件.其實實現一個簡單的多任務內核並不復雜,首先定義好內核的各種數據結構,然後寫一個scheler函數,功能是從所有就緒任務中(通過查找就緒任務隊列或就緒任務表)找出優先順序最高的任務,並恢復其執行.然後在此基礎上寫幾個用於任務間通信的函數就可以了,比如event,message box,等等.
RTOS一般採用搶先式的任務調度方式,舉例說當任務A等待的資源available的時候,DSP會執行一個任務調度函數scheler,這個函數會檢查當前任務是否比任務A優先順序低,如果是的話,就會把它當前掛起,然後把任務A保存在堆棧里寄存器值全部pop到DSP處理器中(這就是所謂的任務現場恢復).接著scheler還會把從堆棧中取出任務A掛起時的程序執行的地址,pop到PC,使任務A繼續執行.這樣當前任務就被任務A搶先了.
使用RTOS之後,每個任務都會有一個主函數,這個函數的起始地址就是該任務的入口.一般每個任務的主函數里有一個死循環,這個循環使該任務周期地執行,完成一部分演算法模塊的功能,其實這個函數跟普通函數沒任何區別,類似於C語言中的main函數.一個任務創建的時候,RTOS會把這個函數入口地址壓入任務的堆棧中,好象這個函數(任務)剛發生過一次中斷一樣.一旦這個新創建任務的優先順序在就緒隊列中是最高的,RTOS就會從其堆棧中彈出其入口地址開始執行.
有一個疑問是,不使用RTOS,而是簡單使用一個主循環在程序中調用各個函數模塊,一樣可以實現軟體的調度執行.那麼,這種常用的方法與使用RTOS相比有什麼區別呢?其實,使用主循環的方法不過是一種沒有優先順序的順序執行的調度策略而已.這種方法的缺點在於,主循環中調用的各個函數是順序執行的,那麼,即使是一個無關緊要的函數(比如閃爍一個LED),只要他不主動返回,也會一直執行直到結束,這時,如果發生一個重要的事件(比如DMA buffer full 中斷),就會得不到及時的響應和處理,只能等到那個閃爍LED的函數執行完畢.這樣就使整個DSP處理的優先次序十分不合理.而在使用了RTOS之後,當一個重要的事件發生時,中斷處理會進入RTOS,並調用scheler,這時scheler 會讓處理這一事件的任務搶佔DSP處理器(因為它的優先順序高).而哪個閃爍LED任務即使晚執行幾毫秒都沒任何影響.這樣整個DSP的調度策略就十分合理。
6. 給我一篇完整的dsp程序設計
隨著DSP晶元功能的增強,已不再進行單純的數字信號處理任務,而是作為一種MCU被廣泛使用,控制板上各種資源,同時完成採集、計算、控制、通訊等任務。特別是當使用了TCP/IP或其它復雜通訊協議時,沒有一個實時多任務操作系統是很難進行任務調度的。μC/OS-II作為一種源碼公開的佔先式實時多任務操作系統,總是執行處於就緒狀態的優先順序最高的任務,並支持Semaphore(信號量)、Mailbox(郵箱)、Message Queue(消息隊列)等多種常用的進程間通信機制,是大多數高可靠嵌入式設備的首選。
2 開發環境簡介
APCI5096是北京康拓工業電腦公司自行開發的一款DSP目標板,主要用於對模擬信號量的采樣處理。該目標板以TMS320VC32為CPU,同時具有完備的輸入/輸出功能,可以實現30通道、16位、300KSPS的模擬輸入。調試用編譯器為TI公司的Code Composer 『C3x-『C4x,版本是4.10版。
3 移植過程
3.1 μC/OS-II系統結構
圖1說明了μC/OS-II的軟硬體體系結構。應用程序軟體處於整個系統的頂層,只和μC/OS-II與處理器無關的代碼以及μC/OS-II與應用相關的代碼關聯。這樣保證了應用軟體的可重用性。
μC/OS-II與處理器無關的代碼提供了μC/OS-II的系統服務。利用這些API函數,應用程序可以進行內存管理、任務間的通信以及創建、刪除任務等。μC/OS-II與應用相關的代碼提供了對μC/OS-II本身的裁減,並可根據實際需要進行任務數、任務棧的大小等設置。
大部分的μC/OS-II代碼是使用ANSI C語言書寫的,因此μC/OS-II的可移植性較好。盡管如此,仍然需要使用C和匯編語言寫一些處理器相關的代碼。移植工作需要改寫的是與處理器相關的代碼,包括三個文件:OS_ CPU.H、OS_ CPU_ C�C、OS_ CPU_ A�ASM。重點是任務堆棧的初始化、任務切換時棧指針的調整。
3.2 OS_ CPU.H
在不同的處理器中有不同的字長,所以必須重新定義一系列數據類型以確保移植的正確性。在OS_ CPU�H文件中應完成:數據類型的重新定義、堆棧數據類型的定義、堆棧增長方向的定義、臨界區開/關中斷的方法、任務切換函數OS_TASK_SW的宏定義。
(1)數據類型的聲明:在VC33中所有的整型數據(char、short、int、long)為相同的類型,用32位表示。浮點型數據(float、double)為相同類型,在VC33中用32位單精度浮點數表示。數據類型的重定義:
typedef unsigned char BOOLEAN;
typedef unsigned char INT8U;
typedef signed char INT8S;
typedef float FP32;
typedef double FP64;
(2)VC33棧的數據寬度為32位,採用上面重定義過的數據類型進行定義,確保棧數據類型的一致性。棧的數據類型聲明:
typedef INT32U OS_ STK;
(3)μC/OS-II訪問代碼的臨界區時需要先禁止中斷,並且在訪問完畢後重新允許中斷。μC/OS-II利用兩個宏來禁止和允許中斷,通過狀態寄存器的中斷使能位開關中斷。
cregister unsigned int ST; /*聲明CPU內部寄存器*/
#define OS_ ENTER_ CRITICAL() asm(「ANDN 2000H, ST "); /*清中斷使能位*/
#define OS_ EXIT_ CRITICAL() asm(「OR 2000H, ST "); /*置中斷使能位*/
3.3 OS_ CPU_ C.C
在OS_ CPU_ C.C文件中主要完成的是OSTaskStkInit()函數,其餘五個函數可以不進行處理。OSTaskStkInit()函數完成任務棧的初始化,使得任務棧的結構看起來如同在任務執行過程中發生過一次中斷並將所有寄存器保存到堆棧一樣。不同的編譯器在函數調用時會有不同的入棧方法,如:參數和返回地址入棧順序、參數之間入棧的順序、參數利用寄存器還是堆棧保存等。在具體實現時還需要根據編譯器的要求進行調整。
CCS函數調用時堆棧規則為:先將參數從左往右入棧、然後是函數返回地址入棧。依照此規則設計任務棧初始結構如圖2。VC33共有28個寄存器,程序中應將寄存器全部入棧,在OSTaskStkInit中實現:
{
OS_ STK *stk; /*定義棧的數據結構*/
opt=opt;
stk=(OS_ STK *)ptos; /*裝入棧頂指針*/
*stk=(OS_ STK)pdata; /*參數入棧*/
*++stk=(OS_ STK)task; /*任務返回地址*/
*++stk=(OS_ STK)task; /*中斷返回地址*/
*++stk=(OS_ STK)0x2000; /*狀態寄存器,開中斷*/ 其餘CPU寄存器全部入棧,並初始化為0
}
3.4 OS_ CPU_ A.ASM
在OS_ CPU_ A�ASM文件中要求用戶編寫四個簡單的匯編語言函數:OSStartHighRdy()、OSCtxSw()、OSIntCtxSw()、OSTickISR()。這四個函數具有完全相同的公共部分:寄存器入棧和寄存器出棧。只要按照上面設計好的棧結構進行就可以了。注意的是VC33的R0到R7是擴展精度寄存器,具有40位。在入棧和出棧時均需要用兩句話完成,如下:
入棧: 出棧:
PUSH R0 POPF R0
PUSHF R0 POP R1
而OSIntCtxSw函數具有特殊部分,該函數用於從中斷返回時進行任務切換,由於在調用_ OSIntCtxSw函數前已經發生了中斷,中斷服務程序已經將CPU寄存器保存到堆棧中了,所以此處不再進行寄存器保存。同時還要進行棧指針的調整,去掉堆棧中一些不需要的內容,然後再將寄存器全部出棧。由於該函數是μC/OS-II中唯一的與編譯器相關的函數,所以在移植後必須利用多次任務切換檢查棧指針是否正確調整。
3.5 時鍾中斷源初始化
μC/OS-II還要求用戶提供一個時鍾資源,用於實現時間延時和確認超時。根據APCI5096的硬體設置,需要在三個文件中進行時鍾資源的設置。
(1)OS_ CPU_ A�ASM:
APCI5096中,已將VC33的定時器1用於測頻通道,因此利用未被佔用的定時器0產生定時中斷。實現方法為在TINT0的中斷向量入口處放一跳轉指令,跳轉到自己寫的OSTickISR。
�sect 「�TINT0_ vector"
TINT0 br _ OSTickISR
(2)CMD文件
將TINT0跳轉到OSTickISR後,還應再指定TINT0的向量入口地址。APCI5096板上的VC33被設置為BootLoader方式,在該方式下TINT0的入口地址固定在0x809FC9。在CMD文件的SECTIONS段指定如下:
�TINT0_ vector:> 0x809FC9
(3)Main�C文件
μC/OS-II要求用戶在OSStart()運行後,μC/OS-Ⅱ啟動運行的第一個任務中初始化節拍中斷。自己編寫一個函數TimerInit(),並在第一個任務開始處調用該函數完成定時器0的初始化。函數中TIM0_ XXX代表的是定時器0的三個寄存器的地址,在完成對定時器0的設置後還要打開全局中斷和時鍾中斷。
{
*TIM0_PRD= 0x7530; /*設置周期為1KHZ*/
*TIM0_CNT=0;
*TIM0_CTL=0x2C1; /*啟動時鍾*/
ST|=0x2000; /*打開中斷*/
IE|=0x100; /*打開時鍾中斷*/
}
4 測試、編寫驅動和應用程序
做完以上工作以後,就要測試移植是否成功。最初測試時,可以先運行操作系統本身,調度一些簡單的任務和時鍾節拍中斷任務。主要測試系統本身的正確性,如果調試成功就可以在上面繼續開發驅動程序和添加應用程序。
7. 淺談如何學習DSP軟體開發
對於學習DSP重要的是理清外設的工作 構架,相應的寄存器如何設置,沒有必 要對寄存器花太多的時間去研究,用的 時候能找到(寄存器的名稱都是英文的 縮寫,很好理解的)。學習DSP,先找 本中文教材入個門,之後你會發現好多 地方、尤其是真正要用的,往往也是最 復雜的地方書上都找不到,更談不上做 什麼項目了,這時候就要開始深入研究 Data Sheet,以及官網的源代碼示例 有了之前的中文教材基礎看起來就快多 了;學習DSP重要的不是會編程,而是 演算法的研究(Matlab/Simulnk模擬就不
8. 如何將匯編語言與C語言整合至DSP
隨著DSP處理器性能的提升以及編譯器最佳化技術的進步,曾經紅極一時、僅用匯編語言編寫DSP應用程序的作法已逐漸被淘汰。今天,幾乎每個DSP應用程序都使用C語言程序代碼和匯編程序碼混合的方式。對於一些性能需求極高的關鍵功能,DSP工程師會繼續使用高度最佳化的匯編程序碼;而一些次要的功能現在也使用C語言編寫,使程序代碼更容易維護和移植。對於C語言和匯編程序碼的結合,每位DSP工程師都需要掌握特殊的工具和方法。 眾所皆知,匯編語言編碼具有更高的性能優勢,而用C語言編碼則較容易且速度也更快。為了解其中原因,以下我們進一步比較匯編語言編碼與C語言編碼的優缺點: 匯編語言編碼的優點: 匯編語言編碼可以充分利用處理器的獨特指令以及各種專門的硬體資源。而C語言程序代碼是通用型程序代碼,必須支持各種硬體平台,因此很難支持特殊平台程序代碼。 匯編程序設計人員通常對應用程序非常熟悉,可以作出編譯器無法作出的假設。 匯編程序設計人員可以發揮人類的創造性;而再先進的編譯器也只是一個自動化的程序。 匯編語言編碼的缺點: 匯編程序設計人員必須解決耗時的機器級問題,如緩存器分配和指令排程。若使用C語言程序代碼,這些問題可以由編譯器解決。 使用匯編語言編碼的程序設計人員必須了解DSP架構及其指令集的專業知識;而C語言編碼只需要掌握相當普及的C語言知識。 若使用匯編語言,將應用程序從一個平台移植到另一個平台非常困難也相當耗時;而C語言應用程序的移植相對而言非常容易。 圖1顯示了如何利用專用硬體機制來獲得高度最佳化的匯編程序碼。左邊的C語言編碼利用模塊演算法設計出一個循環緩沖區P1;右邊高度最佳化的匯編程序碼中,等效的緩沖區是利用CEVA-TeakLite-III DSP核心的模塊運算機制(Molo Mechanism)設計產生的。只要緩沖區指標(本例中的r0)有更新,模塊運算機制便會自動執行模塊運算。這種運算與指針更新在同一個周期發生,因此匯編程序碼比C語言程序代碼更加高效,可為模塊運算產生獨立的指令。 點擊看原圖圖1:右邊的CEVA-TeakLite-III匯編程序碼可以建置成左邊的C語言程序代碼。 為DSP應用選擇C/匯編程序碼 混合使用的問題就在於該如何劃分C語言程序代碼和匯編程序碼的界限,而答案取決於剖析器提供的性能分析結果。然而在使用剖析器之前,DSP工程師需要為應用程序定義清晰的對象,一些典型的對象包括循環數、程序代碼大小和數據大小。一旦這些對象確定後,所有應用程序都應該先以C語言編寫和製作,隨後使用剖析器來分析性能。 在一些極端情況下,如控制應用,用C語言層級的編碼就足夠了;但大多數情況下,原始C語言層級應用程序版本不會遵從一個或多個對象,這也意味著需要使用一些匯編程序碼來完成。在求助於匯編語言編碼之前,C語言編碼可提供許多方法來提高性能,但這些方法不屬於本文討論的范疇。假設所有C語言級的方法全用完了,並且准備使用匯編語言編碼,這時強烈建議將原始C語言程序代碼保存起來。這樣不僅方便除錯,而且一旦條件許可(比如轉移到更強大的平台)還可以回復原始的C語言。 程序代碼中的匯編語言部份應盡可能維持在最少,這樣便能分析從剖析器得到的性能結果,並定義應用程序中的關鍵函數。關鍵函數會佔用大部份執行時間,必須用匯編語言重寫才能滿足性能對象。當兩到三個最關鍵的函數重寫後,需要重新進行性能測量,若應用程序仍然不能滿足對象需求,那麼必須使用匯編語言定義並重寫額外的關鍵函數,這個過程需要不斷地重復直到滿足性能對象需求為止。 匯編語言設計師的編譯器考慮 在編寫會與C語言程序代碼結合的匯編程序碼時,匯編程序設計人員必須了解編譯器的慣例和假設。其中有個重要的編譯器慣例是函數呼叫慣例,也稱為函數參數傳遞慣例。這個慣例描述了編譯器如何在一個函數呼叫另一個函數時傳遞參數。為了使匯編語言函數能被C語言函數成功呼叫;反之亦然;匯編語言函數必須截取參數,然後將參數發送到由函數呼叫慣例定義的硬體資源上,通常為緩存器或堆棧內存。 匯編程序設計人員還必須了解編譯器的緩存器使用慣例。這些慣例將硬體緩存器分成被呼叫者保存(callee-saved;或呼叫者使用,caller-used);以及被呼叫者使用(callee-used;或呼叫者保存,caller-saved)緩存器。編譯器假設被呼叫者保存緩存器在函數呼叫過程中保持不變的值,若匯編程序設計人員希望使用這種緩存器,他們必須先將緩存器的值備份,然後在返回到C語言程序代碼之前恢復這些緩存器的內容;相反的,被呼叫者使用緩存器被認為在函式呼叫過程中不會保持一定的值。這意味著匯編程序設計人員使用這些緩存器之前無需進行備份,不過他們必須記住,當匯編語言函數呼叫C語言函數時,被呼叫者可以對這些緩存器進行覆寫。 圖2為一個從CEVA-X1641 DSP核心FFT實作中截取的匯編程序碼案例。其中以黃色標示的add指令遵循CEVA-X1641編譯器的呼叫慣例,在r0地址緩存器中傳遞指針參數。標為藍色的pushd指令用於備份,隨後函數會使用的被呼叫者保存緩存器。
9. 什麼是DSP編譯環境
[編輯本段]數字信號處理
數字信號處理(Digital Signal Processing,簡稱DSP)是一門涉及許多學科而又廣泛應用於許多領域的新興學科。20世紀60年代以來,隨著計算機和信息技術的飛速發展,數字信號處理技術應運而生並得到迅速的發展。數字信號處理是一種通過使用數學技巧執行轉換或提取信息,來處理現實信號的方法,這些信號由數字序列表示。在過去的二十多年時間里,數字信號處理已經在通信等領域得到極為廣泛的應用。德州儀器、Freescale等半導體廠商在這一領域擁有很強的實力。
[編輯本段]DSP微處理器
DSP晶元DSP(digital signal processor)是一種獨特的微處理器,是以數字信號來處理大量信息的器件。其工作原理是接收模擬信號,轉換為0或1的數字信號,再對數字信號進行修改、刪除、強化,並在其他系統晶元中把數字數據解譯回模擬數據或實際環境格式。它不僅具有可編程性,而且其實時運行速度可達每秒數以千萬條復雜指令程序,遠遠超過通用微處理器,是數字化電子世界中日益重要的電腦晶元。它的強大數據處理能力和高運行速度,是最值得稱道的兩大特色。 DSP微處理器(晶元)一般具有如下主要特點: (1)在一個指令周期內可完成一次乘法和一次加法; (2)程序和數據空間分開,可以同時訪問指令和數據; (3)片內具有快速RAM,通常可通過獨立的數據匯流排在兩塊中同時訪問; (4)具有低開銷或無開銷循環及跳轉的硬體支持; (5)快速的中斷處理和硬體I/O支持; (6)具有在單周期內操作的多個硬體地址產生器; (7)可以並行執行多個操作; (8)支持流水線操作,使取指、解碼和執行等操作可以重疊執行。 當然,與通用微處理器相比,DSP微處理器(晶元)的其他通用功能相對較弱些。 DSP優點: 對元件值的容限不敏感,受溫度、環境等外部參與影響小; 容易實現集成;VLSI 可以時分復用,共享處理器; 方便調整處理器的系數實現自適應濾波; 可實現模擬處理不能實現的功能:線性相位、多抽樣率處理、級聯、易於存儲等; 可用於頻率非常低的信號。 DSP缺點: 需要模數轉換; 受采樣頻率的限制,處理頻率范圍有限; 數字系統由耗電的有源器件構成,沒有無源設備可靠。 但是其優點遠遠超過缺點。
[編輯本段]DSP技術的應用
語音處理:語音編碼、語音合成、語音識別、語音增強、語音郵件、語音儲存等。 圖像/圖形:二維和三維圖形處理、圖像壓縮與傳輸、圖像識別、動畫、機器人視覺、多媒體、電子地圖、圖像增強等。 軍事;保密通信、雷達處理、聲吶處理、導航、全球定位、跳頻電台、搜索和反搜索等。 儀器儀表:頻譜分析、函數發生、數據採集、地震處理等。 自動控制:控制、深空作業、自動駕駛、機器人控制、磁碟控制等。 醫療:助聽、超聲設備、診斷工具、病人監護、心電圖等。 家用電器:數字音響、數字電視、可視電話、音樂合成、音調控制、玩具與游戲等。 生物醫學信號處理舉例: CT機示例CT:計算機X射線斷層攝影裝置。(其中發明頭顱CT英國EMI公司的豪斯菲爾德獲諾貝爾獎。) CAT:計算機X射線空間重建裝置。出現全身掃描,心臟活動立體圖形,腦腫瘤異物,人體軀干圖像重建。 心電圖分析。
基於DSP的智能視頻監控系統
傳統的視頻監視系統是簡單的非智能閉路電視(CCTV)系統,其缺點十分明顯。這樣的系統或者需要安保人員實時監視畫面以捕捉關鍵事件,或者需要在事後對視頻記錄進行回放並進行人工分析,耗時耗力,成本高而效率低。近幾年,DSP在智能視頻監控系統方面的應用不斷完善,正在逐漸取代傳統的模擬非智能系統。 iSuppli公司2006年的一份分析報告曾指出,IP視頻監控系統市場到2010年將增長近十倍。 IP監控的創新技術之一是「智能攝像機」,它擁有強大的數字信號處理器,能探測威脅並觸發自動響應。可見,DSP晶元是智能監控的核心。
基於DSP的語音實時變速系統
在外語多媒體教學中,要求對語速進行快慢控制,以適應不同程度學生的需求。然而,傳統的語音變速產品往往在教師改變語速的同時,也改變了原說話者的語調,不能達到教學的真正目的。因此,語音變速系統應當具備調整語速的同時,還需要保證原說話者語調保持不變的特點。基於DSP(TMS320C5409)的語音實時變速系統能夠任意調整語音語速,達到外語多媒體教學的需求。
[編輯本段]DSP發展軌跡
DSP產業在約40年的歷程中經歷了三個階段:第一階段,DSP意味著數字信號處理,並作為一個新的理論體系廣為流行;隨著這個時代的成熟,DSP進入了發展的第二階段,在這個階段,DSP代表數字信號處理器,這些DSP器件使我們生活的許多方面都發生了巨大的變化;接下來又催生了第三階段,這是一個賦能(enablement)的時期,我們將看到DSP理論和DSP架構都被嵌入到SoC類產品中。」 第一階段,DSP意味著數字信號處理 。 80年代開始了第二個階段,DSP從概念走向了產品,TMS32010所實現的出色性能和特性備受業界關注。方進先生在一篇文章中提到,新興的DSP業務同時也承擔著巨大的風險,究竟向哪裡拓展是生死攸關的問題。當設計師努力使DSP處理器每MIPS成本降到了適合於商用的低於10美元范圍時,DSP在軍事、工業和商業應用中不斷獲得成功。到1991年,TI推出價格可與16位微處理器不相上下的DSP晶元,首次實現批量單價低於5美元,但所能提供的性能卻是其5至10倍。 到90年代,多家公司躋身DSP領域與TI進行市場競爭。TI首家提供可定製 DSP——cDSP,cDSP 基於內核 DSP的設計可使DSP具有更高的系統集成度,大加速了產品的上市時間。同時,TI瞄準DSP電子市場上成長速度最快的領域。到90年代中期,這種可編程的DSP器件已廣泛應用於數據通信、海量存儲、語音處理、汽車電子、消費類音頻和視頻產品等等,其中最為輝煌的成就是在數字蜂窩電話中的成功。這時,DSP業務也一躍成為TI最大的業務,這個階段DSP每MIPS的價格已降到10美分到1美元的范圍。 21世紀DSP發展進入第三個階段,市場競爭更加激烈,TI及時調整DSP發展戰略全局規劃,並以全面的產品規劃和完善的解決方案,加之全新的開發理念,深化產業化進程。成就這一進展的前提就是DSP每MIPS價格目標已設定為幾個美分或更低。
[編輯本段]DSP未來發展
1、數字信號處理器的內核結構進一步改善,多通道結構和單指令多重數據(SIMD)、特大指令字組(VLIM)將在新的高性能處理器中將佔主導地位,如Analog Devices的 ADSP-2116x。ADSP產品 2、DSP 和微處理器的融合: 微處理器是低成本的,主要執行智能定向控制任務的通用處理器能很好執行智能控制任務,但是數字信號處理功能很差。而DSP的功能正好與之相反。在許多應用中均需要同時具有智能控制和數字信號處理兩種功能,如數字蜂窩電話就需要監測和聲音處理功能。因此,把DSP和微處理器結合起來,用單一晶元的處理器實現這兩種功能,將加速個人通信機、智能電話、無線網路產品的開發,同時簡化設計,減小PCB體積,降低功耗和整個系統的成本。例如,有多個處理器的Motorola公司的DSP5665x,有協處理器功能的Massan公司FILU-200,把MCU功能擴展成DSP和MCU功能的TI公司的TMS320C27xx以及Hitachi公司的SH-DSP,都是DSP和MCU融合在一起的產品。互聯網和多媒體的應用需要將進一步加速這一融合過程。 3、DSP 和高檔CPU的融合: 大多數高檔GPP如Pentium 和PowerPC都是SIMD指令組的超標量結構,速度很快。LSI Logic 公司的LSI401Z採用高檔CPU的分支預示和動態緩沖技術,結構規范,利於編程,不用擔心指令排隊,使得性能大幅度提高。Intel公司涉足數字信號處理器領域將會加速這種融合。 4、DSP 和SOC的融合: SOCSOC(System-On-Chip)是指把一個系統集成在一塊晶元上。這個系統包括DSP 和系統介面軟體等。比如Virata公司購買了LSI Logic公司的ZSP400處理器內核使用許可證,將其與系統軟體如USB、10BASET、乙太網、UART、GPIO、HDLC等一起集成在晶元上,應用在xDSL上,得到了很好的經濟效益。因此,SOC晶元近幾年銷售很好,由1998年的1.6億片猛增至1999年的3.45億片。1999年,約39%的SOC產品應用於通訊系統。今後幾年,SOC將以每年31%的平均速度增長,到2004年將達到13億片。毋庸置疑,SOC將成為市場中越來越耀眼的明星。 5、DSP 和FPGA的融合: FPGA是現場編程門陣列器件。它和DSP集成在一塊晶元上,可實現寬頻信號處理,大大提高信號處理速度。據報道,Xilinx 公司的Virtex-II FPGA對快速傅立葉變換(FFT)的處理可提高30倍以上。它的晶元中有自由的FPGA可供編程。Xilinx公司開發出一種稱作Turbo卷積編解碼器的高性能內核。設計者可以在FPGA中集成一個或多個Turbo內核,它支持多路大數據流,以滿足第三代(3G)WCDMA無線基站和手機的需要,同時大大WCDMA無線基站節省開發時間,使功能的增加或性能的改善非常容易。因此在無線通信、多媒體等領域將有廣泛應用。
[編輯本段]Windows系統DSP
DSP版本=授權提供版(Delivery Service Partner),類似於OEM版,比正式版便宜一點。
10. DSP編譯問題
先看CCS設置
再看鏈接庫是否添加正確
還有CMD文件是否正確,有的實驗箱用了兩個CMD,頭文件一個,用戶代碼一個。一般開發板一個。
實在不行就把源碼發上來,包括你的包含文件,以及設置選項。
CCS編譯器報錯有很多種情況。