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

下載本文檔

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

文檔簡(jiǎn)介

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

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

6.2.2關(guān)鍵字constC55xC編譯器支持標(biāo)準(zhǔn)C語(yǔ)言的const關(guān)鍵字。將這個(gè)關(guān)鍵字使用到對(duì)任意變量或數(shù)組的定義上可以確保它們的值不改變。如果定義一個(gè)對(duì)象為const,那么const段就會(huì)為該對(duì)象分配存儲(chǔ)空間。使用const關(guān)鍵字可以定義大常數(shù)表并將它們分配到系統(tǒng)ROM中。6.2C55XC/C++語(yǔ)言編程基礎(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)合以及枚舉類型當(dāng)中。

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

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

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

ioportinti

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

;/*正確*/;/*錯(cuò)誤*/;/*正確*/例:定時(shí)器初始化例程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.當(dāng)C/C++代碼被中斷時(shí),中斷程序必須保存所有與程序有關(guān)的寄存器。

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

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

關(guān)于中斷的幾個(gè)要點(diǎn):④中斷服務(wù)程序不能被普通C代碼調(diào)用。②關(guān)鍵字例:中斷服務(wù)程序VoidINTR_init(void){ IVPD=0xd0; IVPH=0xd0; IER0=0x10; DBIER0=0x10; IFR0=0xffff; asm("BCLRINTM");}interruptvoidtimer(){...}③無(wú)參數(shù)①設(shè)置中斷寄存器IER0⑤保存中斷入口的現(xiàn)場(chǎng)信息(所用寄存器或全部寄存器)⑧通過(guò).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…⑥在匯編語(yǔ)言中,中斷程序名前加下劃線,如_timer。關(guān)于中斷的幾個(gè)要點(diǎn):⑦中斷處理程序可以處理單個(gè)中斷或多個(gè)中斷,c_int00除外⑨保存中斷入口的現(xiàn)場(chǎng)信息(所用寄存器或全部寄存器)onchip關(guān)鍵字---定義的指針?biāo)赶虻臄?shù)據(jù)在片上內(nèi)存例:用onchip定義數(shù)組和指針

onchipintx[100]; /*arraydeclaration*/

onchipint*p; /*pointerdeclaration*/

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

register變量類型變量名變量類型:整型、浮點(diǎn)型和指針類型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ù)和符號(hào)引用之前。否則,編譯器會(huì)輸出警告。

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指令及其用法語(yǔ)法:#pragma

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

#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存儲(chǔ)器模式與分配編譯器支持兩種存儲(chǔ)器模型:小存儲(chǔ)模式大存儲(chǔ)器模式鏈接器不允許同時(shí)存在大存儲(chǔ)器模式和小存儲(chǔ)器模式。下列段必須在長(zhǎng)度為64K字的同一個(gè)段內(nèi):

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

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

.system段(動(dòng)態(tài)存儲(chǔ)空間)

.const段

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

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

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

2.大存儲(chǔ)器模式

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

