第6章 DSP-C語言程序設(shè)計課件_第1頁
第6章 DSP-C語言程序設(shè)計課件_第2頁
第6章 DSP-C語言程序設(shè)計課件_第3頁
第6章 DSP-C語言程序設(shè)計課件_第4頁
第6章 DSP-C語言程序設(shè)計課件_第5頁
已閱讀5頁,還剩75頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第6章C/C++語言程序設(shè)計6.1C55XC/C++語言概述6.2C55XC/C++語言編程基礎(chǔ)6.5C語言與匯編語言的混合編程6.5.1在C語言中直接嵌入?yún)R編語言6.5.2C語言調(diào)用匯編模塊的接口補充:TIDSP軟件開發(fā)平臺匯編語言依賴于計算機硬件,程序的可讀性和可移植性比較差。一般高級語言具有很好的可移植性,但是難以實現(xiàn)匯編語言的某些功能(如對內(nèi)存地址的操作、位操作等)。C/C++語言作為一種高級語言,既可以訪問物理地址又可以進行位操作,能直接對硬件進行操作,適合用作DSP開發(fā)語言。6.1.1C/C++語言概況6.1C55XC/C++語言概述6.1.2C55xC/C++語言概況C55xC/C++編譯器全面支持ANSIC/C++語言標準,能夠把按照標準ANSIC/C++規(guī)范編寫的源程序進行全面優(yōu)化,編譯成C55x匯編語言源程序。C55xC/C++編譯器工具擁有完整的實時運行庫,所有的庫函數(shù)均符合ANSI庫標準。6.2.1C語言中的數(shù)據(jù)類型

C55x支持下列數(shù)據(jù)類型包括字符、定點數(shù)、浮點數(shù)、指針等。6.2C55XC/C++語言編程基礎(chǔ)類型長度內(nèi)容最小值最大值signedchar(有符號字符)16位ASCII碼-3276832767unsignedchar(無符號字符)16位ASCII碼065535short,signedshort(短整型)16位二進制補碼-3276832767unsignedshort(無符號短整型)16位二進制數(shù)065535類型長度內(nèi)容最小值最大值int,signedint(整型)16位二進制補碼3276832767unsignedint(無符號整型)16位二進制數(shù)065535long,signedlong(長整型)32位二進制補碼21474836482147483647unsignedlong(無符號長整型)32位二進制數(shù)04249967295longlong(40位長整型)40位二進制補碼549755813888549755813887unsignedlonglong(40位無符號長整型)40位二進制數(shù)01099511627775emum(枚舉型)16位二進制補碼3276832767float(浮點型)32位32位浮點數(shù)1.175494e383.40282346e+38類型長度內(nèi)容最小值最大值double(雙精度浮點數(shù))32位32位浮點數(shù)1.175494e383.40282346e+38longdouble(長雙精度浮點數(shù))32位32位浮點數(shù)1.175494e383.40282346e+38大存儲器模式23位二進制數(shù)00x7FFFFFpointers(程序指針)24位二進制數(shù)00xFFFFFF6.2.1C語言中的數(shù)據(jù)類型

6.2.2關(guān)鍵字constC55xC編譯器支持標準C語言的const關(guān)鍵字。將這個關(guān)鍵字使用到對任意變量或數(shù)組的定義上可以確保它們的值不改變。如果定義一個對象為const,那么const段就會為該對象分配存儲空間。使用const關(guān)鍵字可以定義大常數(shù)表并將它們分配到系統(tǒng)ROM中。6.2C55XC/C++語言編程基礎(chǔ)例:6.2.2關(guān)鍵字int*constp=&x;constint*q=&x;定義指向變量int的常量指針p定義指向常量int的變量指針q2.ioport關(guān)鍵字

1.ioport關(guān)鍵字可以用在數(shù)組、結(jié)構(gòu)、聯(lián)合以及枚舉類型當中。

2.當用在數(shù)組中時,ioport限制的數(shù)組單元而非數(shù)組類型本身;3.

ioport類型只能用來聲明全局或靜態(tài)變量,如果在本地變量中使用ioport類型,則變量必須用指針聲明。6.2.2關(guān)鍵字

注意:例,ioport關(guān)鍵字的使用。ioportintk voidfoo(void){

ioportinti

ioportint*j }6.2.2關(guān)鍵字

;/*正確*/;/*錯誤*/;/*正確*/例:定時器初始化例程voidTIMER_init(void){

ioportunsignedint*tim0;

ioportunsignedint*prd0;

ioportunsignedint*tcr0;

ioportunsignedint*prsc0; tim0=(unsignedint*)0x1000; prd0=(unsignedint*)0x1001; tcr0=(unsignedint*)0x1002; prsc0=(unsignedint*)0x1003;*tcr0=0x04f0;*tim0=0;*prd0=0x0ffff;*prsc0=2;*tcr0=0x00e0;}3.interrupt關(guān)鍵字關(guān)鍵字“interrupt”----定義中斷函數(shù)注意:

