DSP软件系统结构及设计课件_第1页
DSP软件系统结构及设计课件_第2页
DSP软件系统结构及设计课件_第3页
DSP软件系统结构及设计课件_第4页
DSP软件系统结构及设计课件_第5页
已阅读5页,还剩66页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

DSP器件及应用第三章DSP的软件系统结构与设计主要内容:概述公共目标文件格式(COFF)DSPC语言程序设计DSPC项目编写实例及仿真调试§3.1概述C54x软件设计有3种方法:用C语言开发全汇编语言开发C和汇编语言混合编程开发(主流)

采用C和汇编语言混合编程必须遵循一些有关的规则。汇编软件开发过程C语言软件开发过程§3.2公共目标文件格式(COFF)通过汇编器和链接器建立的可执行目标文件的格式称为公共目标文件格式,即COFF(commonobjectfileformat)。COFF文件有3种形式:COFF0、COFF1、COFF2。C54x汇编器和编译器默认建立的是COFF2文件。§3.2.1COFF文件中的段段(sections)是COFF文件中最重要的概念。段——就是在存储器中占据相邻空间的代码或数据块。每个目标文件都分成若干个段。且每一个段都是分开和各不相同的。所有的COFF文件都包含以下3种形式的段:.text段——该段通常包含可执行代码.data段——该段通常包含初始化数据.bss段——该段通常为未初始化变量保 留存储空间用户自己定义的段——自定义段。§3.2.2段的类型已初始化段:包含的是数据或代码,.text和.data段都是已初始化段,用户通过.sect建立已初始化的自定义段。未初始化段:它为未初始化数据保留空间,.bss段是未初始化段,用户通过.usect建立未初始化的自定义段。一般,把已初始化段存放到程序存储空间,把未初始化段存放在数据空间。§3.2.3目标文件中的段与目标存储器之间的关系汇编器:把指令译成代码,并根据汇编伪指令用适当的段将各部分程序代码和数据连在一起,构成目标文件。链接器:分配存储单元,将各个段分配定位到相应的目标存储器中。各个段到底在存储器中的什么位置,对我们很重要,要弄清楚。自定义段也可以通过定义分配到数据空间或是程序空间。汇编器对段的处理汇编器通过5条伪指令来识别汇编语言程序的段,这5条命令是:.bss 未初始化段,为变量保留空间.usect未初始化段,建立用户的自定义段.text 已初始化段,用户程序代码.data 已初始化段,为某段存储空间初始化数据.sect 已初始化段,建立用户的自定义段伪指令语法:.bss 符号,字数;定义变量或数组名称符号 .usect “段名”,字数;符号:对应于保留空间的第一个字的变量名称。字数:表示保留多少个存储单元。例:.bss x,2 ;为x数组变量保留2个字的空间

var1 .usect“.newvars”,10;为.newvars段保留10个字的空间,var1为该空间第一个字例:.text [段起点].data [段起点].sect “段名”,[段起点][段起点]是可选项,它是用段程序计数器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例:汇编结果(形成的段):

.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

请具体写出汇编器对下面一段程序进行汇编后建立的段。

源程序的行号源代码(机器码)源程序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练习:.text100FHF010H0001HF842H0001H110AHF166H000AHF868H0006H.data0011h0022h0033h0123h00aah00bbh00cch.bss保留10个字空间.newvars保留8个字空间.vectors0011h0033h源程序的行号源代码(机器码)源程序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伪指令告诉汇编器按照表达式的计算结果对代码块进行条件汇编。.ifexpression—标志条件块的开始,仅当条件为真(expression的值非0即为真)时汇编代码。.elseifexpression—标志若.if条件为假,而.elseif条件为真时要汇编代码块。.else—标志若.if条件为假时要汇编代码块。.endif—标志条件块的结束,并终止该条件代码块。附录3.引用其他文件和初始化常数伪指令.include'文件名'—

将指定文件复制到当前位置,其内容可以是程序、数据、符号定义等。.copy'文件名'—

与.include类似。.def符号名

—在当前文件中定义一个符号,可以被其他文件使用。.ref符号名

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