_c_int00函數(shù)執(zhí)行如下工作來(lái)初始化C環(huán)境:①建立堆棧和第二系統(tǒng)堆棧②從.cinit段中復(fù)制數(shù)據(jù)到.bss段來(lái)初始化全局變量③調(diào)用main函數(shù)開(kāi)始執(zhí)行C程序。七、系統(tǒng)初始化.cinit段中的全局和靜態(tài)變量的數(shù)據(jù)。在標(biāo)準(zhǔn)ANSIC語(yǔ)言中,沒(méi)有顯式初始化的全局和靜態(tài)變量必須在程序執(zhí)行前設(shè)置為0。1.變量的自動(dòng)初始化2.全局構(gòu)建器(GlobalConstructors)鏈接器則將各輸入文件中的.pinit段鏈接成一個(gè)單一的.pinit段,啟動(dòng)程序?qū)⑹褂眠@個(gè)表來(lái)運(yùn)行這些構(gòu)建器。3.初始化表(InitializationTables).cinit段中的表中包含可變大小的初始化記錄。每個(gè)必須被自動(dòng)初始化的變量在.cinit段中都有一條記錄。4.運(yùn)行時(shí)間變量初始化在運(yùn)行時(shí)間自動(dòng)初始化是自動(dòng)初始化的默認(rèn)模式。為使用這種模式,可采用鏈接器的-c選項(xiàng)。采用這種方法,.cinit段隨著所有其它初始化段被裝載到存儲(chǔ)器(通常為ROM)中,全局變量在運(yùn)行時(shí)間被初始化。鏈接器定義了一個(gè)叫做cinit的特殊符號(hào),用以指向存儲(chǔ)器中初始化表的起始地址。當(dāng)程序開(kāi)始運(yùn)行時(shí),C啟動(dòng)程序從cinit指向的表中復(fù)制數(shù)據(jù)到.bss段中的特定變量中。這使得初始化數(shù)據(jù)能被存儲(chǔ)到ROM中,并在每次程序開(kāi)始執(zhí)行時(shí)復(fù)制到RAM中。圖6-3運(yùn)行時(shí)間變量自動(dòng)初始化過(guò)程¤這種方法適用于應(yīng)用程序燒入在ROM中的系統(tǒng)。5.裝載時(shí)間變量初始化在裝載時(shí)間自動(dòng)初始化變量會(huì)減少啟動(dòng)時(shí)間并節(jié)省被初始化表使用的存儲(chǔ)器,從而改善了系統(tǒng)性能。用-cr鏈接器選項(xiàng)可以選擇這種模式。當(dāng)使用-cr選項(xiàng)時(shí),鏈接器置位在.cinit段頭的STYP_COPY位,這樣裝載器就不會(huì)把.cinit段裝載到存儲(chǔ)器中(.cinit段不占用存儲(chǔ)器空間)。鏈接器置cinit符號(hào)為–1(通常cinit指向初始化表的起始地址),告訴啟動(dòng)程序存儲(chǔ)器中沒(méi)有初始化表,因此在啟動(dòng)時(shí)不進(jìn)行初始化。為在裝載時(shí)間內(nèi)實(shí)現(xiàn)自動(dòng)初始化,裝載器必須能夠執(zhí)行如下工作:檢查目標(biāo)文件中.cinit段是否存在保證STYP_COPY在.cinit段頭中被置位,這樣就不會(huì)復(fù)制.cinit段到存儲(chǔ)器中去理解初始化表格式圖6-4裝載時(shí)間變量自動(dòng)初始化過(guò)程6.5C55xC和匯編語(yǔ)言混合編程6.5.1概述6.5.2C/C++中的寄存器規(guī)則6.5.3函數(shù)結(jié)構(gòu)和調(diào)用規(guī)則6.5.4C和匯編語(yǔ)言的接口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)寄存器作為標(biāo)志DSP運(yùn)行狀態(tài)的寄存器在運(yùn)行中起著重要的作用,表4-3介紹了各狀態(tài)寄存器各字段的作用、默認(rèn)值以及是否可以修改。ST0-55字段名稱默認(rèn)值編譯器是否修改ACOV[0~3]溢出標(biāo)志是CARRY進(jìn)位標(biāo)志是TC[1~2]檢驗(yàn)、控制標(biāo)志是DP[7~15]數(shù)據(jù)頁(yè)寄存器否6.5.2.寄存器規(guī)則6.5.2.寄存器規(guī)則ST1-55字段名稱默認(rèn)值編譯器是否修改BRAF快重復(fù)標(biāo)志否CPL編譯標(biāo)志1否XF外部標(biāo)志否HM保持標(biāo)志否INTM中斷標(biāo)志否M40運(yùn)算模式0當(dāng)為40位運(yùn)算時(shí)可修改SATD報(bào)和標(biāo)志0是SXMD符號(hào)擴(kuò)展模式1否C16雙16位運(yùn)算模式0否FRCT小數(shù)模式0是54CMC54x兼容模式0在調(diào)用C54x子函數(shù)可修改ASM累加器移位模式否6.5.2.寄存器規(guī)則ST2-55字段名稱默認(rèn)值編譯器是否修改ARMS輔助寄存器間接尋址模式1否DBGM調(diào)試模式

否EALLOW仿真訪問(wèn)使能否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字段名稱默認(rèn)值編譯器是否修改CAFRZ緩沖凍結(jié)否CAEN緩沖使能

否CACLR緩沖清零否HINT主機(jī)中斷否CBERR總線錯(cuò)誤標(biāo)志否MPNMC微處理器/微機(jī)模式

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

否SMUL乘法飽和模式0是SST存儲(chǔ)飽和模式