1.當C/C++代碼被中斷時,中斷程序必須保存所有與程序有關(guān)的寄存器。

2.當使用“interrupt”關(guān)鍵字定義函數(shù)時,中斷函數(shù)必須返回空并且沒有參數(shù)傳遞。3.中斷函數(shù)可以定義本地變量并且使用堆棧。

4.c_int00是C/C++程序的入口點,這個函數(shù)名被系統(tǒng)復(fù)位中斷保留,該中斷服務(wù)程序用來初始化系統(tǒng)并調(diào)用main函數(shù)。

關(guān)于中斷的幾個要點:④中斷服務(wù)程序不能被普通C代碼調(diào)用。②關(guān)鍵字例:中斷服務(wù)程序VoidINTR_init(void){ IVPD=0xd0; IVPH=0xd0; IER0=0x10; DBIER0=0x10; IFR0=0xffff; asm("BCLRINTM");}interruptvoidtimer(){...}③無參數(shù)①設(shè)置中斷寄存器IER0⑤保存中斷入口的現(xiàn)場信息(所用寄存器或全部寄存器)⑧通過.sect指令創(chuàng)建中斷向量表。

.sect".vectors"

.ref_c_int00.ref_timerrsv:B_c_int00

NOP.align8nmi:.loop8 nop .endloopint0: .loop8 nop .endloopint2: B_timer nop .align8tint: B_timer nop .align8…⑥在匯編語言中,中斷程序名前加下劃線,如_timer。關(guān)于中斷的幾個要點:⑦中斷處理程序可以處理單個中斷或多個中斷,c_int00除外⑨保存中斷入口的現(xiàn)場信息(所用寄存器或全部寄存器)onchip關(guān)鍵字---定義的指針所指向的數(shù)據(jù)在片上內(nèi)存例:用onchip定義數(shù)組和指針

onchipintx[100]; /*arraydeclaration*/

onchipint*p; /*pointerdeclaration*/

4onchip關(guān)鍵字6.2.2關(guān)鍵字volatile----存儲器訪問定義格式:

register變量類型變量名變量類型:整型、浮點型和指針類型register6.2.4asm指令----插入一條匯編指令指令格式:

asm(“assemblertext”);main(){ inti; unsignedintuWork;

while(1) { for(i=0;i<256;i++) { ADCCTL=0x8000; asm("nop"); } }}例:6.2.5pragma指令#defineNX64#defineNH64#pragma

DATA_SECTION(db,".dbuffer")DATAdb[NH+2];#pragmaDATA_SECTION(x,".dbuffer")#pragma

DATA_SECTION(r,".dbuffer")DATAx[NX],r[NX];例:Pragma指令告訴編譯器的預(yù)處理器如何處理函數(shù)。必須在函數(shù)體外確定pragma,且必須出現(xiàn)在任何聲明、定義或?qū)瘮?shù)和符號引用之前。否則,編譯器會輸出警告。

C55xC編譯器支持如下pragma指令:CODE_SECTIONC54X_CALLC54X_FAR_CALLDATA_ALIGNDATA_SECTIONFUNC_CANNOT_INLINEFUNC_EXT_CALLEDFUNC_IS_PUREFUNC_IS_SYSTEMFUNC_NEVER_RETURNSFUNC_NO_GLOBAL_ASGFUNC_NO_IND_ASGMUST_ITERATEUNROLL

CODE_SECTION指令及其用法語法:#pragma

CODE_SECTION(func_name,”section_name”)作用:把C函數(shù)func_name的代碼配置到由section_name定義的程序段中語法:

#pragma

DATA_SECTION(var_name,”section_name”)作用:var_name是包含在C函數(shù)內(nèi)的變量名稱,該指令將數(shù)據(jù)var_name配置到由section_name定義的數(shù)據(jù)段中

DATA_SECTION指令及其用法例:#pragma

CODE_SECTION(funcA,“codeA”)

intfuncA(inta){

inti;return(i=a);}編譯后的結(jié)果如下:

.sect“codeA”

.global_funcA

;*******************************************;*FUNCTIONNAME:_funcA*;********************************************

_funcA:return;返回例:

#pragmaDATA_SECTION(bufferB,“my_sect”)charbufferA[512];charbufferB[512];編譯后的結(jié)果如下:.global_bufferA.bss_bufferA,512.global_bufferB

_bufferB:.usect“my_sect”,5126.2.7存儲器模式與分配編譯器支持兩種存儲器模型:小存儲模式大存儲器模式鏈接器不允許同時存在大存儲器模式和小存儲器模式。下列段必須在長度為64K字的同一個段內(nèi):

