收藏 分享(赏)

dsp的软件系统结构与设计.ppt

上传人:天天快乐 文档编号:579906 上传时间:2018-04-12 格式:PPT 页数:71 大小:1.44MB
下载 相关 举报
dsp的软件系统结构与设计.ppt_第1页
第1页 / 共71页
dsp的软件系统结构与设计.ppt_第2页
第2页 / 共71页
dsp的软件系统结构与设计.ppt_第3页
第3页 / 共71页
dsp的软件系统结构与设计.ppt_第4页
第4页 / 共71页
dsp的软件系统结构与设计.ppt_第5页
第5页 / 共71页
点击查看更多>>
资源描述

1、DSP器件及应用,厦门理工学院电子系陈金西,第三章 DSP的软件系统结构与设计,主要内容:概述公共目标文件格式(COFF)DSP C语言程序设计DSP C项目编写实例及仿真调试,3.1 概述,C54x软件设计有3种方法:用C语言开发全汇编语言开发C和汇编语言混合编程开发(主流) 采用C和汇编语言混合编程必须遵循一些有关的规则。,汇编软件开发过程 C语言软件开发过程,3.2 公共目标文件格式(COFF),通过汇编器和链接器建立的可执行目标文件的格式称为公共目标文件格式,即COFF(common object file format)。COFF文件有3种形式:COFF0、COFF1、COFF2。C

2、54x汇编器和编译器默认建立的是COFF2文件。,3.2.1 COFF文件中的段,段(sections)是COFF文件中最重要的概念。段就是在存储器中占据相邻空间的代码或数据块。每个目标文件都分成若干个段。且每一个段都是分开和各不相同的。所有的COFF文件都包含以下3种形式的段:,.text 段该段通常包含可执行代码.data 段该段通常包含初始化数据.bss 段该段通常为未初始化变量保 留存储空间用户自己定义的段自定义段。,3.2.2 段的类型,已初始化段:包含的是数据或代码,.text和.data段都是已初始化段,用户通过.sect建立已初始化的自定义段。未初始化段:它为未初始化数据保留空

3、间,.bss段是未初始化段,用户通过.usect建立未初始化的自定义段。一般,把已初始化段存放到程序存储空间,把未初始化段存放在数据空间。,3.2.3 目标文件中的段与目标存储器之间的关系,汇编器:把指令译成代码,并根据汇编伪指令用适当的段将各部分程序代码和数据连在一起,构成目标文件。链接器:分配存储单元,将各个段分配定 位到相应的目标存储器中。各个段到底在存储器中的什么位置,对我们很重要,要弄清楚。,自定义段也可以通过定义分配到数据空间或是程序空间。,汇编器对段的处理,汇编器通过5条伪指令来识别汇编语言程序的段,这5条命令是:.bss 未初始化段,为变量保留空间.usect 未初始化段,建立

4、用户的自定义段.text 已初始化段,用户程序代码.data 已初始化段,为某段存储空间初始化数据.sect 已初始化段,建立用户的自定义段,伪指令语法:,.bss符号,字数; 定义变量或数组名称符号.usect “段名”,字数;符号:对应于保留空间的第一个字的变量名称。字数:表示保留多少个存储单元。,例:.bss x,2 ;为x数组变量保留2个字的空间 var1.usect “.newvars”,10 ;为.newvars段保留10个字的空间,var1为该空间第一个字,例:,.text 段起点.data段起点.sect“段名”, 段起点段起点是可选项,它是用段程序计数器SPC定义的一个起始值

5、,也可以缺省,缺省值为0,一般都是省略。,例:.data .word 1,2,3 .byte 1,2,3,4 .sect “.con” ;定义段.con .word 1,2,3,4;对段赋值(初始化),例:,段起点:,.data.word011h,022h,033h.bss var1,1.dataptr.word0123h.textadd:LD#4,DP;EA04HLD#1234H,A;F020H,1234HADD9H,A;0089H.datavals.word0aah,0bbhvar2.usect“.newvars”,1buff.usect“.newvars”,7.textLDA,B;F54