—其作用相当于.def、.ref效果之和。.mmregs—定义存储器映射寄存器的符号名,这样就可以用AR0、PMST等助记符替换实际的存储器地址。.float数1,数2—指定的各浮点数连续放置到存储器中(从当前段指针开始)。.word数1,数2—指定的各数(十六进制)连续放置到存储器中。.spacen—以位为单位,空出n位存储空间。.end—程序块结束。附录4.宏定义和宏调用TMS320C54x汇编支持宏语言。如果程序中需要多次执行某段程序,可以把这段程序定义(宏定义)为一个宏,然后在需要重复执行这段程序的地方调用这条宏。宏定义如下:Macname.macro[parameter1][,…,parametern]……

[.mexit].endm宏调用的格式:[label][:]macname[parameter1][,…,parametern]1*23*add34*5*ADDRP=P1+P2+P3;说明宏功能67add3.macrop1,p2,p3,ADDRP;定义宏89LDp1,A;将参数1赋给A10ADDp2,A;将参数2与A相加11ADDp3,A;将参数3与A相加12STLA,ADDRP;将结果A的低字存参数413.endm;结束宏141516.globalabc,def,ghi,adr;定义全局符号1718000000add3abc,def,ghi,adr;调用宏110000001000!LDabc,A;宏展开10000010000!ADDdef,A10000020000!ADDghi,A10000038000!STLA,adr附录.例宏定义、宏调用和宏展开链接器对段的处理链接器处理段,主要是完成2个任务:把一个或多个COFF目标文件(.obj)中的各个段作为链接器的输入段,经链接以后在一个可执行的COFF输出模块中建立各个输出段。为各个输出段选定存储器地址。链接器的任务通过链接命令文件(.cmd)完成,链接命令文件则主要是通过2条伪命令实现:MEMORY

此命令用来定义目标系统实际存在的存储器配置图,包括对存储器各部分命名,以及规定它们的起始地址和长度SECTIONS

此命令告诉链接器如何将输入段组合成输出段,以及将输出段放在存储器的什么位置两个文件file1.asm和file2.asm经汇编后形成两个目标文件file1.obj和file2.obj,形成的各个段如右图所示:例:对file1.obj、file2.obj链接后结果如右图所示:对file1.obj、file2.obj默认链接:链接器默认的存储器分配如图所示:§3.3C语言程序设计§3.3.1vectors.asm源文件的编写§3.3.2C语言主体源程序的编写§3.3.35402.h头文件的编写§3.3.45402.cmd命令文件的编写§3.3.5C项目的编程与调试实例若用户要建立一个C语言软件项目,该项目必须包括以下文件(以建一个项目example为例):vectors.asm;定义复位、中断矢量源文件。example.c;主体源程序。c5402.h;定义C5402内部控制及状态寄存器。c5402.cmd;定义存储空间,并为段分配空间。rts.lib ;运行库文件,由TI提供。§3.3.1vectors.asm源文件的编写C的主程序是main,DSP复位时跳转到地址为FF80H的位置,如何从FF80H跳转到main执行?rts.lib运行时间支持库函数解决了该问题:它提供了名称为_c_int00的引导程序,通过执行该程序能进入到main主程序。那如何从FF80H到_c_int00,我们只需在FF80H的位置放置一条汇编跳转指令:

B _c_int00即启动过程:DSP复位(地址:FF80H,存放指令:B_c_int00;)→rts.lib的引导程序_c_int00→main。同理,中断也是如此。因此我们把中断矢量的设置形成一个文件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语言中常用的关键字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端口定义系统主程序CPU的初始化I/O端口输入输出控制程序中断服务子程序DSP的C语言中常用关键字const

用const对任何变量或数组进行限定,保证它们的值不被改变.如: constinta=0x80ioport

用ioport定义I/O端口空间.

格式为:ioportdata_typeporthex_num

即定义porthex_num是一个I/O端口,hex_num是这个I/O端口的地址.如: ioportunsignedport0000 port0000=0x10;把10h数据写到地址为0000h端口interrupt

用来定义中断函数.与汇编语言中的中断子程序类似.如: voidinterruptc_int02() {prevectors(); }near和far