.bss段和.data段(存放靜態(tài)和全局變量)

.stack和.sysstack段(系統(tǒng)堆棧)

.system段(動態(tài)存儲空間)

.const段

長度和位置都不受限制的段:.text(代碼段),.switch(狀態(tài)轉(zhuǎn)化段).cinit/.pinit(變量初始化段);1.小存儲器模式(默認模式)大存儲器模式下可以更加方便地存放數(shù)據(jù),而不必過多地考慮數(shù)據(jù)頁的限制。

在該模式下,數(shù)據(jù)指針為23位,而堆棧和系統(tǒng)堆棧必須放在同一頁中;

代碼段可以跨越頁邊界以外;除代碼段外的其他所有的段只能放在一頁存儲器之中,但不同的段可以放在不同的頁內(nèi)。

2.大存儲器模式

3.存儲器分配1.C編譯器生成的段C編譯器生成的段:初始化段和未初始化段初始化段有:.cinit段,包含初始化數(shù)據(jù)表格和常數(shù).pinit段,包含實時運行時調(diào)用的數(shù)據(jù)表格.const段,包含用const定義(不能同時被volatile定義)的字符串常量和數(shù)據(jù).switch段,包含switch語句所用表.text段,包含所有可執(zhí)行代碼¤匯編器生成了.data段,但C編譯器并不使用這個段。未初始化段:.bss段,為全局和靜態(tài)變量保留了空間。.stack段,為C系統(tǒng)堆棧分配存儲地址。這個存儲地址用來傳遞變量和局部存儲.sysstack段,為第二系統(tǒng)堆棧分配存儲地址.sysmem段,為動態(tài)存儲分配保留空間。這個空間被malloc、calloc和realloc函數(shù)調(diào)用。.cio段,支持CI/O。這個空間用來作為標簽為_CIOBUF_緩沖區(qū)。.cio段必須放在鏈接器命令文件中才能使用CI/O。3.存儲器分配初始化段功能存儲器類型未初始化段功能存儲器類型.text可執(zhí)行代碼ROM/RAM.bss為全局和靜態(tài)變量保留空間RAM.cinit初始化數(shù)據(jù)表和常數(shù)ROM/RAM.stack為C系統(tǒng)堆棧分配存儲地址RAM.const用const定義的常量ROM/RAM.sysstack為第二系統(tǒng)堆棧分配存儲地址RAM.switchswitch語句所用表ROM/RAM.sysmem為動態(tài)存儲分配保留空間RAM.dataC編譯器并不使用ROM/RAM.cio支持CI/ORAM.pinit實時運行時調(diào)用的數(shù)據(jù)表格ROM/RAM6.2.11.系統(tǒng)初始化_c_int00

_c_int00函數(shù)執(zhí)行如下工作來初始化C環(huán)境:①建立堆棧和第二系統(tǒng)堆棧②從.cinit段中復(fù)制數(shù)據(jù)到.bss段來初始化全局變量③調(diào)用main函數(shù)開始執(zhí)行C程序。七、系統(tǒng)初始化.cinit段中的全局和靜態(tài)變量的數(shù)據(jù)。在標準ANSIC語言中,沒有顯式初始化的全局和靜態(tài)變量必須在程序執(zhí)行前設(shè)置為0。1.變量的自動初始化2.全局構(gòu)建器(GlobalConstructors)鏈接器則將各輸入文件中的.pinit段鏈接成一個單一的.pinit段,啟動程序?qū)⑹褂眠@個表來運行這些構(gòu)建器。3.初始化表(InitializationTables).cinit段中的表中包含可變大小的初始化記錄。每個必須被自動初始化的變量在.cinit段中都有一條記錄。4.運行時間變量初始化在運行時間自動初始化是自動初始化的默認模式。為使用這種模式,可采用鏈接器的-c選項。采用這種方法,.cinit段隨著所有其它初始化段被裝載到存儲器(通常為ROM)中,全局變量在運行時間被初始化。鏈接器定義了一個叫做cinit的特殊符號,用以指向存儲器中初始化表的起始地址。當程序開始運行時,C啟動程序從cinit指向的表中復(fù)制數(shù)據(jù)到.bss段中的特定變量中。這使得初始化數(shù)據(jù)能被存儲到ROM中,并在每次程序開始執(zhí)行時復(fù)制到RAM中。圖6-3運行時間變量自動初始化過程¤這種方法適用于應(yīng)用程序燒入在ROM中的系統(tǒng)。5.裝載時間變量初始化在裝載時間自動初始化變量會減少啟動時間并節(jié)省被初始化表使用的存儲器,從而改善了系統(tǒng)性能。用-cr鏈接器選項可以選擇這種模式。當使用-cr選項時,鏈接器置位在.cinit段頭的STYP_COPY位,這樣裝載器就不會把.cinit段裝載到存儲器中(.cinit段不占用存儲器空間)。鏈接器置cinit符號為–1(通常cinit指向初始化表的起始地址),告訴啟動程序存儲器中沒有初始化表,因此在啟動時不進行初始化。為在裝載時間內(nèi)實現(xiàn)自動初始化,裝載器必須能夠執(zhí)行如下工作:檢查目標文件中.cinit段是否存在保證STYP_COPY在.cinit段頭中被置位,這樣就不會復(fù)制.cinit段到存儲器中去理解初始化表格式圖6-4裝載時間變量自動初始化過程6.5C55xC和匯編語言混合編程6.5.1概述6.5.2C/C++中的寄存器規(guī)則6.5.3函數(shù)結(jié)構(gòu)和調(diào)用規(guī)則6.5.4C和匯編語言的接口6.5.2.寄存器規(guī)則寄存器保存者用途AC0,AC1,AC2,AC3父函數(shù)16,32或40位數(shù)據(jù),或24位代碼指針(X)AR0~(X)AR4父函數(shù)16或23位指針,或16位數(shù)據(jù)(X)AR5~(X)AR7子函數(shù)16位數(shù)據(jù)T0,T1父函數(shù)T2,T3子函數(shù)ST0,ST1,ST2父函數(shù)ST3父函數(shù)RPTC父函數(shù)CSR父函數(shù)寄存器保存者用途BRC0、BRC1父函數(shù)BRS1父函數(shù)BSA0、REA1父函數(shù)SPSSPPCRETA子函數(shù)CFCT子函數(shù)6.5.2.寄存器規(guī)則