6、0H,例:,汇编结果(形成的段):,.data.word011h,022h,033h.bss var1,1.dataptr.word0123h.textadd:LD#4,DP;EA04HLD#1234H,A;F020H,1234HADD9H,A;0089H.datavals.word0aah,0bbhvar2.usect“.newvars”,1buff.usect“.newvars”,7.textLDA,B;F540H,请具体写出汇编器对下面一段程序进行汇编后建立的段。,练习:,.text100FHF010H0001HF842H0001H110AHF166H000AHF868H0006H,.d

7、ata0011h0022h0033h0123h00aah00bbh00cch,.bss保留10个字空间,.newvars保留8个字空间,.vectors0011h0033h,汇编后建立的段:,附录1. 常用的汇编伪指令,附录2条件汇编伪指令,.if、.elseif、.else、.endif伪指令告诉汇编器按照表达式的计算结果对代码块进行条件汇编。.if expression 标志条件块的开始,仅当条件为真(expression的值非0即为真)时汇编代码。.elseif expression 标志若.if条件为假,而.elseif条件为真时要汇编代码块。.else 标志若.if条件为假时要汇编代

8、码块。.endif 标志条件块的结束,并终止该条件代码块。,附录3引用其他文件和初始化常数伪指令,.include 文件名 将指定文件复制到当前位置,其内容可以是程序、数据、符号定义等。.copy 文件名 与.include类似。.def 符号名 在当前文件中定义一个符号,可以被其他文件使用。.ref 符号名 在其他文件中定义,可以在本文件中使用的符号。.global 符号名 其作用相当于.def、.ref效果之和。,.mmregs 定义存储器映射寄存器的符号名,这样就可以用AR0、PMST等助记符替换实际的存储器地址。.float 数1,数2 指定的各浮点数连续放置到存储器中(从当前段指针开

9、始)。.word 数1,数2 指定的各数(十六进制)连续放置到存储器中。.space n 以位为单位,空出n位存储空间。.end 程序块结束。,附录4宏定义和宏调用,TMS320C54x汇编支持宏语言。如果程序中需要多次执行某段程序,可以把这段程序定义(宏定义)为一个宏,然后在需要重复执行这段程序的地方调用这条宏。宏定义如下:Macname .macroparameter 1,parameter n .mexit .endm,宏调用的格式:,label: macname parameter1,parametern,1 *23 * add34 *5 * ADDRP=P1+P2+P3 ;说明宏功能

10、67 add3 .macro p1,p2,p3,ADDRP ;定义宏89 LD p1,A ;将参数1赋给A10 ADD p2,A ;将参数2与A相加11 ADD p3,A ;将参数3与A相加12 STL A,ADDRP ;将结果A的低字存参数413 .endm ;结束宏141516 .global abc,def,ghi,adr ;定义全局符号1718 000000 add3 abc,def,ghi,adr ;调用宏11 000000 1000! LD abc,A ;宏展开1 000001 0000! ADD def,A 1 000002 0000! ADD ghi,A1 000003 800

11、0! STL A,adr,附录. 例 宏定义、宏调用和宏展开,链接器对段的处理,链接器处理段,主要是完成2个任务:把一个或多个COFF目标文件(.obj)中的各个段作为链接器的输入段,经链接以后在一个可执行的COFF输出模块中建立各个输出段。为各个输出段选定存储器地址。,链接器的任务通过链接命令文件(.cmd)完成,链接命令文件则主要是通过2条伪命令实现:MEMORY此命令用来定义目标系统实际存在的存储器配置图,包括对存储器各部分命名,以及规定它们的起始地址和长度SECTIONS 此命令告诉链接器如何将输入段组合成输出段,以及将输出段放在存储器的什么位置,两个文件file1.asm和file2

12、.asm经汇编后形成两个目标文件file1.obj和file2.obj,形成的各个段如右图所示:,例:,对file1.obj、file2.obj链接后结果如右图所示:,对file1.obj、file2.obj默认链接:链接器默认的存储器分配如图所示:,3.3 C语言程序设计,3.3.1 vectors.asm源文件的编写3.3.2 C语言主体源程序的编写3.3.3 5402.h头文件的编写3.3.4 5402.cmd命令文件的编写3.3.5 C项目的编程与调试实例,若用户要建立一个C语言软件项目,该项目必须包括以下文件(以建一个项目example为例):,vectors.asm ;定义复位、中

