DSP軟件系統(tǒng)結(jié)構(gòu)及設(shè)計課件_第1頁
DSP軟件系統(tǒng)結(jié)構(gòu)及設(shè)計課件_第2頁
DSP軟件系統(tǒng)結(jié)構(gòu)及設(shè)計課件_第3頁
DSP軟件系統(tǒng)結(jié)構(gòu)及設(shè)計課件_第4頁
DSP軟件系統(tǒng)結(jié)構(gòu)及設(shè)計課件_第5頁
已閱讀5頁,還剩66頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

DSP器件及應(yīng)用第三章DSP的軟件系統(tǒng)結(jié)構(gòu)與設(shè)計主要內(nèi)容:概述公共目標(biāo)文件格式(COFF)DSPC語言程序設(shè)計DSPC項目編寫實例及仿真調(diào)試§3.1概述C54x軟件設(shè)計有3種方法:用C語言開發(fā)全匯編語言開發(fā)C和匯編語言混合編程開發(fā)(主流)

采用C和匯編語言混合編程必須遵循一些有關(guān)的規(guī)則。匯編軟件開發(fā)過程C語言軟件開發(fā)過程§3.2公共目標(biāo)文件格式(COFF)通過匯編器和鏈接器建立的可執(zhí)行目標(biāo)文件的格式稱為公共目標(biāo)文件格式,即COFF(commonobjectfileformat)。COFF文件有3種形式:COFF0、COFF1、COFF2。C54x匯編器和編譯器默認(rèn)建立的是COFF2文件?!?.2.1COFF文件中的段段(sections)是COFF文件中最重要的概念。段——就是在存儲器中占據(jù)相鄰空間的代碼或數(shù)據(jù)塊。每個目標(biāo)文件都分成若干個段。且每一個段都是分開和各不相同的。所有的COFF文件都包含以下3種形式的段:.text段——該段通常包含可執(zhí)行代碼.data段——該段通常包含初始化數(shù)據(jù).bss段——該段通常為未初始化變量保 留存儲空間用戶自己定義的段——自定義段?!?.2.2段的類型已初始化段:包含的是數(shù)據(jù)或代碼,.text和.data段都是已初始化段,用戶通過.sect建立已初始化的自定義段。未初始化段:它為未初始化數(shù)據(jù)保留空間,.bss段是未初始化段,用戶通過.usect建立未初始化的自定義段。一般,把已初始化段存放到程序存儲空間,把未初始化段存放在數(shù)據(jù)空間?!?.2.3目標(biāo)文件中的段與目標(biāo)存儲器之間的關(guān)系匯編器:把指令譯成代碼,并根據(jù)匯編偽指令用適當(dāng)?shù)亩螌⒏鞑糠殖绦虼a和數(shù)據(jù)連在一起,構(gòu)成目標(biāo)文件。鏈接器:分配存儲單元,將各個段分配定位到相應(yīng)的目標(biāo)存儲器中。各個段到底在存儲器中的什么位置,對我們很重要,要弄清楚。自定義段也可以通過定義分配到數(shù)據(jù)空間或是程序空間。匯編器對段的處理匯編器通過5條偽指令來識別匯編語言程序的段,這5條命令是:.bss 未初始化段,為變量保留空間.usect未初始化段,建立用戶的自定義段.text 已初始化段,用戶程序代碼.data 已初始化段,為某段存儲空間初始化數(shù)據(jù).sect 已初始化段,建立用戶的自定義段偽指令語法:.bss 符號,字?jǐn)?shù);定義變量或數(shù)組名稱符號 .usect “段名”,字?jǐn)?shù);符號:對應(yīng)于保留空間的第一個字的變量名稱。字?jǐn)?shù):表示保留多少個存儲單元。例:.bss x,2 ;為x數(shù)組變量保留2個字的空間