狀態(tài)寄存器作為標志DSP運行狀態(tài)的寄存器在運行中起著重要的作用,表4-3介紹了各狀態(tài)寄存器各字段的作用、默認值以及是否可以修改。ST0-55字段名稱默認值編譯器是否修改ACOV[0~3]溢出標志是CARRY進位標志是TC[1~2]檢驗、控制標志是DP[7~15]數(shù)據(jù)頁寄存器否6.5.2.寄存器規(guī)則6.5.2.寄存器規(guī)則ST1-55字段名稱默認值編譯器是否修改BRAF快重復(fù)標志否CPL編譯標志1否XF外部標志否HM保持標志否INTM中斷標志否M40運算模式0當為40位運算時可修改SATD報和標志0是SXMD符號擴展模式1否C16雙16位運算模式0否FRCT小數(shù)模式0是54CMC54x兼容模式0在調(diào)用C54x子函數(shù)可修改ASM累加器移位模式否6.5.2.寄存器規(guī)則ST2-55字段名稱默認值編譯器是否修改ARMS輔助寄存器間接尋址模式1否DBGM調(diào)試模式

否EALLOW仿真訪問使能否RDM舍入模式0否CDPLCCDP指針線性/循環(huán)狀態(tài)0否AR[0~7]LCAR[0~7]線性/循環(huán)狀態(tài)0否6.5.2.寄存器規(guī)則ST3-55字段名稱默認值編譯器是否修改CAFRZ緩沖凍結(jié)否CAEN緩沖使能

否CACLR緩沖清零否HINT主機中斷否CBERR總線錯誤標志否MPNMC微處理器/微機模式

否SATA飽和模式(A單元)0是CLKOFFCLKOUT關(guān)閉

否SMUL乘法飽和模式0是SST存儲飽和模式

否6.5.3函數(shù)結(jié)構(gòu)和調(diào)用規(guī)則1.函數(shù)調(diào)用規(guī)則(1)將所要傳遞到子函數(shù)的參數(shù)放入寄存器或堆棧。如果一個函數(shù)的變量用一個省略號聲明(標志參數(shù)的數(shù)量是變化的),則剩余的參數(shù)跟著最后一個被聲明的參數(shù)被傳到堆棧,而堆棧的地址將作為訪問其他未聲明參數(shù)的索引。1.函數(shù)調(diào)用規(guī)則編譯器對參量分類,有3類:數(shù)據(jù)指針(int*,long*等)16位數(shù)據(jù)(char,short,int)32位數(shù)據(jù)(long,float,double,函數(shù)指針)(1)將所要傳遞到子函數(shù)的參數(shù)放入寄存器或堆棧。參數(shù)類型寄存器分配順序?qū)?yīng)的數(shù)據(jù)類型16或23位數(shù)據(jù)指針(X)AR0,(X)AR1,(X)AR2,(X)AR3,(X)AR4數(shù)組,字符串,指針或占用空間超過2字節(jié)長的結(jié)構(gòu)體16位數(shù)據(jù)T0,T1,AR0,AR1,AR2,AR3,AR4(無符號)字符,短整數(shù),整數(shù)32位數(shù)據(jù)AC0,AC1,AC2長整數(shù),浮點數(shù)和長度不大于2個字節(jié)的結(jié)構(gòu)體