13、断矢量源文件。example.c ;主体源程序。c5402.h ;定义C5402内部控制及状态寄存器。c5402.cmd ;定义存储空间,并为段分配空间。rts.lib ;运行库文件,由TI提供。,3.3.1 vectors.asm源文件的编写,C的主程序是main,DSP复位时跳转到地址为FF80H的位置,如何从FF80H跳转到main执行?rts.lib运行时间支持库函数解决了该问题:它提供了名称为_c_int00的引导程序,通过执行该程序能进入到main主程序。那如何从FF80H到_c_int00,我们只需在FF80H的位置放置一条汇编跳转指令: B _c_int00,即启动过程:DSP

14、复位(地址:FF80H,存放指令:B _c_int00;)rts.lib的引导程序_c_int00main。,同理,中断也是如此。因此我们把中断矢量的设置形成一个文件vectors.asm,如:.ref _c_int00, _NMI_INT, _SOFT_INT.sect .vectorsRSB_c_int00NOPNOPNMIB_NMI_INTNOPNOPSINT2B_SOFT_INTNOPNOPSINT3B_SOFT_INTNOPNOP,3.3.2 C主体源程序的编写,C语言中常用的关键字C与汇编混和编程 及注意事项,#include c5402res.h#include init_540

15、2.cioport unsigned port3002;ioport unsigned port3003;ioport unsigned port8005;ioport unsigned port8007;extern void init_5402( );void main()unsigned int a;init_5402();while(1)a=port3003;port3002=a;port8005=a;port8007=a;asm( nop );void interrupt NMI_INT()return;void interrupt SOFT_INT()return;,给出包含的头文

16、件,I/O端口定义,系统主程序,CPU的初始化,I/O端口输入输出控制程序,中断服务子程序,DSP的C语言中常用关键字,const用const对任何变量或数组进行限定,保证它们的值不被改变.如:const int a=0x80ioport用ioport定义I/O端口空间. 格式为:ioport data_type port hex_num即定义port hex_num是一个I/O端口,hex_num是这个I/O端口的地址.如:ioport unsigned port0000port0000=0x10 ;把10h数据写到地址为0000h端口,interrupt用来定义中断函数.与汇编语言中的中断

17、子程序类似.如:void interrupt c_int02()prevectors(); near和far用来指定函数调用的方式.用near时,编译时使用CALL指令产生调用,用far时,编译时使用FCALL指指令产生调用.如:far int foo(); FCALL foo;near foo(); CALL foo;,C/C+的段(Sections)和汇编语言类似,也分为初始化和未初始化两类;初始化段(Initialized Sections):运行中不变.cinit: tables for initializing variables and constants.pinit: table

18、 for calling global object constructors.const: string constant and data (excluding volatile).switch: table for switch statements.text: all executable code, string literals and constants未初始化段(Uninitialized Sections):运行中变化.bss: reserves data spaces for global, static vars.stack: allocates space for sy

19、stem stack.system: allocates space for dynamic memory,DSP的C语言中的段,C/C+段存储,C/C+段存储,C与汇编的混合编程及注意事项,独立的C和汇编模块的接口:C编译器将C程序中定义的所有标识符前加了一个“_”。因此,汇编程序中的变量或子程序若要被C程序调用,则在汇编程序中这些变量或子程序名前要加上“_”。在C中,若要调用汇编中的变量或子程序,则必须在C中声明该子程序为外部,在汇编中用.global声明变量为外部变量,函数为全局函数。,在汇编中要引用C中定义的符号,在汇编中要用.ref将该符号进行说明。若在汇编中定义的符号可以被C中引用

20、,则在汇编中应将该符号用.def说明。可在C中直接嵌入汇编语句。格式为:asm(“汇编语句 ”);如:asm(“NOP”);,使用C语言编程,必须使用c或cr链接,这时_c_int00被自动定义为程序的进入点,因此,复位矢量应跳转到_c_int00.,清楚并遵循以上规则后,C程序的编写方法与我们所学过的C编程一样。,CPU初始化子程序init_5416编写需初始化的相关寄存器:PMST,ST0,ST1,IFR,IMR,SWWSR,BSCRvoid init_5416()asm( SSBX INTM );PMST=0X00E0; /MP=1,OVLY=1,IPTR=1;ST0=0;ST1=0X4