var1 .usect“.newvars”,10;為.newvars段保留10個字的空間,var1為該空間第一個字例:.text [段起點].data [段起點].sect “段名”,[段起點][段起點]是可選項,它是用段程序計數(shù)器SPC定義的一個起始值,也可以缺省,缺省值為0,一般都是省略。例:.data.word1,2,3.byte1,2,3,4.sect“.con”;定義段.con.word1,2,3,4;對段賦值(初始化)例:段起點:

.data .word 011h,022h,033h .bss var1,1 .data ptr .word 0123h .text add: LD #4,DP ;EA04H LD #1234H,A ;F020H,1234H ADD 9H,A ;0089H .data vals .word 0aah,0bbh var2 .usect “.newvars”,1 buff .usect “.newvars”,7 .text LD A,B ;F540H例:匯編結(jié)果(形成的段):

.data .word 011h,022h,033h .bss var1,1 .data ptr .word 0123h .text add: LD #4,DP ;EA04H LD #1234H,A ;F020H,1234H ADD 9H,A ;0089H .data vals .word 0aah,0bbh var2 .usect “.newvars”,1 buff .usect “.newvars”,7 .text LD A,B ;F540H

請具體寫出匯編器對下面一段程序進(jìn)行匯編后建立的段。

源程序的行號源代碼(機(jī)器碼)源程序123456789101112131415161718100FHF010H,0001HF842H,0001H110AHF166H,000AHF868H,0006H.data.word011h,022h,033h.bss buffer,10ptr .word 0123h.textadd: LD 0fh,Aaloop:SUB#1,ABC aloop,AGEQ.dataivals .word0aah,0bbh,0cchvar2 .usect “.newvars”,1inbuff.usect “.newvars”,7.textmpy:LD 0ah,Bmloop:MPY#0ah,BBCmloop,BNOV.sect“vectors”.word011h,033h練習(xí):.text100FHF010H0001HF842H0001H110AHF166H000AHF868H0006H.data0011h0022h0033h0123h00aah00bbh00cch.bss保留10個字空間.newvars保留8個字空間.vectors0011h0033h源程序的行號源代碼(機(jī)器碼)源程序123456789101112131415161718100FHF010H,0001HF842H,0001H110AHF166H,000AHF868H,0006H.data.word011h,022h,033h.bss buffer,10ptr .word 0123h.textadd: LD 0fh,Aaloop:SUB#1,ABC aloop,AGEQ.dataivals .word0aah,0bbh,0cchvar2 .usect “.newvars”,1inbuff.usect “.newvars”,7.textmpy:LD 0ah,Bmloop:MPY#0ah,BBCmloop,BNOV.sect“vectors”.word011h,033h匯編后建立的段:附錄1.常用的匯編偽指令附錄2.條件匯編偽指令.if、.elseif、.else、.endif偽指令告訴匯編器按照表達(dá)式的計算結(jié)果對代碼塊進(jìn)行條件匯編。.ifexpression—標(biāo)志條件塊的開始,僅當(dāng)條件為真(expression的值非0即為真)時匯編代碼。.elseifexpression—標(biāo)志若.if條件為假,而.elseif條件為真時要匯編代碼塊。.else—標(biāo)志若.if條件為假時要匯編代碼塊。.endif—標(biāo)志條件塊的結(jié)束,并終止該條件代碼塊。附錄3.引用其他文件和初始化常數(shù)偽指令.include'文件名'—

將指定文件復(fù)制到當(dāng)前位置,其內(nèi)容可以是程序、數(shù)據(jù)、符號定義等。.copy'文件名'—

與.include類似。.def符號名

—在當(dāng)前文件中定義一個符號,可以被其他文件使用。.ref符號名

—在其他文件中定義,可以在本文件中使用的符號。.global符號名

