版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
大家好Blackfin嵌入式C編程本章要點(diǎn)CCES集成開發(fā)環(huán)境嵌入式C編程31.CCES集成開發(fā)環(huán)境ADSP程序開發(fā)流程4CCES(CrosscoreEmbeddedStudio)是ADI公司針對ADSP系列處理器提供的新一代集成開發(fā)工具。其使用方法與VisualDSP++非常類似。CCES通過圖形窗口的方式與用戶進(jìn)行信息交換,程序開發(fā)人員可以在窗口中進(jìn)行高效的工程管理,輕松地在編輯、編譯和調(diào)試之間互相切換,實(shí)現(xiàn)高效率的程序開發(fā)。CCES集成開發(fā)環(huán)境5CrossCore?Embedded StudioisADI’sNew Eclipse?basedToolchain???????IDEDebuggerCompilersAssemblersLinkerLoaderAlgorithmLibraries76CCESIDE特點(diǎn)基于Eclipse的集成開發(fā)環(huán)境
支持多核開發(fā)與調(diào)試優(yōu)異的代碼生成工具,包括Compilers,Assemblers,Linker,Loader.成熟的算法庫優(yōu)化的系統(tǒng)服務(wù)及設(shè)備驅(qū)動軟件插件便于集成,包括RTOS,TCP/IPStack,USBStack,&FileSystem.硬件兼容性強(qiáng),支持多核處理器板、擴(kuò)展子板,支持音視頻采集、處理、顯示與播放.7步驟1:新建工程(1/7)—啟動CCESCCES程序開發(fā)、調(diào)試步驟8步驟1:新建工程(2/7)—點(diǎn)擊新建工程9步驟1:新建工程(3/7)—輸入工程名稱與類型10步驟1:新建工程(5/7)—配置路徑11步驟1:新建工程(5/7)—配置目標(biāo)平臺12步驟1:新建工程(6/7)—配置插件13步驟1:新建工程(7/7)—配置開發(fā)語言14步驟2:編程(1/2)—添加sourcefileC/C++視圖Folder&fileautoGenerated15步驟2:編程(2/2)—編寫代碼GeneratedbyCCES16步驟3:編譯及配置(1/10)—點(diǎn)擊BuildProject17步驟3:編譯及配置(2/10)—觀察編譯結(jié)果18步驟3:編譯及配置(3/10)—點(diǎn)擊屬性配置19步驟3:編譯及配置(4/10)—Assembler配置Commandline20步驟3:編譯及配置(5/10)—C/C++CompilerAssemblerleveloptimization21步驟3:編譯及配置(6/10)—definition&include22步驟3:編譯及配置(7/10)—LDRfileconfigIfyoumakeaLDRfile23步驟3:編譯及配置(8/10)—目標(biāo)處理器選擇目標(biāo)器件24步驟3:編譯及配置(9/10)—編譯類型配置25步驟3:編譯及配置(10/10)—環(huán)境變量26步驟4:調(diào)試(1/10)—點(diǎn)擊DebugAs27步驟4:調(diào)試(2/10)—選擇目標(biāo)處理器28步驟4:調(diào)試(3/10)—選擇連接類型29步驟4:調(diào)試(4/10)—選擇平臺選擇仿真器,具體型號查看仿真器型號:本實(shí)驗(yàn)使用HPUSB-ICE仿真器30步驟4:調(diào)試(5/10)—配置自動斷點(diǎn)31步驟4:調(diào)試(6/10)—用戶板卡配置32步驟4:調(diào)試(7/10)—多處理器配置33步驟4:調(diào)試(8/10)—配置載入程序34步驟4:調(diào)試(9/10)—切換視圖Debug視圖(customperspective)35步驟4:調(diào)試(10/10)—變量、內(nèi)存、寄存器監(jiān)測可查看變量、內(nèi)存、寄存器36步驟4:導(dǎo)入已有工程(1/3)—點(diǎn)擊Import37步驟4:導(dǎo)入已有工程(2/3)—選擇ExistingProject38步驟4:導(dǎo)入已有工程(3/3)—導(dǎo)入項(xiàng)目文件39步驟5:關(guān)閉與刪除工程(1/3)—關(guān)閉工程CloseNon-currentproject40步驟5:關(guān)閉與刪除工程(2/3)—刪除工程41步驟5:關(guān)閉與刪除工程(3/3)—是否從磁盤刪除工程42C/C++編譯器CCES使用ccblkfn編譯器,此C/C++編譯器有如下功能:處理C和C++源文件,產(chǎn)生機(jī)器級源代碼和目標(biāo)文件。在目標(biāo)文件中包含可重定位的代碼和調(diào)試信息。在處理器存儲區(qū)中提供可由鏈接器替換的可重定位數(shù)據(jù)和程序存儲段。
C/C++編譯器處理C和C++語言源文件并生成Blackfin匯編源文件。匯編源文件由BlackfinDSP系列匯編器(easmblkfn.exe)匯編產(chǎn)生。匯編器進(jìn)一步產(chǎn)生ELF(ExecutableandLinkableFormat)目標(biāo)文件,由它可以鏈接(使用鏈接器)產(chǎn)生一個BlackfinDSP可執(zhí)行文件或?qū)⑵浒谝粋€檔案文件庫(elfar.exe)中。編譯器如何控制處理過程的匯編,鏈接和存檔階段取決于輸入源文件和所用的編譯器選項(xiàng)。2.嵌入式C編程43BlackfinC/C++編譯器支持的數(shù)據(jù)類型類型位大小數(shù)學(xué)表示方式使用sizeof()返回值char8位有符號8位二進(jìn)制補(bǔ)碼1unsignedchar8位無符號8位無符號量1short16位有符號16位二進(jìn)制補(bǔ)碼2unsignedshort16位無符號16位無符號量2int32位有符號32位二進(jìn)制補(bǔ)碼4unsignedint32位無符號32位無符號量4long32位有符號32位二進(jìn)制補(bǔ)碼4unsignedlong32位無符號32位無符號量4指針32位32位二進(jìn)制補(bǔ)碼4函數(shù)指針32位32位二進(jìn)制補(bǔ)碼4float32位32位IEEE單精度4double64位64位IEEE雙精度8fract1616位有符號1.15小數(shù)形式2fract3232位有符號1.31小數(shù)形式444注意:Blackfin定點(diǎn)處理器只支持定點(diǎn)運(yùn)算,寬度最高32位,所以浮點(diǎn)數(shù)據(jù)及64位數(shù)據(jù)不直接支持,需通過軟件轉(zhuǎn)換來實(shí)現(xiàn)轉(zhuǎn)換,速度會降低很多。分?jǐn)?shù)形式的數(shù)據(jù)類型fract16和fract32并不是實(shí)際存在的數(shù)據(jù)類型,事實(shí)上就是以short和int形式存儲,即1.15的16位有符號short整型(定點(diǎn)型),1.31的32位有符號int整型(定點(diǎn)型),用于表示有符號小數(shù)。typedefshortfract16;
typedefintfract32;使用該數(shù)據(jù)類型時需要先#include<fract.h>45邏輯操作符與位操作符邏輯操作符——與(&&)、或(||)、非(!)對操作數(shù)執(zhí)行邏輯操作,主要用于if等判斷語句中。例如:if(x<SCR_XSIZE&&SCR_YSIZE)位操作符——與(&)、或(|)、求反(~)、異或(^)、左移(<<)、右移(>>)&位與——清除某個位或某些位例:#definepLCDCON(volatileunsignedint*)0x1F00000*pLCDCON&=0xfffffffe;//清除LCD控制寄存器的最低位來關(guān)閉LCD|位或——設(shè)置某個位或某些位例:*pLCDCON|=0x1;//設(shè)置LCD控制寄存器的最低位來打開LCD^位異或——將某個位或某些位取反46<<左移——設(shè)置寄存器的位或乘以2n
例:*pLCDCON=0x6<<6;//設(shè)置LCDCON寄存器的第8位、第9位為1。(Binary:110000000)>>右移——實(shí)現(xiàn)除法(除以2n
)如果除數(shù)是2的n次方,編譯器就會調(diào)用移位操作來完成除法運(yùn)算(無符號除法比有符合除法的效率高)。~求反——將每一位取反。47Volatile的用法編譯器有一種技術(shù)叫數(shù)據(jù)流分析,分析程序中的變量在哪里賦值、哪里使用、哪里失效,分析結(jié)果可以用于常量合并,常量傳播等優(yōu)化。當(dāng)它覺察到代碼沒有修改變量的值時,就可能在訪問變量時提供上次訪問的緩沖值,這能夠提高程序的效率。但這些優(yōu)化可能會帶來問題(特別是對硬件寄存器操作的程序中),這時需要用volatile關(guān)鍵詞來禁止做這些優(yōu)化。——告訴編譯器:變量已經(jīng)變化,不要用緩存值(變量可能會隨時改變,不要對其優(yōu)化,而是每次用的時候去讀寫該變量。)48使用volatile變量的場合硬件寄存器通常要加volatile說明。#definepFlashA_PortA_Dir(volatileunsignedchar*)0x20270006在中斷服務(wù)程序中修改的供其它程序檢測的變量需要加volatile。例:中斷服務(wù)程序常常通過改變一些全局變量來通知應(yīng)用程序某個外部事件已經(jīng)發(fā)生,這些全局變量不應(yīng)該被優(yōu)化。多任務(wù)環(huán)境中各任務(wù)間共享的標(biāo)志應(yīng)該加volatile。49C/C++編譯語言擴(kuò)展
編譯器支持對ISO/ANSI標(biāo)準(zhǔn)的C語言和C++語言的擴(kuò)展。為了使C/C++擴(kuò)展中附加關(guān)鍵字與ISO/ANSI標(biāo)準(zhǔn)C/C++的關(guān)鍵字不沖突,C/C++擴(kuò)展中附加關(guān)鍵字在形式上均以雙下劃線“__”打頭。標(biāo)準(zhǔn)C/C++關(guān)鍵字用一個下劃線“_”打頭,編譯器擴(kuò)展C/C++關(guān)鍵字用兩個下劃線“__”打頭;標(biāo)準(zhǔn)庫函數(shù)名用一個下劃線“_”打頭,編譯器擴(kuò)展的庫函數(shù)(由編譯器給出的內(nèi)嵌函數(shù))名用兩個下劃線“__”打頭。50內(nèi)聯(lián)函數(shù)關(guān)鍵字(inline),ccblkfn的inline關(guān)鍵字使聲明為inline類型的函數(shù)代碼內(nèi)嵌到調(diào)用它的地方。inline是C++的標(biāo)準(zhǔn)特點(diǎn),ccblkfn將它作為C的擴(kuò)展。使用該選項(xiàng)節(jié)省了調(diào)用函數(shù)的額外時間開銷,因此提高了程序執(zhí)行速度。內(nèi)聯(lián)匯編語言關(guān)鍵字(asm),ccblkfn的asm()結(jié)構(gòu)可在C/C++函數(shù)中內(nèi)嵌BlackfinDSP匯編語言指令。對程序中用C或C++不易或不能高效實(shí)現(xiàn)的地方可以用asm()結(jié)構(gòu)利用匯編語言實(shí)現(xiàn)。51指定要放置數(shù)據(jù)的存儲器位置的關(guān)鍵字(section),section關(guān)鍵字使編譯器在匯編器的交叉輸出文件的.SECTION中放置目標(biāo)或函數(shù)代碼。可以用section()中的字符串參數(shù)命名.SECTION。如果對目標(biāo)或函數(shù)聲明沒有指定section(),編譯器會使用默認(rèn)值。例如:section(“buffer”)intin[1024]={#include“sine.dat”};指針受限關(guān)鍵字(restrict),restrict關(guān)鍵字支持受限制的指針特性。restrict的使用局限于聲明一個指針,并指明指針是訪問它所指向內(nèi)容的惟一途徑。簡單來說,restrict使指針不能使用別名,即兩個不同受限指針不能指向同一個對象(指針不能有別名)。52內(nèi)置函數(shù)(buildin),編譯器支持使用內(nèi)置函數(shù),從而有效利用硬件資源。有關(guān)這些函數(shù)的信息已經(jīng)內(nèi)嵌在編譯器中。用戶程序使用正常的函數(shù)調(diào)用句法調(diào)用它們。編譯器處理此類函數(shù)調(diào)用,會生成一條或多條機(jī)器指令,就像處理正常的操作符(如+和*)那樣。內(nèi)置函數(shù)名是以__builtin_開始的。頭文件為內(nèi)置函數(shù)定義一個可讀性更好的名稱,這個名稱不使用__builtin_前綴。例如在ccblkfn.h中:
#definesysreg_write(A,B)__builtin_sysreg_write(A,B)53預(yù)處理命令預(yù)處理器在編譯器之前運(yùn)行,它在編譯之前對等待處理的代碼進(jìn)行預(yù)處理。預(yù)處理器指令以“#”開始,以回車符結(jié)束(不能有“;”號),如何預(yù)處理器指令長于一行,用“\”續(xù)行。預(yù)處理器指令對大小寫敏感,必須用小寫。預(yù)處理命令的功能如下包含系統(tǒng)和用戶定義頭文件,例如#include定義宏和標(biāo)志常量,例如#define提供條件匯編和編譯,例如#ifdef、#ifndef、#if(均以#endif結(jié)束)54#if和#endif
條件編譯指令,例如:#defineLCD_TYPEMLCD_320_240#if(LCD_TYPE==MLCD_320_240)#defineSCR_XSIZE(640)#defineSCR_XSIZE(480)#defineLCD_XSIZE(320)#defineLCD_XSIZE(240)#if(LCD_TYPE==CLCD_240_320)#defineSCR_XSIZE(640)#defineSCR_XSIZE(480)#defineLCD_XSIZE(240)#defineLCD_XSIZE(320)#endif技巧:在程序調(diào)試中,可以用#if臨時注釋掉一段代碼,如下所示:#if0…#endif當(dāng)需要這段代碼時,只需將0變?yōu)?即可。55系統(tǒng)庫函數(shù)(內(nèi)置函數(shù))編譯器內(nèi)置函數(shù)(CompilerBuiltinFunction),主要針對一些常用的操作,其實(shí)現(xiàn)大多與處理器硬件電路有關(guān)。內(nèi)置函數(shù)一般采用匯編語言編寫,一旦用戶調(diào)用此函數(shù),編譯器直接映射到相應(yīng)的匯編代碼中(會被編譯器識別出來,使用固定的匯編語句來代替庫函數(shù)的調(diào)用),運(yùn)行效率很高。有一些內(nèi)置函數(shù)是系統(tǒng)管理函數(shù),這些內(nèi)置函數(shù)將系統(tǒng)管理的各項(xiàng)操作封裝成函數(shù),直接調(diào)用這些內(nèi)置函數(shù)將能提高代碼的可讀性。例如:獲取系統(tǒng)時鐘周期的函數(shù)示例如下//使用內(nèi)聯(lián)匯編程序,程序可讀性差//使用ADI提供的內(nèi)置函數(shù),可讀性好unsignedintget_cycles(void){unsignedintret_val;asm(“%0=CYCLES;”:”=d”.(ret_val)::);returnret_val;}#include<ccblkfn.h>#include<sysreg.h>unsignedintget_cycles(void){returnsysreg_read(reg_CYCLES);}Clevelfunctionswithseveralassemblyinstructionsandexpandedintocompilerintermediateinstruction56系統(tǒng)庫函數(shù)內(nèi)部函數(shù)通常支持16位或32位數(shù)的操作包括libc、libdsp、libetsi、libio、lwip、libbtc等庫,支持如下的操作和函數(shù):小數(shù)值內(nèi)部函數(shù)ETSI(歐洲電信標(biāo)準(zhǔn)協(xié)會)標(biāo)準(zhǔn)的支持復(fù)數(shù)小數(shù)數(shù)據(jù)和操作Viterbi編碼和解碼函數(shù)循環(huán)緩沖區(qū)函數(shù)高低字節(jié)交換(Endian-swapping)函數(shù)系統(tǒng)內(nèi)部函數(shù)視頻操作函數(shù)未對齊的數(shù)據(jù)函數(shù)內(nèi)部函數(shù)支持防止溢出的飽和算法,這一點(diǎn)與標(biāo)準(zhǔn)C程序不同。庫文件位置:安裝目錄\Blackfin\lib\頭文件位置:安裝目錄\Blackfin\includes\源代碼位置:安裝目錄\Blackfin\lib\src\可根據(jù)需要對源代碼進(jìn)行修改,請將文件復(fù)制到其它地方,重命名后再進(jìn)行修改。調(diào)用庫文件時需要先引用相應(yīng)的頭文件。57示例:完成一個256階的FIR濾波器:
#include<fract.h>fract32filter(fract16*in,fract16*coeff){inti;fract32acc=0;for(i=0;i<128;i++){acc=add_fr1x32(acc,mult_fr1x32(in[i],coeff[i]));}returnacc;}intfilter(short*in,short*coeff){inti;intacc=0;for(i=0;i<128;i++){acc+=((in[i]*coeff[i])>>15);}returnacc;}58ETSIBuiltins–fullyoptimisedFractional
arithmetictoastandardspecificationEuropeanTelecommunicationsStandardsInstitute'sfractfunctionscarefullymappedontothecompilerbuilt-ins.頭文件libetsi.h包含了ETSI內(nèi)部函數(shù),ETSI函數(shù)與小數(shù)值內(nèi)部函數(shù)類似,可以完成16位和32位小數(shù)值算術(shù)運(yùn)算。還包含復(fù)數(shù)小數(shù)運(yùn)算。add() sub()abs_s()shl()shr() mult()mult_r()negate()round() L_add()L_sub()L_abs()L_negate()L_shl()L_shr()L_mult()L_mac() L_msu()saturate()extract_h()extract_l() L_deposit_l()L_deposit_h()div_s()norm_s() norm_l()L_Extract()L_Comp()Mpy_32() Mpy_32_16()使用時需包含:#include<libetsi.h>,且需要將libetsi.dlb庫加入到工程中Highlyrecommended!59C/C++Run-time環(huán)境運(yùn)行時環(huán)境是為了使應(yīng)用程序能夠正常運(yùn)行需要維護(hù)的一套環(huán)境。例如,系統(tǒng)復(fù)位跳轉(zhuǎn)到開始地址后要執(zhí)行的代碼,這些代碼(即C/C++Run-timeheaders,又稱CRT)需要將寄存器的值由未知狀態(tài)設(shè)置為已知狀態(tài),完成用于維護(hù)工作環(huán)境的操作。運(yùn)行時環(huán)境還包括C/C++語言中的函數(shù)調(diào)用約定。在運(yùn)行時環(huán)境中,有一部分是約定好了的,由編譯器自己自動完成;另有一部分是需要編寫代碼實(shí)現(xiàn)的,如重啟時的CRT代碼。ADI提供了默認(rèn)的CRT文件,即安裝目錄下Blackfin\lib\src\libc\crt中的basiccrt.s文件。60C/C++Run-timeLibraryC/C++Run-timeLibrary是實(shí)現(xiàn)運(yùn)行時環(huán)境時可能被代碼使用的函數(shù)、宏定義、類模板的集合。這個庫提供了對語言而講最基本的應(yīng)用:分配內(nèi)存、字符、字符串的轉(zhuǎn)換、數(shù)學(xué)計(jì)算等。頭文件位置:安裝目錄\Blackfin\includes\源代碼位置:安裝目錄\Blackfin\lib\src\libc\函數(shù)名是基于C/C++語言的,如需要在匯編語言里調(diào)用它們,需要使用這些函數(shù)的匯編版本的名稱(一般后綴帶_s,例如write_s.asm)。61C/C++Run-timeLibrary提供的常用庫函數(shù)ccblkfn.h
與Blackfin系列DSP系統(tǒng)功能相關(guān)的函數(shù)。ctype.h
針對字符處理的函數(shù),包括isdigit,islower,toupper等等math.h
數(shù)學(xué)運(yùn)算函數(shù)(乘方、三角函數(shù)、對數(shù)、指數(shù)等)signal.h
標(biāo)準(zhǔn)ANSI中的信號相關(guān)功能的函數(shù),主要用于處理C程序中的外部中斷信號或定時器中斷信號,包括raise(建立和強(qiáng)制使能低優(yōu)先級的中斷)、signal、interruptstdio.h
輸入、輸出操作(會受到中斷干擾,不能在中斷服務(wù)程序中調(diào)用這些函數(shù)),包括:fwrite、fclose、printf等stdlib.h
提供C語言標(biāo)準(zhǔn)中通用的功能,像定點(diǎn)算術(shù)功能(abs、div、rand)、通用字符串至數(shù)字的轉(zhuǎn)換、存儲器內(nèi)存空間管理(malloc、free)之類string.h
處理字符串的函數(shù),例如strcpy、strcmp、memcpy等time.h
與時間相關(guān)的數(shù)據(jù)類型、宏,以及與表達(dá)式相關(guān)的用于時間計(jì)算的信息,如clock、asctime、ctime等62C/C++Run-timeLibrary提供的常用庫函數(shù)float.h
浮點(diǎn)數(shù)據(jù)的處理limits.h
定義Cdatatype的最大、最小值等等iso646.h
布爾運(yùn)算device.h
交互設(shè)備驅(qū)動程序的宏和數(shù)據(jù)結(jié)構(gòu)device_int.h
交互設(shè)備驅(qū)動的列舉和原型errno.h
錯誤處理…63DSPRun-timeLibrary(libdsp)支持很多通用的DSP算法,例如濾波、FFT、矢量和矩陣函數(shù)、數(shù)學(xué)函數(shù)、窗函數(shù)等。這些DSP函數(shù)支持不同的數(shù)據(jù)類型,包括float、double、fract16等。庫文件位置:安裝目錄\Blackfin\lib\頭文件位置:安裝目錄\Blackfin\includes\源代碼位置:安裝目錄\Blackfin\lib\src\libdsp\可根據(jù)需要對源代碼進(jìn)行修改,請將文件復(fù)制到其它地方,重命名后再進(jìn)行修改。調(diào)用庫文件時需要先引用相應(yīng)的頭文件。64Libdsp提供的庫函數(shù)comples.h
基本復(fù)數(shù)運(yùn)算。包含各類復(fù)數(shù)類型(如complex_float、complex_fract16)變量的定義和基本數(shù)學(xué)操作,例如復(fù)數(shù)絕對值、復(fù)數(shù)加減法、復(fù)數(shù)乘除法、獲取復(fù)數(shù)相位、共軛、歸一化等filter.h
濾波和變換濾波包括FIR、IIR、直接I型IIR、抽取/內(nèi)插FIR、復(fù)數(shù)FIR等等變換FFT、獲得FFT旋轉(zhuǎn)因子、IFFT、R4-FFT等卷積卷積操作、二維卷積、3*3矩陣的二維卷積等壓縮/擴(kuò)展的相關(guān)函數(shù)包括A律、u律壓縮/擴(kuò)展math.h
數(shù)學(xué)函數(shù),例如求絕對值、指數(shù)、對數(shù)、冪運(yùn)算、三角運(yùn)算、最大值、最小值、平方根等。matrix.h
矩陣函數(shù),如實(shí)數(shù)/復(fù)數(shù)矩陣加/減/乘一個標(biāo)量、矩陣轉(zhuǎn)置等stats.h
統(tǒng)計(jì)函數(shù)。包括自相關(guān)、互相關(guān)、柱狀圖、均值、方差、過零點(diǎn)等vector.h
向量函數(shù),包含實(shí)數(shù)與復(fù)數(shù)的向量操作,例如點(diǎn)積、向量加/減/乘一個標(biāo)量、向量中的最大、最小元素及各自的索引等。window.h
濾波、譜分析加窗時的窗函數(shù)。包括Gaussian窗、Hamming窗、Kaiser窗、三角窗等。65數(shù)字濾波的實(shí)現(xiàn)濾波及頻譜分析可以采用ADI提供的濾波器庫函數(shù)(DSPrun-timelibrary中的庫函數(shù)),需要包含filter.h(濾波器及變換的頭文件),即#include<filter.h>。濾波器初始化fir_init(state,coefs,delay,NUM_TAPS,1);其中state為初始狀態(tài),coefs為濾波器系數(shù),delay為線性緩沖區(qū)的首地址,NUM_TAPS為濾波器階數(shù),最后一個參數(shù)表示是否內(nèi)插或抽?。╥nterpolation/decimationindex)事實(shí)上,fir_init就是一個宏,即:#definefir_init(state,coeffs,delay,ncoeffs,index)\(state).h=(coeffs);\(state).d=(delay);\(state).p=(delay);\(state).k=(ncoeffs);\(state).l=(index)66對輸入信號進(jìn)行濾波fir_fr16(in,out,VEC_SIZE,&state);其中in為輸入信號緩沖區(qū)的首地址,out為輸出信號緩沖區(qū)的首地址,VEC_SIZE為每次參與濾波的數(shù)據(jù)的長度(緩沖區(qū)的長度),&state表示初始狀態(tài),由fir_init(state,coefs,delay,NUM_TAPS,1);獲得。源代碼可以在:安裝目錄下\Blackfin\lib\src\libdsp\找到fir_fr16.asm67輸入信號產(chǎn)生與引入在進(jìn)行設(shè)計(jì)時輸入的信號可以事先由Matlab編程獲得fid=fopen('signal.dat','w');fprintf(fid,'0x%04x,\n',x1);fclose(fid);使用時在DSP程序中采用fract16in[256]={#include“signal.dat”};也可以在DSP程序中編程得到信號#include<math.h>#include<math_const.h>*out=(fract16)(0.5*sin(2*PI*f*step)*32768.0);加噪聲#include<stdlib.h>*out+=(fract16)((rand()-0x20000000)>>15;68設(shè)備驅(qū)動庫函數(shù)drivers\adi_dev.hdrivers\adi_uart.hservices\services.h69采用設(shè)備驅(qū)動這種方式,使應(yīng)用程序不用考慮控制硬件設(shè)備的細(xì)節(jié),對應(yīng)用程序而言,設(shè)備的控制與正常的調(diào)用函數(shù)沒有什么不同。設(shè)備驅(qū)動程序位于系統(tǒng)服務(wù)程序的上方,設(shè)備驅(qū)動程序?qū)⒄{(diào)用系統(tǒng)服務(wù)程序,如中斷。設(shè)備驅(qū)動庫是ADI提供的部分器件的設(shè)備驅(qū)動程序集合。如果在系統(tǒng)中使用的是設(shè)備驅(qū)動庫中的設(shè)備,則對BlackfinDSP來說直接調(diào)用設(shè)備驅(qū)動庫中相應(yīng)的文件和函數(shù)即可;如果使用的設(shè)備不在設(shè)備驅(qū)動庫中,也可以參照ADI的同類型器件的設(shè)備驅(qū)動程序來編寫所用設(shè)備的驅(qū)動程序。使用時需要包含:#include<services\services.h>//系統(tǒng)服務(wù)程序#include<drivers\adi_dev.h>//設(shè)備管理器#include<drivers\adi_uart.h>//UART驅(qū)動程序70
#include<services\services.h>//系統(tǒng)服務(wù)程序包括了所有的系統(tǒng)服務(wù)程序,如DMA、中斷、接口控制等服務(wù)程序#include<drivers\adi_dev.h>//設(shè)備管理器包括了所有關(guān)于設(shè)備驅(qū)動程序的一般信息,如API、返回碼、事件代碼即所有的設(shè)備驅(qū)動程序一般信息#include<drivers\adi_xxx.h>//xxx設(shè)備的驅(qū)動程序特定的設(shè)備的驅(qū)動程序的包含文件,應(yīng)當(dāng)包含設(shè)備驅(qū)動程序本身。相關(guān)文件所在位置如下:頭文件在安裝目錄下Blackfin\include\drivers或services文件夾中各個驅(qū)動程序的源代碼在安裝目錄下Blackfin\lib\src\drivers或services文件夾中庫文件在安裝目錄下Blackfin\lib文件夾中71設(shè)備管理adi_dev.hadi_dev_Open()–Opensadeviceforuseadi_dev_Close()–Closesdownadeviceadi_dev_Read()–Providesadevicewithbuffersforinbounddataadi_dev_Write()–Providesadevicewithbuffersforoutbounddataadi_dev_Control()–Sets/detectscontrolandstatusparametersforadevice72系統(tǒng)服務(wù):SystemInterruptControllerFunctions
adi_int_SICEnable–EnablesperipheralinterruptstobepassedtotheCECadi_int_SICDisable–DisablesperipheralinterruptsfrombeingpassedtotheCECadi_int_SICSetIVG–SetstheIVGleveltowhichaperipheralinterruptismappedadi_int_SICGetIVG–DetectstheIVGleveltowhichaperipheralinterruptismappedadi_int_SICWakeup–Establisheswhetherornotaperipheralinterruptwakesuptheprocessorfromanidledstateadi_int_SICInterruptAsserted()–Detectswhetherornotaperipheralinterruptisasserted.73C與匯編混合編程用C語言編程結(jié)構(gòu)化程度高,易于編寫,但執(zhí)行速度相對較慢;與之相反,匯編程序速度
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度知識產(chǎn)權(quán)代理服務(wù)合同樣本8篇
- 二零二五版毛竹砍伐與林業(yè)碳排放權(quán)交易合同3篇
- 二零二五年度出納風(fēng)險(xiǎn)控制擔(dān)保及咨詢合同4篇
- 2025餐飲業(yè)環(huán)保節(jié)能技術(shù)應(yīng)用合作協(xié)議2篇
- 二零二五年度土地承包經(jīng)營權(quán)流轉(zhuǎn)與抵押貸款合同
- 二零二五年度人力資源外包與員工信息安全保護(hù)合同2篇
- 二零二五版股權(quán)代持與投資風(fēng)險(xiǎn)控制協(xié)議3篇
- 二零二五年新能源開發(fā)違約責(zé)任承擔(dān)詳細(xì)合同3篇
- 二零二五版某辦公樓水電暖系統(tǒng)設(shè)計(jì)與施工合同
- 二手住宅分期購銷協(xié)議示例2024年版版B版
- 二零二五年度無人駕駛車輛測試合同免責(zé)協(xié)議書
- 2025年湖北華中科技大學(xué)招聘實(shí)驗(yàn)技術(shù)人員52名歷年高頻重點(diǎn)提升(共500題)附帶答案詳解
- 高三日語一輪復(fù)習(xí)助詞「と」的用法課件
- 毛渣采購合同范例
- 2023中華護(hù)理學(xué)會團(tuán)體標(biāo)準(zhǔn)-注射相關(guān)感染預(yù)防與控制
- 五年級上冊小數(shù)遞等式計(jì)算200道及答案
- 2024年廣東高考政治真題考點(diǎn)分布匯 總- 高考政治一輪復(fù)習(xí)
- 燃?xì)夤艿滥甓葯z驗(yàn)報(bào)告
- GB/T 44052-2024液壓傳動過濾器性能特性的標(biāo)識
- 國際市場營銷環(huán)境案例分析
- 滑雪指導(dǎo)員理論考試復(fù)習(xí)題庫(含答案)
評論
0/150
提交評論