如果參數(shù)的數(shù)量超過可使用寄存器數(shù)量,多余的參數(shù)會被壓入堆棧,子函數(shù)通過堆棧得到剩余參數(shù)。

1.函數(shù)調(diào)用規(guī)則(1)將所要傳遞到子函數(shù)的參數(shù)放入寄存器或堆棧。(2)子函數(shù)保存所有的入口保存寄存器

(T2、T3、AR5~AR7)。

父函數(shù)必須通過壓入堆棧來保存其它在調(diào)用后會用到寄存器的值。(3)父函數(shù)對子函數(shù)進行調(diào)用。短數(shù)據(jù)T0長數(shù)據(jù)AC0數(shù)據(jù)指針(X)AR0結(jié)構(gòu)體父函數(shù)在本地堆棧中分配相應(yīng)大小的空間。父函數(shù)將該空間地址作為第一個隱含參量傳送給子函數(shù),這個參數(shù)被看成一個數(shù)據(jù)指針。(4)父函數(shù)收集返回值。1.函數(shù)調(diào)用規(guī)則例,寄存器參量傳遞規(guī)則structbig{longx[10];};structsmall{intx;};T0T0AC0AR0intfn(inti1,longl2,int*p3);AC0AR0T0T1AR1longfn(int*p1,inti2,inti3,inti4);

AR0AR1structbigfn(int*p1);

T0AR0AR1intfn(structbigb,int*p1);

AC0AR0structsmallfn(int*p1);T0AC0AR0intfn(structsmallb,int*p1);T0printf(char*fmt,...);

AC0AC1AC2stackT0voidfn(longl1,longl2,longl3,longl4,inti5);

AC0AC1AC2AR0AR1voidfn(longl1,longl2,longl3,int*p4,int*p5,

AR2AR3AR4T0T1int*p6,int*p7,int*p8,inti9,inti10);子函數(shù)執(zhí)行代碼保護入口寄存器(T2,T3,AR5-AR7)為局部變量等分配存儲空間收集返回值函數(shù)參數(shù)傳遞恢復(fù)保護的寄存器(T2,T3,AR5-AR7)釋放堆棧函數(shù)返回2.被調(diào)用函數(shù)(子函數(shù))的響應(yīng)6.5.4C和匯編語言的接口C代碼和匯編語言代碼混合使用方法:在C源代碼中直接嵌入?yún)R編語言。在C源代碼中使用匯編語言函數(shù)、變量和常數(shù)。使用幾個獨立的匯編代碼模塊,并將它們與編譯了的C模塊進行鏈接.1.嵌入?yún)R編語言注意:千萬注意不要破壞C語言操作環(huán)境。不要從內(nèi)嵌asm匯編語句調(diào)轉(zhuǎn)到C語言模塊中。不要在內(nèi)嵌asm匯編語句中改變C語言模塊中變量的值,但可以安全地讀取它們的值。不要使用內(nèi)嵌asm匯編語句插入?yún)R編器指令來改變匯編環(huán)境。指令格式:

asm(“assemblertext”);例:asm(“BCLRINTM”)2.在C代碼中訪問匯編語言函數(shù)(a)C程序:

externintasmfunc(int,int*);/*聲明匯編函數(shù)*/

intgvar;/*定義全局變量*/

main()

{

inti;

i=asmfunc(i,&gvar);/*調(diào)用函數(shù)*/

}(b)匯編程序:

.global_asmfunc_asmfunc:

ADD*AR0,T0,T0;T0+gvar=>i,i=T0

RET;在定義匯編函數(shù)時,在函數(shù)名前加下劃線“_”.聲明為外部函數(shù)3:在C代碼中訪問匯編語言變量①訪問.bss段或.usect段中沒有初始化的變量:使用.bss或.usect指令來定義變量使用.global指令來定義為外部變量在匯編語言中的變量前加下劃線“_”在C代碼中聲明變量為外部變量并正常地訪問它(b)C程序:externintvar ; /*外部變量*/var=1; /*使用變量*/(a)匯編語言程序:

.bss

var,1 ;定義變量

.gloabal