21、960; /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文件要包括以下内容:要链接的文件名链接的选项(也可以通过CCS build option设置)存储器的配置这些内容主要是由MEMORY和SECTIONS两命令和其他的一些链接命令及选项实现。,一、MEMORY命令,此命令用来定义目标系统的存储器配置图,包括对存储器各部分命名,以及规定它们的起始地址和长度。语法:MEMORYPAGE

22、0: name0(attri): origin=常数,length=常数PAGE 1: name1(attri): origin=常数,length=常数PAGE n: namen(attri): origin=常数,length=常数,PAGE:指定存储器空间页面,最多255页。通常:PAGE 0:程序存储器PAGE 1:数据存储器PAGE 2:I/O空间Name:存储器区间名。一页里可以有多个区 间,但同一页的区间名不能相同,且地 址不能重叠,不同页里的区间名可以相 同,但地址也不能重叠。,attri:属性(选项)。 R:可读;W:可写;X:可装入执行程 序代码;I:可进行初始化。 若不写

23、,则具有以上所有属性。origin:区间起始地址。length:区间的长度。fill(选项):可简写为f,指定存储器区间的填充字符。该值为两个字节的整型常数。,C5402的存储器配置。MEMORYPAGE 0: PROG: origin=0x0100,length=0x2000 vect: origin=0x0080,length=0x80 PAGE 1: DARAM: origin=0x2100,length=0x1000 PAGE 2: IO: origin=0x0000,length=0x10000注意:语法中大写的词在实际编写文件时也一定要大写,如PAGE,MEMORY。,例:,若54

24、02工作在MP模式,OVLY=0,外部扩展一个64K的程序存储器flash,要求片内DARAM全部配置为数据空间,将64K的flash全部配置为程序空间,且要把128字的中断向量地址范围单独分个区间,请用MEMORY写出存储器配置文件。,练习:,MEMORYPAGE 0: PROG: origin=0x0000,length=0xff80 vect: origin=0xff80,length=0x80 PAGE 1: DARAM: origin=0x0000,length=0x4000,二、SECTIONS命令,任务:说明如何将输入段组合成输出段;在可执行程序中定义输出段;规定输出段在存储器中

25、的存放位置;允许重新命名输出段。,语法:SECTIONS.name :property,property .name : property,property .name : property,property,Name:输出段名称Property:性质,包括以下内容:1.装载位置(load allocation) loadallocationor allocationor allocation如:.text: load0x1000or.text: 0x1000or.text: 0x1000,2.运行位置(run allocation) runallocationor allocationor

26、allocation3.输入段(input sections) input_section1,input_section2如:file1.obj(.text), file2.obj(.text) file1.obj(.data), file2.obj(.data),4.段类型(section type) typeCOPYor typeDSECTortypeNOLOAD5.填充值(fill value) fill=value name:=value,理论上讲,连接器可对每个输出段在目标存储器中赋予两个地址:装入地址和运行地址。但大多数情况下,这两个地址是相同的。 这种将输出段定位在目标存储器中并

27、赋予地址的过程称为段的定位(allocation)。 定位还可以通过指定一个或多个参数来控制。,Binding: 将段定位到指定的地址。 如:.text: load=0x1000Memory:将段定位到由MEMORY伪指令定义的具有指定名称(如PROG,DARAM)或属性的地址空间。 如:.text: loadPROGAlignment: 指定段的起始地址边界。 如: .text: align=0x80Page: 指定要使用的存储器页面。 如:.text: PAGE 0,SECTIONS.text: progPAGE 0.vectors : vectsPAGE 0.data: progPAGE

28、 0.bss: dramPAGE 1注意:这里段加载位置一定是在MEMORY中有定义的存储器区间。,例:,三、cmd文件编写,例3.5:对一个目标文件add.obj的链接命令文件编写。add.obj-m add.map-o add.outMEMORYPAGE 0: PROG: origin=0x0100,length=0x2000 vect: origin=0x0080,length=0x7f PAGE 1: DARAM: origin=0x2100,length=0x1000 PAGE 2: IO: origin=0x0000,length=0xffffSECTIONS.text: ROM