否6.5.3函數(shù)結(jié)構(gòu)和調(diào)用規(guī)則1.函數(shù)調(diào)用規(guī)則(1)將所要傳遞到子函數(shù)的參數(shù)放入寄存器或堆棧。如果一個(gè)函數(shù)的變量用一個(gè)省略號(hào)聲明(標(biāo)志參數(shù)的數(shù)量是變化的),則剩余的參數(shù)跟著最后一個(gè)被聲明的參數(shù)被傳到堆棧,而堆棧的地址將作為訪問(wèn)其他未聲明參數(shù)的索引。1.函數(shù)調(diào)用規(guī)則編譯器對(duì)參量分類,有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ù)組,字符串,指針或占用空間超過(guò)2字節(jié)長(zhǎng)的結(jié)構(gòu)體16位數(shù)據(jù)T0,T1,AR0,AR1,AR2,AR3,AR4(無(wú)符號(hào))字符,短整數(shù),整數(shù)32位數(shù)據(jù)AC0,AC1,AC2長(zhǎng)整數(shù),浮點(diǎn)數(shù)和長(zhǎng)度不大于2個(gè)字節(jié)的結(jié)構(gòu)體

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

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

(T2、T3、AR5~AR7)。

父函數(shù)必須通過(guò)壓入堆棧來(lái)保存其它在調(diào)用后會(huì)用到寄存器的值。(3)父函數(shù)對(duì)子函數(shù)進(jìn)行調(diào)用。短數(shù)據(jù)T0長(zhǎng)數(shù)據(jù)AC0數(shù)據(jù)指針(X)AR0結(jié)構(gòu)體父函數(shù)在本地堆棧中分配相應(yīng)大小的空間。父函數(shù)將該空間地址作為第一個(gè)隱含參量傳送給子函數(shù),這個(gè)參數(shù)被看成一個(gè)數(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í)行代碼保護(hù)入口寄存器(T2,T3,AR5-AR7)為局部變量等分配存儲(chǔ)空間收集返回值函數(shù)參數(shù)傳遞恢復(fù)保護(hù)的寄存器(T2,T3,AR5-AR7)釋放堆棧函數(shù)返回2.被調(diào)用函數(shù)(子函數(shù))的響應(yīng)6.5.4C和匯編語(yǔ)言的接口C代碼和匯編語(yǔ)言代碼混合使用方法:在C源代碼中直接嵌入?yún)R編語(yǔ)言。在C源代碼中使用匯編語(yǔ)言函數(shù)、變量和常數(shù)。使用幾個(gè)獨(dú)立的匯編代碼模塊,并將它們與編譯了的C模塊進(jìn)行鏈接.1.嵌入?yún)R編語(yǔ)言注意:千萬(wàn)注意不要破壞C語(yǔ)言操作環(huán)境。不要從內(nèi)嵌asm匯編語(yǔ)句調(diào)轉(zhuǎn)到C語(yǔ)言模塊中。不要在內(nèi)嵌asm匯編語(yǔ)句中改變C語(yǔ)言模塊中變量的值,但可以安全地讀取它們的值。不要使用內(nèi)嵌asm匯編語(yǔ)句插入?yún)R編器指令來(lái)改變匯編環(huán)境。指令格式:

asm(“assemblertext”);例:asm(“BCLRINTM”)2.在C代碼中訪問(wèn)匯編語(yǔ)言函數(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ù)名前加下劃線“_”.聲明為外部函數(shù)3:在C代碼中訪問(wèn)匯編語(yǔ)言變量①訪問(wèn).bss段或.usect段中沒(méi)有初始化的變量:使用.bss或.usect指令來(lái)定義變量使用.global指令來(lái)定義為外部變量在匯編語(yǔ)言中的變量前加下劃線“_”在C代碼中聲明變量為外部變量并正常地訪問(wèn)它(b)C程序:externintvar ; /*外部變量*/var=1; /*使用變量*/(a)匯編語(yǔ)言程序:

.bss

var,1 ;定義變量

.gloabal

var ;聲明變量為外部變量②非.bss段中變量訪問(wèn)-定義指向該變量的指針定義變量聲明一個(gè)指向該變量起始地址的全局指針在C程序中,必須先聲明該對(duì)象為extern型。3:在C代碼中訪問(wèn)匯編語(yǔ)言變量(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語(yǔ)言中訪問(wèn)匯編語(yǔ)言常數(shù)使用.set和.global指令定義匯編語(yǔ)言全局常數(shù)。使用&運(yùn)算符來(lái)取值。(a)匯編語(yǔ)言程序:_table_size.set10000 ;定義常量.global

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

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論