—其作用相當(dāng)于.def、.ref效果之和。.mmregs—定義存儲器映射寄存器的符號名,這樣就可以用AR0、PMST等助記符替換實際的存儲器地址。.float數(shù)1,數(shù)2—指定的各浮點數(shù)連續(xù)放置到存儲器中(從當(dāng)前段指針開始)。.word數(shù)1,數(shù)2—指定的各數(shù)(十六進(jìn)制)連續(xù)放置到存儲器中。.spacen—以位為單位,空出n位存儲空間。.end—程序塊結(jié)束。附錄4.宏定義和宏調(diào)用TMS320C54x匯編支持宏語言。如果程序中需要多次執(zhí)行某段程序,可以把這段程序定義(宏定義)為一個宏,然后在需要重復(fù)執(zhí)行這段程序的地方調(diào)用這條宏。宏定義如下:Macname.macro[parameter1][,…,parametern]……

[.mexit].endm宏調(diào)用的格式:[label][:]macname[parameter1][,…,parametern]1*23*add34*5*ADDRP=P1+P2+P3;說明宏功能67add3.macrop1,p2,p3,ADDRP;定義宏89LDp1,A;將參數(shù)1賦給A10ADDp2,A;將參數(shù)2與A相加11ADDp3,A;將參數(shù)3與A相加12STLA,ADDRP;將結(jié)果A的低字存參數(shù)413.endm;結(jié)束宏141516.globalabc,def,ghi,adr;定義全局符號1718000000add3abc,def,ghi,adr;調(diào)用宏110000001000!LDabc,A;宏展開10000010000!ADDdef,A10000020000!ADDghi,A10000038000!STLA,adr附錄.例宏定義、宏調(diào)用和宏展開鏈接器對段的處理鏈接器處理段,主要是完成2個任務(wù):把一個或多個COFF目標(biāo)文件(.obj)中的各個段作為鏈接器的輸入段,經(jīng)鏈接以后在一個可執(zhí)行的COFF輸出模塊中建立各個輸出段。為各個輸出段選定存儲器地址。鏈接器的任務(wù)通過鏈接命令文件(.cmd)完成,鏈接命令文件則主要是通過2條偽命令實現(xiàn):MEMORY

此命令用來定義目標(biāo)系統(tǒng)實際存在的存儲器配置圖,包括對存儲器各部分命名,以及規(guī)定它們的起始地址和長度SECTIONS

此命令告訴鏈接器如何將輸入段組合成輸出段,以及將輸出段放在存儲器的什么位置兩個文件file1.asm和file2.asm經(jīng)匯編后形成兩個目標(biāo)文件file1.obj和file2.obj,形成的各個段如右圖所示:例:對file1.obj、file2.obj鏈接后結(jié)果如右圖所示:對file1.obj、file2.obj默認(rèn)鏈接:鏈接器默認(rèn)的存儲器分配如圖所示:§3.3C語言程序設(shè)計§3.3.1vectors.asm源文件的編寫§3.3.2C語言主體源程序的編寫§3.3.35402.h頭文件的編寫§3.3.45402.cmd命令文件的編寫§3.3.5C項目的編程與調(diào)試實例若用戶要建立一個C語言軟件項目,該項目必須包括以下文件(以建一個項目example為例):vectors.asm;定義復(fù)位、中斷矢量源文件。example.c;主體源程序。c5402.h;定義C5402內(nèi)部控制及狀態(tài)寄存器。c5402.cmd;定義存儲空間,并為段分配空間。rts.lib ;運行庫文件,由TI提供?!?.3.1vectors.asm源文件的編寫C的主程序是main,DSP復(fù)位時跳轉(zhuǎn)到地址為FF80H的位置,如何從FF80H跳轉(zhuǎn)到main執(zhí)行?rts.lib運行時間支持庫函數(shù)解決了該問題:它提供了名稱為_c_int00的引導(dǎo)程序,通過執(zhí)行該程序能進(jìn)入到main主程序。那如何從FF80H到_c_int00,我們只需在FF80H的位置放置一條匯編跳轉(zhuǎn)指令:

B _c_int00即啟動過程:DSP復(fù)位(地址:FF80H,存放指令:B_c_int00;)→rts.lib的引導(dǎo)程序_c_int00→main。同理,中斷也是如此。因此我們把中斷矢量的設(shè)置形成一個文件vectors.asm,如:

.ref_c_int00,_NMI_INT,_SOFT_INT .sect".vectors"RS B _c_int00 NOP NOPNMI B _NMI_INT NOP NOPSINT2 B _SOFT_INT NOP NOPSINT3 B _SOFT_INT NOP NOP ……§3.3.2C主體源程序的編寫C語言中常用的關(guān)鍵字C與匯編混和編程及注意事項#include"c5402res.h"#include"init_5402.c"ioportunsignedport3002;ioportunsignedport3003;ioportunsignedport8005;ioportunsignedport8007;externvoidinit_5402();voidmain(){unsignedinta;init_5402();while(1){a=port3003;port3002=a;port8005=a;port8007=a;}asm("nop");}voidinterruptNMI_INT(){return;}voidinterruptSOFT_INT(){return;}給出包含的頭文件I/O端口定義系統(tǒng)主程序CPU的初始化I/O端口輸入輸出控制程序中斷服務(wù)子程序DSP的C語言中常用關(guān)鍵字const

用const對任何變量或數(shù)組進(jìn)行限定,保證它們的值不被改變.如: constinta=0x80ioport

用ioport定義I/O端口空間.

格式為:ioportdata_typeporthex_num

即定義porthex_num是一個I/O端口,hex_num是這個I/O端口的地址.如: ioportunsignedport0000 port0000=0x10;把10h數(shù)據(jù)寫到地址為0000h端口interrupt

用來定義中斷函數(shù).與匯編語言中的中斷子程序類似.如: voidinterruptc_int02() {prevectors(); }near和far

用來指定函數(shù)調(diào)用的方式.用near時,編譯時使用CALL指令產(chǎn)生調(diào)用,用far時,編譯時使用FCALL指指令產(chǎn)生調(diào)用.如: farintfoo();FCALLfoo; nearfoo();CALLfoo;C/C++的段(Sections)和匯編語言類似,也分為初始化和未初始化兩類;初始化段(InitializedSections):運行中不變.cinit:tablesforinitializingvariablesandconstants.pinit:tableforcallingglobalobjectconstructors.const:stringconstantanddata(excludingvolatile).switch:tableforswitchstatements.text:allexecutablecode,stringliteralsandconstants未初始化段(UninitializedSections):運行中變化.bss:reservesdataspacesforglobal,staticvars.stack:allocatesspaceforsystemstack.system:allocatesspacefordynamicmemoryDSP的C語言中的段C/C++段存儲SectionMemoryPageSectionMemoryPage.bssRAM1.textROMorRAM0.cinit.pinitROMorRAM0.stackRAM1.constROMorRAM1.switchROMorRAM0.dataROMorRAM1.systemRAM1Data

memory

,Program

memory

C/C++段存儲C與匯編的混合編程及注意事項獨立的C和匯編模塊的接口:C編譯器將C程序中定義的所有標(biāo)識符前加了一個“_”。因此,匯編程序中的變量或子程序若要被C程序調(diào)用,則在匯編程序中這些變量或子程序名前要加上“_”。在C中,若要調(diào)用匯編中的變量或子程序,則必須在C中聲明該子程序為外部,在匯編中用.global聲明變量為外部變量,函數(shù)為全局函數(shù)。在匯編中要引用C中定義的符號,在匯編中要用.ref將該符號進(jìn)行說明。若在匯編中定義的符號可以被C中引用,則在匯編中應(yīng)將該符號用.def說明??稍贑中直接嵌入?yún)R編語句。格式為:

asm(“ 匯編語句 ”); 如:

asm(“ NOP ”);使用C語言編程,必須使用c或cr鏈接,這時_c_int00被自動定義為程序的進(jìn)入點,因此,復(fù)位矢量應(yīng)跳轉(zhuǎn)到_c_int00.清楚并遵循以上規(guī)則后,C程序的編寫方法與我們所學(xué)過的C編程一樣。CPU初始化子程序init_5416編寫需初始化的相關(guān)寄存器:PMST,ST0,ST1,IFR,IMR,SWWSR,BSCRvoidinit_5416(){asm("SSBXINTM");PMST=0X00E0;//MP=1,OVLY=1,IPTR=1;ST0=0;ST1=0X4960;//CPL=1,INTM=1,SXM=1,FRCT=1,CMPT=1IFR=0XFFFF;IMR=0;SWWSR=0X7FFF;//BSCR=0XFFFF;}CPL必須為1,定義直接尋址方式,OVM定義為0§3.3.3鏈接命令文件編寫(CMD文件).cmd文件要包括以下內(nèi)容:要鏈接的文件名鏈接的選項(也可以通過CCSbuildoption設(shè)置)存儲器的配置這些內(nèi)容主要是由MEMORY和SECTIONS兩命令和其他的一些鏈接命令及選項實現(xiàn)。一、MEMORY命令此命令用來定義目標(biāo)系統(tǒng)的存儲器配置圖,包括對存儲器各部分命名,以及規(guī)定它們的起始地址和長度。語法:MEMORY{ PAGE0:name0[(attri)]:origin=常數(shù),length=常數(shù)

PAGE1:name1[(attri)]:origin=常數(shù),length=常數(shù)

……… PAGEn:namen[(attri)]:origin=常數(shù),length=常數(shù)}PAGE:指定存儲器空間頁面,最多255頁。通常: PAGE0:程序存儲器

PAGE1:數(shù)據(jù)存儲器

PAGE2:I/O空間Name:存儲器區(qū)間名。一頁里可以有多個區(qū) 間,但同一頁的區(qū)間名不能相同,且地 址不能重疊,不同頁里的區(qū)間名可以相 同,但地址也不能重疊。attri:屬性(選項)。

R:可讀;W:可寫;X:可裝入執(zhí)行程 序代碼;I:可進(jìn)行初始化。 若不寫,則具有以上所有屬性。origin:區(qū)間起始地址。length:區(qū)間的長度。fill(選項):可簡寫為f,指定存儲器區(qū)間的填充字符。該值為兩個字節(jié)的整型常數(shù)。

C5402的存儲器配置。MEMORY{ PAGE0:PROG:origin=0x0100,length=0x2000 vect:origin=0x0080,length=0x80PAGE1:DARAM:origin=0x2100,length=0x1000PAGE2:IO:origin=0x0000,length=0x10000}注意:語法中大寫的詞在實際編寫文件時也一定要大寫,如PAGE,MEMORY。例:若5402工作在MP模式,OVLY=0,外部擴(kuò)展一個64K的程序存儲器flash,要求片內(nèi)DARAM全部配置為數(shù)據(jù)空間,將64K的flash全部配置為程序空間,且要把128字的中斷向量地址范圍單獨分個區(qū)間,請用MEMORY寫出存儲器配置文件。練習(xí):MEMORY{ PAGE0:PROG:origin=0x0000,length=0xff80 vect:origin=0xff80,length=0x80PAGE1:DARAM:origin=0x0000,length=0x4000}二、SECTIONS命令任務(wù):說明如何將輸入段組合成輸出段;在可執(zhí)行程序中定義輸出段;規(guī)定輸出段在存儲器中的存放位置;允許重新命名輸出段。語法:SECTIONS{.name:[property,property……].name:[property,property……]……….name:[property,property……]}Name:輸出段名稱Property:性質(zhì),包括以下內(nèi)容:1.裝載位置(loadallocation)