29、PAGE 0.vectors : VECSPAGE 0.data: ROM PAGE 0.bss: RAM PAGE 1,C项目中cmd命令文件的编写,一、C编译器生成的段已初始化段:.text段:包括可执行代码、字符串和编译器的常量。.cinit段:包括初始化变量和常数表。例:int a1.const段:字符串常量和以const关键字定义的常量。例:const pi=3. 1415926.switch段:为.switch语句建立的表格。,未初始化段:.bss段:保留全局和静态变量空间。.stack段:为C的系统堆栈分配存储空间。.system段:为动态存储器函数malloc, calloc,

30、realoc分配存储器空间。,说明:.text,.cinit,.switch段必须链接到程序PAGE 0(ROM或RAM)中;.const段必须链接到PAGE 1(ROM或RAM)中;.bss,.stack,.system段必须链接到PAGE 1(RAM)中;,vectors.objExample.obj-o example.out-m example.mapMEMORYPAGE 0: PROG: origin=0x0100,length=0x2000 /*OVLY=1,DARAMvect: origin=0x0080,length=0x80PAGE 1: DARAM: origin=0x21

31、00,length=0x1000PAGE 2: IO: origin=0x0000,length=0xffffSECTIONS.text: PROG PAGE 0.vectors: vect PAGE 0.bss: DARAM PAGE 1.data: PROG PAGE 0.cinit: PROG PAGE 0.const: DARAM PAGE 1.switch: PROG PAGE 0.stack: DARAM PAGE 1.system: DARAM PAGE 1,要链接的文件,3.3.4 C5402.h头文件的编写,若要在C源程序中使用5402 DSP的控制及状态寄存器(如:ST0、

32、ST1等),必须对这些寄存器进行定义,否则会出错。一、编写以在C中把ST0状态寄存器设置为FFH为例:#define ST0 (volatile unsigned int*)0x0006OR#define ST0 *(volatile unsigned int*)0x0006ORvolatile unsigned int* ST0=(volatile unsigned int*) 0x0006;,*ST0=0xFF;ORST0=0XFF;OR*ST0=0XFF这些定义可以写在C源程序中,但DSP的状态寄存器与控制寄存器很多,因此我们可以专门把这些定义作成一个文件(头文件),这样,只需在C源程序

33、中包含该头文件就能直接访问DSP的状态与控制寄存器。,二、添加头文件在C中:#include “c5402.h”Main()St0=0xff;,附:主要参考资料,TMS320C54X DSP应用程序设计与开发,刘益成编,北京航天航空大学出版社,2002.5; TMS320C54x Optimizing CC+ Compiler Users GuideTMS320C54x C Source Debugger Users Guide,3.3.5 C项目的编程与调试实例,例练习1:,#include struct addfloat x1,x2,x3,x4,x5,y;add1;double a5;do

34、uble y,x;void main()add1.x1=3;add1.x2=3;add1.x3=2;add1.x4=2;add1.x5=2;a0=1;a1=2;a2=3;a3=4;a4=5;add1.y=add1.x1*a0+add1.x2*a1+add1.x3*a2+add1.x4*a3+add1.x5*a4;y=add1.y;x=exp(2);while(1);,调试注意事项,检查项目文件添加是否完整Build option中的link选项要选择-c根据需要检查map文件存储器安排是否正确装载的是.out文件,例 请将使用C语言编程实现:ARP2,CPL=0,SXM=1,MP/MC=1,O

35、VLY=1.1、用c语言操作DSP片内控制寄存器,应对片内控制寄存器先定义,并将定义作为头文件5402.H:#define ST0 *(volatile unsigned int*)0x0006#define ST1 *(volatile unsigned int*) 0x0007#define PMST *(volatile unsigned int*) 0x001D2、C程序中编程操作:#include “5402.h”main()ST0=ST0,练习2:请在练习1的程序中添加DSP的初始化程序,要求初始化程序中使得:PMST=0X00E0; ST0=0;ST1=0X0960; SWWSR=0X7FFF;,练习3:请编写程序将DSP内部DARAM 2000h到2020h单元内容复制到3000h到3020h单元中。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经济财会 > 贸易

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报