用来指定函数调用的方式.用near时,编译时使用CALL指令产生调用,用far时,编译时使用FCALL指指令产生调用.如: 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程序中定义的所有标识符前加了一个“_”。因此,汇编程序中的变量或子程序若要被C程序调用,则在汇编程序中这些变量或子程序名前要加上“_”。在C中,若要调用汇编中的变量或子程序,则必须在C中声明该子程序为外部,在汇编中用.global声明变量为外部变量,函数为全局函数。在汇编中要引用C中定义的符号,在汇编中要用.ref将该符号进行说明。若在汇编中定义的符号可以被C中引用,则在汇编中应将该符号用.def说明。可在C中直接嵌入汇编语句。格式为:

asm(“ 汇编语句 ”); 如:

asm(“ NOP ”);使用C语言编程,必须使用c或cr链接,这时_c_int00被自动定义为程序的进入点,因此,复位矢量应跳转到_c_int00.清楚并遵循以上规则后,C程序的编写方法与我们所学过的C编程一样。CPU初始化子程序init_5416编写需初始化的相关寄存器: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文件要包括以下内容:要链接的文件名链接的选项(也可以通过CCSbuildoption设置)存储器的配置这些内容主要是由MEMORY和SECTIONS两命令和其他的一些链接命令及选项实现。一、MEMORY命令此命令用来定义目标系统的存储器配置图,包括对存储器各部分命名,以及规定它们的起始地址和长度。语法:MEMORY{ PAGE0:name0[(attri)]:origin=常数,length=常数

PAGE1:name1[(attri)]:origin=常数,length=常数

……… PAGEn:namen[(attri)]:origin=常数,length=常数}PAGE:指定存储器空间页面,最多255页。通常: PAGE0:程序存储器

PAGE1:数据存储器

PAGE2:I/O空间Name:存储器区间名。一页里可以有多个区 间,但同一页的区间名不能相同,且地 址不能重叠,不同页里的区间名可以相 同,但地址也不能重叠。attri:属性(选项)。

R:可读;W:可写;X:可装入执行程 序代码;I:可进行初始化。 若不写,则具有以上所有属性。origin:区间起始地址。length:区间的长度。fill(选项):可简写为f,指定存储器区间的填充字符。该值为两个字节的整型常数。

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,外部扩展一个64K的程序存储器flash,要求片内DARAM全部配置为数据空间,将64K的flash全部配置为程序空间,且要把128字的中断向量地址范围单独分个区间,请用MEMORY写出存储器配置文件。练习:MEMORY{ PAGE0:PROG:origin=0x0000,length=0xff80 vect:origin=0xff80,length=0x80PAGE1:DARAM:origin=0x0000,length=0x4000}二、SECTIONS命令任务:说明如何将输入段组合成输出段;在可执行程序中定义输出段;规定输出段在存储器中的存放位置;允许重新命名输出段。语法:SECTIONS{.name:[property,property……].name:[property,property……]……….name:[property,property……]}Name:输出段名称Property:性质,包括以下内容: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

理论上讲,连接器可对每个输出段在目标存储器中赋予两个地址:装入地址和运行地址。但大多数情况下,这两个地址是相同的。这种将输出段定位在目标存储器中并赋予地址的过程称为段的定位(allocation)。定位还可以通过指定一个或多个参数来控制。Binding:将段定位到指定的地址。如:.text:load=0x1000Memory:将段定位到由MEMORY伪指令定义的具有指定名称(如PROG,DARAM)或属性的地址空间。如:.text:load>PROGAlignment:指定段的起始地址边界。如:.text:align=0x80Page:指定要使用的存储器页面。如:.text:PAGE0SECTIONS{.text :>prog PAGE0.vectors:>vects PAGE0.data :>prog PAGE0.bss :>dram PAGE1}注意:这里段加载位置一定是在MEMORY中有定义的存储器区间。例:三、cmd文件编写例3.5:对一个目标文件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段:包括可执行代码、字符串和编译器的常量。.cinit段:包括初始化变量和常数表。例:inta=1.const段:字符串常量和以const关键字定义的常 量。例:constpi=3.1415926.switch段:为.switch语句建立的表格。未初始化段:.bss段:保留全局和静态变量空间。.stack段:为C的系统堆栈分配存储空间。.system段:为动态存储器函数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的控制及状态寄存器(如:ST0、ST1等),必须对这些寄存器进行定义,否则会出错。一、编写以在C中把ST0状态寄存器设置为FFH为例:#define ST0 (volatileunsignedint*)0x

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论