var ;聲明變量為外部變量②非.bss段中變量訪問-定義指向該變量的指針定義變量聲明一個指向該變量起始地址的全局指針在C程序中,必須先聲明該對象為extern型。3:在C代碼中訪問匯編語言變量(a)匯編程序:.global_sine.sect”sine_tab”_sine: .float0.0.float0.015987.float0.022145(b)C程序:externfloatsine[];float*sine_p=sine;f=sine_p[2]; 4.在C語言中訪問匯編語言常數(shù)使用.set和.global指令定義匯編語言全局常數(shù)。使用&運算符來取值。(a)匯編語言程序:_table_size.set10000 ;定義常量.global

_table_size ;定義該常量為全局常量例:(b)C語言程序:externinttable_size;#defineTABLE_SIZE((int)(&table_size))……For(i=0;i<TABLE_SIZE;++i)C和匯編語言的接口注意:(1)如果用匯編語言編寫中斷例程,則需要保存在中斷例程中使用的所有寄存器。(2)如果在匯編程序中調(diào)用C/C++函數(shù),則只有特定的寄存器在C/C++中被保存,而其他寄存器則可能被C/C++函數(shù)改變。(3)編譯器所默認的CPL值為1,即采用間接、絕對方式尋址,如果在匯編函數(shù)中CPL被設(shè)置為0,在函數(shù)返回時應(yīng)當把這個值改為1。例:利于混合編程的方式實現(xiàn)y=a+b,主程序用C實現(xiàn),子函數(shù)asmf采用匯編語言,已知a,b,y均為整數(shù)。主程序:Main(){}inta,intb;inty;a=3;b=5;y=asmf(a,b);externintasmf(inta,intb);匯編源程序:.global_asmf.text_asmf:addT1,T0,T0RET習題:利于混合編程的方式實現(xiàn)已知主程序如下,請將匯編源程序補充完整。Main(){}inta[nb]={2,3,4,5};intx[nb]={1,2,3,4};inty;y=asmf(&a,&x,nb);externlongasmf(int*,int*,int);主程序:匯編源程序:.global_asmf.text_asmf:….…..RET#definenb5;P249作業(yè)3,4,5,6,7,9,10小結(jié):軟件開發(fā)過程第一步,分析任務(wù)需求并用高級語言寫出軟件流程。寫流程可以采用編寫“偽代碼”的方式完成??梢郧宄囟x信號的處理機制,并為今后程序的調(diào)試和擴展預(yù)先留好接口。在流程描述中,可以將每一個關(guān)鍵的處理環(huán)節(jié)用函數(shù)(或直接用語言描述)來表示,確定軟件的框架。第二步,根據(jù)第一步的工作寫主流程的C或者匯編程序。整個工作過程可以充分參照例子工程做。第三步,細化主流程程序,按功能編寫每一個函數(shù)。第四步,完成中斷服務(wù)程序的編寫。第五步,編寫鏈接用cmd命令文件,確定匯編程序中各段代碼和數(shù)據(jù)擺放的位置。通常情況下,程序放置在SARAM內(nèi),而數(shù)據(jù)放置在DARAM。注意程序的編制需強調(diào)程序的模塊化、常量的符號化、變量名有意義等軟件工程的基本要素。在匯編級編程的時候,需要做匯編語句級的優(yōu)化。小結(jié):軟件開發(fā)過程軟件組成:由代碼和數(shù)據(jù)組成運行:要運行的程序其代碼和數(shù)據(jù)必須存放在CPU的存儲空間存放:以代碼塊和數(shù)據(jù)塊的形式存放–代碼塊和數(shù)據(jù)塊是程序的最小單元–一個代碼塊或數(shù)據(jù)塊在存儲空間中連續(xù)、順序存放–不同的代碼塊或數(shù)據(jù)塊,可以存放于不同的存儲空間中定位:–編譯時定位:MCU系統(tǒng)采用編程時由ORG語句確定代碼塊和數(shù)據(jù)塊的絕對地址編譯器以此地址為首地址,連續(xù)、順序地存放該代碼塊或數(shù)據(jù)塊–鏈接時定位:DSP系統(tǒng)采用編程時由“SECTION”偽指令,以區(qū)分不同的代碼塊或數(shù)據(jù)塊編譯器每遇到一個“SECTION”偽指令,從0地址重新開始一個代碼塊或數(shù)據(jù)塊鏈接器將同名的“SECTION”合并,并按.cmd文件中的“SECTION”命令進行實際的定位–加載時定位:PC機系統(tǒng)采用編程、編譯和鏈接時均未對程序進行絕對定位程序運行前,由操作系統(tǒng)對程序進行重定位,并加載到存儲空間中DSPC語言:C運行環(huán)境(1)存儲模型:C程序的代碼和數(shù)據(jù)如何定位系統(tǒng)定義–.cinit存放C程序中的變量初值和常量–.const存放C程序中的字符常量、浮點常量和用const聲明的常量–.switch存放C程序中switch語句的跳針表–.text存放C程序的代碼–.bss為C程序中的全局和靜態(tài)變量保留存儲空間–.far為C程序中用far聲明的全局和靜態(tài)變量保留空間–.stack為C程序系統(tǒng)堆棧保留存儲空間,用于保存返回地址、函數(shù)間的參數(shù)傳遞、存儲局部變量和保存中間結(jié)果–.sysmem用于C程序中malloc、calloc和realloc函數(shù)動態(tài)分配存儲空間用戶定義–#pragmaCODE_SECTION(symbol,"sectionname")–#pragmaDATA_SECTION(symbol,"sectionname")DSPC語言:C運行環(huán)境(2)寄存器使用規(guī)則–C編譯器如何使用DSP的寄存器–函數(shù)進入和返回前,寄存器的保護函數(shù)調(diào)用規(guī)則–函數(shù)間的參數(shù)傳遞通過寄存器和系統(tǒng)堆棧進行–調(diào)用函數(shù)與被調(diào)用函數(shù)必須對各自的寄存器進行保護–從被調(diào)用函數(shù)返回前,被調(diào)用函數(shù)必須歸還所有已占用的堆??臻gC和ASM混合編程–C和ASM混合編程時,必須遵循寄存器使用規(guī)則和函數(shù)調(diào)用規(guī)則–被C調(diào)用的ASM函數(shù),其函數(shù)名前應(yīng)加“_”中斷服務(wù)程序–ASM編寫的中斷服務(wù)程序必須對所有用到寄存器進行保護,以免破壞C運行環(huán)境–C編寫的中斷服務(wù)程序應(yīng)用interrupt關(guān)鍵字聲明DSPC語言:C運行環(huán)境(2)系統(tǒng)初試化在運行C程序前,必須建立C運行環(huán)境,此任務(wù)由C引導(dǎo)程序_c_int00完成;c程序在連接的時候需要rst.lib庫。_c_int00包含在庫函數(shù)中,build時自動將其鏈接進可執(zhí)行程序中,程序的入口地址必須設(shè)為_c_int00起始地址。_c_int00的源程序存放在由rts.src分離出來的boot.asm中,用戶可根據(jù)需要修改–設(shè)置堆棧指針,–初始化全局變量:將.cinit”段“中數(shù)據(jù)拷貝到.bss”段“中–調(diào)用C程序的主函數(shù)main()不同系列的DSP,其C編譯器對C運行環(huán)境的處理略有不同,具體參考各自的《OptimizingCCompilerUser’sGuide》DSPC語言:軟件build流程目標文件地址是浮動的,能被重定位鏈接器用.cmd文件對鏈接目標,進行重定位–列出目標文件、庫文件和鏈接器選項–用MEMORY命令描述目標系統(tǒng)存儲空間配置–用SECTIONS命令描述“段”如何定位Hex轉(zhuǎn)換程序也使用.cmd文件,配置轉(zhuǎn)換選項CCS軟件開發(fā)方法傳統(tǒng)軟件開發(fā)方法用ASM或ASM和C混合編程,從零開始分配存儲器空間編寫硬件資源頭文件–DSP片內(nèi)部分:描述片內(nèi)寄存器地址描述片內(nèi)寄存器控制/狀態(tài)位域–DSP板上資源頭文件描述片外外設(shè)寄存器地址描述片外外設(shè)寄存器控制/狀態(tài)位域編寫應(yīng)用專用的外設(shè)驅(qū)動程序–片內(nèi)/片外外設(shè)初試化程序–片內(nèi)/片外外設(shè)操作程序編寫中斷向量表和中斷服務(wù)程序編寫應(yīng)用專用的算法編寫主控程序順序、死循環(huán)執(zhí)行TI倡導(dǎo)的DSP軟件架構(gòu)TI免費提供的基礎(chǔ)軟件CSL庫:ChipSupportLibrary芯片支持庫–定義DSP片內(nèi)外設(shè)資源,實現(xiàn)片內(nèi)外設(shè)基本操作DDK:DriverDevelopmentKit設(shè)備驅(qū)動程序開發(fā)包–設(shè)計標準的設(shè)備驅(qū)動程序模型,方便開發(fā)新的設(shè)備驅(qū)動程序DSPLIB/IMGLIB:SignalProcessingLibrary–數(shù)學運算、矩陣運算、FFT、濾波、卷積、相關(guān)等信號處理函數(shù)–壓縮、分析、濾波和格式轉(zhuǎn)換等圖像/視頻處理函數(shù)DSP/BIOS:嵌入式實時、多任務(wù)操作系統(tǒng)–實時、多任務(wù)內(nèi)核–實時分析ReferenceFrameworks:程序參考架構(gòu)–C程序初試骨架,通過其可以迅速創(chuàng)建特定的應(yīng)用程序XDAIS:DSPAlgorithmStandard,DSP算法標準–規(guī)定一系列算法編程規(guī)則,遵循這些規(guī)則的算法,可以相互調(diào)用DSP/BIOS:功能搶先型實時、多任務(wù)操作系統(tǒng)內(nèi)核–基于優(yōu)先級的、搶先型實時調(diào)度程序–支持多線程管理與調(diào)度–支持4種線程類型:HWI、SWI、TSK、IDL–支持3種作業(yè)間的通信方式:Mailboxes、Semaphores、Queues–支持周期函數(shù),方便實現(xiàn)固定時間間隔的數(shù)據(jù)采集,簡化多速率系統(tǒng)的設(shè)計–提供存儲器管理,實現(xiàn)動態(tài)存儲器分配實時分析模塊–分析信息實時獲取、傳輸和顯示,為早期的系統(tǒng)級排錯提供幫助–DSP/BIOS模塊中內(nèi)含分析信息的實時獲取功能–分析信息的實時傳輸由RTDX(Real-TimeDataExchange)技術(shù)實現(xiàn),完成目標DSP與主機之間的實時通信,C6000RTDX的帶寬為20KByte,RTDX是在idle作業(yè)期間完成,所以對程序執(zhí)行速度的影響最小–主機可以顯示:事件記錄、線程執(zhí)行順序、執(zhí)行次數(shù)的最大值或平均值和總的CPU負載等信息DSP/BIOS:功能為了方便使用,TI提供一個可視化的配置工具,用于配置實際系統(tǒng)中所需的DSP/BIOS模塊;可以在CCS集成環(huán)境中調(diào)用之DSP/BIOS是可裁剪的,只有被應(yīng)用程序使用的模塊才會被鏈接到應(yīng)用程序中DSP/BIOS開銷?。捍a大?。?KWordsCPU占用:1MIPSDSP/BIOS采用標準的API,所以不同系列DSP之間的移植容易DSP/BIOS集成在CCS中,無需使用許可費CSL庫什么是CSL:ChipSupportLibrary–用于配置、控制和管理DSP片上外設(shè)–已為C6000和C5000系列DSP設(shè)計了各自的CSL庫–CSL庫函數(shù)大多數(shù)是用C語言編寫的,并已對代碼的大小和速度進行了優(yōu)化–CSL庫是可裁剪的:即只有被使用的CSL模塊才會包含進應(yīng)用程序中–CSL庫是可擴展的:每個片上外設(shè)的API相互獨立,增加新的API,對其他片上外設(shè)沒有影響為什么要設(shè)計CSL–DSP片上外設(shè)種類及其應(yīng)用日趨復(fù)雜–提供一組標準的方法用于訪問和控制片上外設(shè)–免除用戶編寫配置和控制片上外設(shè)所必需的定義和代碼CSL:特點片上外設(shè)編程的標準協(xié)議:–定義一組標準的APIs:函數(shù)、數(shù)據(jù)類型、宏對硬件進行抽象,提取符號化的片上外設(shè)描述–定義一組宏,用于訪問和建立寄存器及其域值基本的資源管理–對多資源的片上外設(shè)進行管理已集成到DSP/BIOS中–通過圖形用戶接口GUI對CSL進行配置使片上外設(shè)容易使用–縮短開發(fā)時間,增加可移植性CSL:片上外設(shè)DDK(DriverDevelopmentKit)TI提供DDK的目的–標準的設(shè)備驅(qū)動程序模型,用戶無需從零開始編寫設(shè)備驅(qū)動程序設(shè)備驅(qū)動程序模型(IOM)–將設(shè)備驅(qū)動程序分為2個部分與設(shè)備相關(guān)的:“迷你”驅(qū)動程序(mini-driver)與設(shè)備無關(guān)的:“類”驅(qū)動程序(class-driver)–“類”驅(qū)動程序設(shè)備驅(qū)動程序的上層抽象,使其與特定設(shè)備無關(guān),為應(yīng)用程序提供通用的接口3大類“類”驅(qū)動程序:SIO、PIP和GIOSIO:流I/O接口,由SIO和DIO組成,DIO負責緩沖器管理、信號同步以及底層“迷你”驅(qū)動程序接口PIP:管道接口,有PIP和PIO組成,PIO負責緩沖器管理、信號同步以及底層“迷你”驅(qū)動程序接口GIO:通用I/O,允許進行塊讀塊寫,可以用其新的用戶驅(qū)動程序–“迷你”驅(qū)動程序設(shè)備驅(qū)動程序的底層抽象,與特定設(shè)備有關(guān),對設(shè)計硬件設(shè)備進行操作,DDK規(guī)定一組標準的API,函數(shù)體由用戶根據(jù)實際硬件設(shè)備編寫

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論