load=allocation orallocation or>allocation如:{.text:load=0x1000} or{.text:0x1000} or{.text:>0x1000}2.運行位置(runallocation)

run=allocation orallocation or>allocation3.輸入段(inputsections)

{input_section1,input_section2······}如:{file1.obj(.text),file2.obj(.text)} {file1.obj(.data),file2.obj(.data)}4.段類型(sectiontype)

type=COPY ortype=DSECT or type=NOLOAD5.填充值(fillvalue)

fill=valuename:······{······}=value

理論上講,連接器可對每個輸出段在目標(biāo)存儲器中賦予兩個地址:裝入地址和運行地址。但大多數(shù)情況下,這兩個地址是相同的。這種將輸出段定位在目標(biāo)存儲器中并賦予地址的過程稱為段的定位(allocation)。定位還可以通過指定一個或多個參數(shù)來控制。Binding:將段定位到指定的地址。如:.text:load=0x1000Memory:將段定位到由MEMORY偽指令定義的具有指定名稱(如PROG,DARAM)或?qū)傩缘牡刂房臻g。如:.text:load>PROGAlignment:指定段的起始地址邊界。如:.text:align=0x80Page:指定要使用的存儲器頁面。如:.text:PAGE0SECTIONS{.text :>prog PAGE0.vectors:>vects PAGE0.data :>prog PAGE0.bss :>dram PAGE1}注意:這里段加載位置一定是在MEMORY中有定義的存儲器區(qū)間。例:三、cmd文件編寫例3.5:對一個目標(biāo)文件add.obj的鏈接命令文件編寫。add.obj-madd.map-oadd.outMEMORY{PAGE0:PROG:origin=0x0100,length=0x2000vect:origin=0x0080,length=0x7fPAGE1:DARAM:origin=0x2100,length=0x1000PAGE2:IO:origin=0x0000,length=0xffff}SECTIONS{.text :>ROM PAGE0.vectors:>VECS PAGE0.data :>ROM PAGE0.bss :>RAM PAGE1}C項目中cmd命令文件的編寫一、C編譯器生成的段已初始化段:.text段:包括可執(zhí)行代碼、字符串和編譯器的常量。.cinit段:包括初始化變量和常數(shù)表。例:inta=1.const段:字符串常量和以const關(guān)鍵字定義的常 量。例:constpi=3.1415926.switch段:為.switch語句建立的表格。未初始化段:.bss段:保留全局和靜態(tài)變量空間。.stack段:為C的系統(tǒng)堆棧分配存儲空間。.system段:為動態(tài)存儲器函數(shù)malloc, calloc,realoc分配存儲器空間。說明:.text,.cinit,.switch段必須鏈接到程序PAGE0(ROM或RAM)中;.const段必須鏈接到PAGE1(ROM或RAM)中;.bss,.stack,.system段必須鏈接到PAGE1(RAM)中;vectors.objExample.obj-oexample.out-mexample.mapMEMORY{PAGE0:PROG:origin=0x0100,length=0x2000/*OVLY=1,DARAM vect:origin=0x0080,length=0x80PAGE1:DARAM:origin=0x2100,length=0x1000PAGE2:IO:origin=0x0000,length=0xffff}SECTIONS{.text:{}>PROGPAGE0.vectors:{}>vectPAGE0.bss:{}>DARAMPAGE1.data:{}>PROGPAGE0.cinit:{}>PROGPAGE0.const:{}>DARAMPAGE1.switch:{}>PROGPAGE0.stack:{}>DARAMPAGE1.system:{}>DARAMPAGE1}要鏈接的文件§3.3.4C5402.h頭文件的編寫若要在C源程序中使用5402DSP的控制及狀態(tài)寄存器(如:ST0、ST1等),必須對這些寄存器進(jìn)行定義,否則會出錯。一、編寫以在C中把ST0狀態(tài)寄存器設(shè)置為FFH為例:#define ST0 (volatileunsignedint*)0x

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論