TMS320C54x的软件开发与设计.ppt

上传人:小飞机 文档编号:6522019 上传时间:2023-11-08 格式:PPT 页数:96 大小:1.20MB
返回 下载 相关 举报
TMS320C54x的软件开发与设计.ppt_第1页
第1页 / 共96页
TMS320C54x的软件开发与设计.ppt_第2页
第2页 / 共96页
TMS320C54x的软件开发与设计.ppt_第3页
第3页 / 共96页
TMS320C54x的软件开发与设计.ppt_第4页
第4页 / 共96页
TMS320C54x的软件开发与设计.ppt_第5页
第5页 / 共96页
点击查看更多>>
资源描述

《TMS320C54x的软件开发与设计.ppt》由会员分享,可在线阅读,更多相关《TMS320C54x的软件开发与设计.ppt(96页珍藏版)》请在三一办公上搜索。

1、第4章 DSP的软件开发与设计,第4章 TMS320C54x的软件开发与设计,4.1 TMS320C54x软件开发过程 4.2 汇编语言程序的编辑、汇编和链接过程 4.3 COFF的一般概念,第4章 DSP的软件开发与设计,4.1 TMS320C54x软件开发过程,C54x的应用软件开发主要完成以下工作:(1)选择编程语言编写源程序 C54x提供2种编程语言,即汇编语言和C/C+语言。对于完成一般功能的代码,这两种语言都可使用,但对于一些运算量很大的关键代码,最好采用汇编语言来完成,以提高程序的运算效率。(2)选择开发工具和环境 C54x提供了两种开发环境。即非集成开发环境和集成开发环境CCS

2、。,第4章 DSP的软件开发与设计,TMS320的开发工具是一个软件包,其中包括:,C优化编译器汇编器连接器归档器交叉引用列表器十六进制转换公用程序,第4章 DSP的软件开发与设计,C优化编译器(C Compile),TI 为其TMS320系列 DSP提供了一系列的 C 编译器。将标准 C 源文件编译成为相应片种的汇编语言源代码文件。完全符合ANSI C标准带有一个完整的运行支持库使用多种先进技术来优化 C 源代码,以产生高效汇编代码。,第4章 DSP的软件开发与设计,汇编器(Assembler),将汇编语言的源程序文件汇编成为机器语言的目标程序文件,其格式为COFF(公用目标文件格式)。汇编

3、语言源程序可以包括汇编语言指令(instruction)、汇编伪指令(assembler directives)和宏指令(macro directives),第4章 DSP的软件开发与设计,连接器(Linker),连接器的基本任务是将目标文件连接在一起,产生可执行模块。连接器可以接受的输入文件包括汇编器产生的COFF目标文件、命令文件、库文件、以及已部分连接好了的文件。它所产生的可执行COFF目标模块可以装入各种开发工具,或由TMS320器件来执行,第4章 DSP的软件开发与设计,归档器(Archiver),归档器允许用户将一组文件归入一个档案文件(库)。例如,将若干个宏归入一个宏库,汇编器将

4、搜索这个库,并调用源文件中使用的宏。也可以用归档器将一组目标文件收入一个目标文件库,连接器将连接库内的成员,并解决外部引用,第4章 DSP的软件开发与设计,交叉引用列表器(Cross-Reference Lister),交叉引用列表器是一个查错的工具。它接受已经连接好的目标文件作为输入,产生一个交叉引用列表作为输出。它列出符号、符号的定义、以及它们在已经连接的源文件中的引用,第4章 DSP的软件开发与设计,十六进制转换公用程序(Hex Conversion Utility),将COFF目标文件转换成为若干种标准的文件格式:ASCII-十六进制Extended TektronixIntel MC

5、S-86Motorola Exorciser,第4章 DSP的软件开发与设计,第4章 DSP的软件开发与设计,全汇编编程:代码效率高,可直接对硬件设置;代码量较大,可读性差。全C编程:提高软件开发速度和可读性,方便软件移植;代码效率较低,硬件控制不方便。,混合编程,混合编程几种方法:(1)独立编写C/C+程序和汇编程序,分开编译或汇编形成各自的目标模块,再用链接器将C/C+模块和汇编模块链接起来。(2)在C/C+程序中直接内嵌汇编语句。(3)将C程序编译生成相应的汇编程序,手工修改和优化C编译器生成的汇编代码。,第4章 DSP的软件开发与设计,混合编程说明:,变量和函数命名规则,无论是变量还是

6、函数,在C语言和汇编中均需要说明为全局的。在C语言中需要有准确的函数原型说明。,在C语言中保持“自然”的命名,而在汇编语言中该名字需加一个下划线作为前缀。,例:C语言部分:extern int product(int*x,int*y);extern int i;,汇编部分:.global _i.global _product,第4章 DSP的软件开发与设计,混合编程说明:,变量访问规则,C程序访问由.bss定义的汇编变量:(1)汇编程序中,该变量名前要加下划线“_”;(2)汇编程序中,用.global命令将其定义为全局变量;(3)在C程序中,将变量说明为外部变量,C语言部分:extern in

7、t var;var=1;,汇编部分:.bss _var,1.global _var,第4章 DSP的软件开发与设计,混合编程说明:,变量访问规则,C程序访问不在.bss中定义的汇编常量表:(1)汇编程序中,在该常量表前加一标号(标号前要加“_”);(2)汇编程序中,将该标号定义为全局标号;(3)在C程序中,以extern的形式对该标号声明,并利用指针访 问该常量表。,C语言部分:extern int var;int*p=var;f=p1,汇编部分:.global _var_var:.word 10.word 20,第4章 DSP的软件开发与设计,混合编程说明:,变量访问规则,C程序访问用.se

8、t定义的汇编时间常数:(1)汇编程序中,在该常数名前“_”;(2)汇编程序中,将该常数名定义为全局符号;(3)在C程序中,以extern的形式对该符号声明,并用取地址运 算符“&”取该常量参与运算,C语言部分:extern int shift;#define ad(int)(,汇编部分:_shift.set 3.global _shift,第4章 DSP的软件开发与设计,混合编程说明:,变量访问规则,汇编程序访问用C程序中的变量或数组:(1)在汇编程序和C程序中,都将该变量或数组定义成外部属性。(2)在汇编中定义该变量或数组时需在前加“_”;,C语言部分:int speech_in160,sp

9、eech_out160;main(),汇编部分:.global _speech_in.global _speech_out,ld#_speech_in,b stlm b,ar2ld#_speech_out,astlm a,ar3ld#159,astlm a,brcnopnoprptb next,mvdd*ar2+,*ar3+next:,第4章 DSP的软件开发与设计,混合编程说明:,程序调用规则,寄存器使用说明:(1)辅助寄存器AR1、AR6、AR7由被调用函数保护,即可以在函数执行过程中修改,但在函数返回时必须恢复。AR0、AR2、AR3、AR4、AR5可以自由使用,即在函数执行过程中可以修

10、改,而且不必恢复。(2)堆栈指针SP在函数调用时必须予以保护,但其是自动保护的,即在返回时,压入椎栈的内容都将被全部弹出。(3)ARP在函数进入和返回时,必须为0,即当前辅助寄存器为AR0。函数执行时可以是其它值。(4)在缺省的情况下,编译器总是认为OVM为0。因此,若在汇编程序中将OVM置为1,则在返回C环境时,必须将其恢复为0。(5)其它状态位和寄存器在子程序中可以任意使用,不必恢复。,第4章 DSP的软件开发与设计,混合编程说明:,程序调用规则,参数传递说明:(1)函数调用前,将参数以逆序压入运行堆栈,即最右边的参数最先入栈,然后自右向左将参数依次入栈,最后是返回地址入栈。第一个参数(最

11、左边)放入累加器A中进行传递。(2)函数调用结束后,将返回值置于累加器A中。,编程实例以32位乘法运算为例。虽然用C/C+语言表达乘法运算较为方便和明了,但由于C/C+语言无法很好利用DSP汇编语言为实现各种乘法运算而提供的指令,使得C/C+程序效率低下。所以这里用汇编语言完成乘法运算,再用C/C+程序调用它。,第4章 DSP的软件开发与设计,编程实例(续)C语言主程序#include#include int main()extern int*MPY32(long X,long Y);/定义函数原型,返回指针值 int W4;/定义存放相乘结果的数组 int*P;int i;P=MPY32(0

12、 x11112222,0 x33334444);/函数调用/该指针指向数据存储器中,存放相乘结果单元的首地址for(i=0;i4;i+)Wi=*P+;/将相乘结果存到数组中 printf(“%xn”,Wi);/以十六进制方式输出该数组值,第4章 DSP的软件开发与设计,编程实例(续)参数传递在主程序中进行MPY32函数调用时,函数传递情形如下所示。,函数MPY32的第一参数存放在A累加器中,第二个参数在堆栈中,高16位在堆栈中的低地址,低16位在堆栈中的高地址。,函数返回地址,SP,3333h,4444h,1111h,2222h,累加器A,第4章 DSP的软件开发与设计,汇编算法简介由于16

13、bit定点DSP中没有32 bit乘法指令,要用几种16 bit乘法指令结合一定算法来进行32 bit乘法运算。关键指令有:MACSU Xmem,Ymem,src/src+=Uxmem*UymemMAC Xmem,Ymem,src/src+=xmem*ymem MPYU Smem,dst/dst=T*Usmem,第4章 DSP的软件开发与设计,编程实例(续)汇编程序.mmregs.bss x1,1.bss x0,1.bss y1,1.bss y0,1.bss w3,1.bss w2,1.bss w1,1.bss w0,1.text.global _MPY32/声明函数名为全局变量_MPY32:

14、,第4章 DSP的软件开发与设计,编程实例(续)汇编程序STM#x1,AR2/AR2指向第一个参数存放单元STM#y1,AR3/AR3指向第二个参数存放单元STM#w0,AR4/AR4指向乘法结果存放单元STH A,*AR2+/传递第一个参数STL A,*AR2LD*SP(1),A/传递第二个参数STL A,*AR3+LD*SP(2),ASTL A,*AR3SUB ALD*AR2,T/T=x0MPYU*AR3-,A/A=x0*y0STL A,*AR4-/w0=x0*y0LD A,-16,A/A=A16,低16位相乘的进位MACSU*AR2-,*AR3+,A/A+=y1*x0MACSU*AR3-

15、,*AR2,A/A+=x1*y0,第4章 DSP的软件开发与设计,编程实例(续)汇编程序STL A,*AR4-/w1=ALD A,-16,A/A=A16MAC*AR2,*AR3,A/A+=x1*y1STL A,*AR4-/w2赋值STH A,*AR4/w3赋值LD#w3,A/w3单元地址作为返回值,传递到ARET,第4章 DSP的软件开发与设计,混合编程说明:,汇编语句嵌入规则,在C程序中直接内嵌汇编语句。此种方法可以在C程序中实现C语言无法实现的一些硬件控制功能,如修改寄存器值,或在编译结果中添加注释等。嵌入汇编语句的方法比较简单,只需在汇编语句的两边加上括号和双引号,并且在括号前加上asm

16、标识符即可,即asm(“汇编语句”)。但需注意以下几点:(1)括号中的汇编语句必须以标号、空格、tab、分号开头,这和通常的汇编编程的语法一样。(2)不要在嵌入的汇编语句中使用修饰性汇编代码.text、.data等。(3)插入跳转语句和标号会产生不可预测的结果。(4)汇编语句不要改变C程序中变量的值。,asm(“ssbx xf”)asm(“*this is an assembly language comment”),练习:用C实现循环延时,用嵌入式汇编语句对XF引脚置高低电平,实现方波发生器。,第4章 DSP的软件开发与设计,4.2 汇编语言程序的编辑、汇编和链接过程,示意图,第4章 DSP

17、的软件开发与设计,4.2 汇编语言程序的编辑、汇编和链接过程,1.编辑,利用各种文本编辑器,如笔记本、WORD、EDIT和TC等,可编写汇编语言源程序。,2.汇编,当汇编语言源程序编写好以后,可利用C54x的汇编器ASM500,对一个或多个源程序分别进行汇编,并生成列表文件(.lst)和目标文件(.obj)。,第4章 DSP的软件开发与设计,4.2 汇编语言程序的编辑、汇编和链接过程,2.汇编,常用的汇编命令:,asm500%1 s l x,调用汇编器命令,源文件名,将程序所有定义的符号放在目标文件的符号表中,生成一个列表文件.lst,生成一个交叉汇编表,第4章 DSP的软件开发与设计,4.2

18、 汇编语言程序的编辑、汇编和链接过程,3.链接,所谓链接,就是利用C54x的链接器LNK500,根据链接器命令文件(.cmd)对已汇编过的一个或多个目标文件(.obj)进行链接,生成输出文件(.out)和存储器映像文件(.map)。,常用的汇编器命令:,lnk500%1.cmd,lnk500:调用链接器命令,%1.cmd:链接命令文件名,该文件须指明目标文件、输入文件、输出文件、链接选项和存储器配置要求等。,第4章 DSP的软件开发与设计,4.3 COFF的一般概念,汇编器和链接器生成的目标文件,是一个可以由C54x器件执行的文件。这些目标文件的格式称之为公共目标文件格式(COFF)。,在编写

19、汇编语言程序时,COFF采用代码段和数据段的形式,以便于模块化的编程,使编程和管理变得更加方便。这些代码段和数据段简称为段。汇编器和链接器提供一些伪指令来建立和管理各种各样的段。,第4章 DSP的软件开发与设计,COFF文件的基本单元,1.段(sections),是COFF文件中最重要的概念。每个目标文件都分成若干段。,段是存储器中占据相邻空间的代码或数据块。一个目标文件中的每个段都是分开的和各不相同的。,COFF目标文件都包含以下3种形式的段:.text 段(文本段),通常包含可执行代码;.data 段(数据段),通常包含初始化数据;.bss 段(保留空间段),通常为未初始化变量保留存储空间

20、。,第4章 DSP的软件开发与设计,COFF文件的基本单元,2.段的基本类型,COFF目标文件中的段有两种基本类型。,初始化段 未初始化段,(1)初始化段,初始化段中包含有数据或程序代码。主要有:.text段已初始化段;.data段已初始化段;.sect段已初始化段,由汇编器伪指令建立 的自定义段。,第4章 DSP的软件开发与设计,2.段的基本类型,COFF目标文件中的段有两种基本类型。,(2)未初始化段,在存储空间中,为未初始化数据保留存储空间。它包括:.bss段未初始化段;.usect段未初始化段,由汇编命令建立的命 名段(自定义段)。,第4章 DSP的软件开发与设计,COFF文件的基本单

21、元,3.段与目标存储器的对应关系,汇编器的任务:在汇编过程中,根据汇编命令用适当的段将各部分程序代码和数据连在一起,构成目标文件。链接器的任务:就是分配存储单元,将目标文件中的段重新定位到目标系统的存储器中,这一过程称为定位或分配。,第4章 DSP的软件开发与设计,3.段与目标存储器的对应关系,目标文件中的段与目标存储器之间的关系,.bss,.data,.text,RAM,E2PROM,ROM,第4章 DSP的软件开发与设计,汇编器对段的处理,汇编器对段的处理是通过段伪指令来区别各个段的,并将段名相同的语句汇编在一起。汇编器有5条伪指令可识别汇编语言程序的各个部分:,.bss.usect.te

22、xt.data.sect,定义未初始化段定义未初始化段定义已初始化段定义已初始化段定义已初始化段,第4章 DSP的软件开发与设计,汇编器对段的处理,未初始化段就是在C54x存储器中保留空间,通常它们被定位在RAM区。在目标文件中,这些段中没有确切的内容。由这些段定义的空间仅作为临时存储空间,在程序运行时,可以利用这些存储空间存放变量。未初始化段分为默认的和命名的两种,分别由汇编器伪指令.bss和.usect产生。,1.未初始化段,第4章 DSP的软件开发与设计,(1).bss伪指令,1.未初始化段,用于在bss段中保留若干个空间。格式:.bss 符号,字数,符号对应于保留的存储空间第一个字的变

23、量名称。可以让其他段引用,也可以用.global命令定义为全 局符号。,字数表示在bss段或标有名字的段中保留若干个存储单元。,每调用一次.bss伪指令,汇编器在相应的段保留更多的空间。,第4章 DSP的软件开发与设计,1.未初始化段,(2).usect伪指令,用于为指定的命名段保留若干个空间。格式:符号.usect“段名”,字数,段名程序员为未初始化的命名段定义的名字。,每调用一次.usect伪指令,汇编器在指定的命名段保留更多的空间。,第4章 DSP的软件开发与设计,汇编器对段的处理,已初始化段中包含有可执行代码或初始化数据。这些段中的内容都在目标文件中,当加载程序时再放到C54x的存储器

24、中。每个已初始化段都是可以重新定位的,并且可以引用其他段中所定义的符号。链接器在链接时会自动地处理段间的相互引用。已初始化段由.text、.data和.sect三个伪指令建立。,2.已初始化段,第4章 DSP的软件开发与设计,已初始化命令的句法:,2.已初始化段,.text 段起点.data 段起点.sect“段名”,段起点,段起点是任选项。若选用,它为段程序计数器SPC定义一个起始值。若默认,则SPC从0开始。,第4章 DSP的软件开发与设计,汇编器对段的处理,当汇编器遇到.text或.data或.sect命令时,将停止对当前段的汇编(相当于一条结束当前段汇编的命令),然后将紧接着的程序代码

25、或数据汇编到指定的段中,直到再遇到另一条.text、.data或.sect命令为止。当汇编器遇到.bss或.usect命令时,并不结束当前段的汇编,只是暂时从当前段脱离出来,并开始对新的段进行汇编。.bss和.usect命令可以出现在一个已初始化段的任何位置,而不会对它的内容发生影响。,第4章 DSP的软件开发与设计,汇编器对段的处理,命名段由用户指定,与默认的.text,.data和.bss段的使用相同,但它们被分开汇编。假如一部分可执行代码(例如初始化程序)不希望和.text段分配在一起,可将它们汇编进一个命名段,这样就可定位在与.text不同的地方。也可将初始化的数据汇编到与.data段

26、不同的地方,或者将未初始化的变量保留在与.bss段不同的位置。可用.usect和.sect两个伪指令产生命名段。,3.命名段(自定义段),第4章 DSP的软件开发与设计,.usect伪指令产生类似.bss的段,为变量在RAM中保留存储空间。.sect伪指令产生类似.text和.data的段,可以包含代码或数据。,3.命名段,产生命名段伪指令格式:,符号.usect“段名”,字数.sect“段名”,可以产生多达32767个不同的命名段。段名可长达200个字符。,第4章 DSP的软件开发与设计,每次用一个新名字调用这些伪指令时,就产生一个新的命名段。若用已有的段名调用这些伪指令,则汇编器就将代码或

27、数据(或保留空间)汇编进相应名称的段中。不同的伪指令不能使用相同的段名。即不能用.usect创建了命名段,然后又用.sect创建一个相同名字的段。,3.命名段,第4章 DSP的软件开发与设计,汇编器对段的处理,子段是较大段中的小段。对于子段,汇编器可以单独为其分配存储单元,或者在相同的基段名下与其他段组合在一起。子段结构可用来对存储器空间进行更紧凑的控制,可以使存储器空间分配更加紧密。,4.子段,子段命名格式:,基段名:子段名,子段名前为基段名,随后为冒号,最后为子段名。,第4章 DSP的软件开发与设计,汇编器对段的处理,汇编器为每个段都安排了一个单独的程序计数器称之为段程序计数器SPC。SP

28、C表示在程序段或数据段内当前的地址。开始时汇编器将每个SPC置0。当汇编器将程序代码或数据加到段内时,增加相应的SPC值。若再继续对某个段汇编,则相应的SPC就在先前的数值上继续增加。,5.段程序计数器SPC,第4章 DSP的软件开发与设计,【例】段命令应用举例。,汇编语言源程序:,.datacoeff.word 044h,055h,066h.bss buffer,8 prt.word 0456h.textadd:LD 0Dh,A aloop:SUB#1,A BC aloop,AGEQ.dataivals.word 0CCh,0DDh,0EEh,;初始化数据段;3组数据放入.data段;在.b

29、ss段保留8个单元;0456h放入.data段;初始化文本段,共计5个字,;初始化数据段;3组数据放入.data段,第4章 DSP的软件开发与设计,汇编语言源程序:,var2.usect“newvars”,2 inbuf.usect“newvars”,8.text mpy:LD 0Ah,B mloop:MPY#0Ah,B BC mloop,BNOV.sect“vectors”.word 044h,088h,;建立newvars命名段,保留2个单元;在newvars段保留8个单元;初始化文本段,共计5个字,;建立vectors命名段;2组数据放入vectors命名段,第4章 DSP的软件开发与设

30、计,经汇编后,得列表文件(部分):,2*3*汇编一个初始化表到.data段*4*5 0000.data6 0000 0044 coeff.word 044h,055h,066h 0001 0055 0002 00667*8*在.bss段中为变量保留空间*9*10 0000.bss buffer,811*12*仍然在.data 段中*13*14 0003 0456 prt.word 0456h,源程序的行号,段程序计数器,目标代码,汇编语言源程序,第4章 DSP的软件开发与设计,源程序的行号,段程序计数器,目标代码,汇编语言源程序,15*16*汇编代码到.text段*17*18 0000.tex

31、t19 0000 100d add:LD 0Dh,A20 0001 f010 aloop:SUB#1,A 0002 0001 21 0003 f842 BC aloop,AGEQ 0004 0001 22*23*汇编另一个初始化表到.data 段*24*25 0004.data 26 0004 00cc ivals.word 0CCh,0DDh,0EEh 0005 00dd 0006 00ee27*28*为更多的变量定义另一个段*29*30 0000 var2.usect“newvars”,2 31 0001 inbuf.usect“newvars”,8,第4章 DSP的软件开发与设计,32*

32、33*汇编更多代码到.text段*34*35 0005.text 36 0005 110a mpy:LD 0Ah,B 37 0006 f166 mloop MPY#0Ah,B 0007 000a 38 0008 f868 BC mloop,BNOV 0009 0006 39*40*为中断向量.vectors定义一个自定义段*41*42 0000.sect“vectors”43 0000 0044.word 044h,088h 0001 0088,源程序的行号,段程序计数器,目标代码,汇编语言源程序,第4章 DSP的软件开发与设计,汇编语言源程序经过汇编后,共建立了5个段:.text段文本段,段

33、内有6条共10个字可执 行的程序代码。.data段已初始化的数据段,段内有7 个字的数据。vectors段用.sect命令生成的命名段,段内有2个字的初始化数据。.bss段未初始化的数据段,在存储器中 为变量保留8个存储单元。newvars段用.usect命令建立的命名段,为变量保留10个存储单元。,第4章 DSP的软件开发与设计,【例】比较.byte,.int,.long,.word和.string伪指令。,源程序:.byte 0AAh,0BBh.word 0CCCh.long 0EEEEFFFFh.int 0DDDDh.string“help”,.byte:将一个或多个8位值放入当前段的连

34、续字中。,.word:将一个或多个16位值放入当前段的连续字中。,.long:将32位值放入当前段的2个连续的字中,先存最高有效位。,.int:将一个或多个16位值放入当前段的连续的字中。,.string:将一个或多个字符串中的8位字符放入当前段中。,1初始化常数的伪指令,汇编器常用伪指令,第4章 DSP的软件开发与设计,列表文件:,1 000000 00aa.byte 0AAh,0BBh 000001 00bb2 000002 0ccc.word 0CCCh3 000003 eeee.long 0EEEEFFFFh 000004 ffff4 000005 dddd.int 0DDDDh5 0

35、00006 0068.string“help”000007 0065 000008 006c 000009 0070,汇编器常用伪指令,第4章 DSP的软件开发与设计,1初始化常数的伪指令,.field伪指令:,功能:将单个数值放进当前字的指定位域中。采用.field伪指令,可以将多个字段或域打包成单个字,直到字被填满为止,汇编器不增加SPC。,指令格式:.field value,size in bits,单个数值,当前字的指定位域,汇编器常用伪指令,第4章 DSP的软件开发与设计,1初始化常数的伪指令,.field伪指令的使用。,源程序:,.field 5,3.field 9,6.field

36、 16,5.field 01234h,20.field 01234h,32,.field 5,3,.field 9,6,.field 16,5,.field 01234h,20,1 0 1,1 0 1,0 0 1 0 0 1,0 0 1 0 0 1,1 0 0 0 0,1 0 0 0 0,0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 1 0 1 0 0,0123h,0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 1,0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 1,4h,0 1 0 0,0 1 0 0,.field 01234h,32,0 0 0 0 0

37、 0 0 1 0 0 1 0 0 0 1 1 0 1 0 0,0 0 0 1 0 0 1 0 0 0 1 1 0 1 0 0,0 0 0 1 0 0 1 0 0 0 1 1 0 1 0 0,0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0,0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0,A000h,A480h,A4C0h,0123h,4000h,0000h,1234h,汇编器常用伪指令,第4章 DSP的软件开发与设计,【例】.field伪指令的使用。,汇编后的列表文件:,4 000000 A000.field 5,3 5 000000 A480.field 9,6

38、 6 000000 A4C0.field 16,5 7 000001 0123.field 01234h,20 000002 4000 8 000003 0000.field 01234h,32 000004 1234,组成一个字,不改变SPC。,占用两个字,SPC+2。,占用两个字,SPC+2。,第4章 DSP的软件开发与设计,COFF文件中有一个符号表,主要用来存储程序中有关符号的信息。链接器在执行程序定位时,要使用符号表提供的信息,而调试工具也要使用该表来提供符号调试。,外部符号:是指在一个模块中定义、而在另一个模块中引用的符号。它可以用伪指令.def、.ref或.global来定义。.

39、def在当前模块中定义,并可在别的模块中使用的符号;.ref 在当前模块中使用,但在别的模块中定义的符号;.global可以是上面的任何一种情况。,2定义和引用外部符号的伪指令,汇编器常用伪指令,第4章 DSP的软件开发与设计,【例】说明代码段中外部符号的定义。,.def x.ref y x:ADD#56h,A B y,;定义x;引用y,汇编器常用伪指令,第4章 DSP的软件开发与设计,链接器对段的处理,链接器是开发C54x器件必不可少的开发工具之一,它对段处理时有2个主要任务:将一个或多个COFF目标文件中的各种段作为链接器的输入,经链接后在一个执行的COFF输出模块中建立各个输出段;在程序

40、装入时对其重新定位,为各个输出段选定存储器地址。,第4章 DSP的软件开发与设计,链接器由链接命令文件提供的链接信息。在链接命令文件中,可使用MEMORY和SECTIONS伪指令,为实际应用指定存储器结构和地址的映射。MEMORY用来指定目标存储器结构。SECTIONS用来控制段的构成与地址分配。,链接器对段的处理,第4章 DSP的软件开发与设计,4.3.5 MEMORY指令,MEMORY指令用来规定目标存储器的结构。在实际的应用中,目标系统所配置的存储器是各不相同的,通过MEMORY指令,可以进行各种各样的存储器配置。,MEMORY指令的句法:,MEMORY PAGE0:name 1(att

41、r):origin=constant,length=constant;PAGEn:name n(attr):origin=constant,length=constant;,指令字,存储区间说明语句,书写方式:用大写MEMORY指令字开始;由大括号括起来的存储器区间说明。,存储区间:,存储页面,区间名称,区间属性,起始地址,区间长度,第4章 DSP的软件开发与设计,4.3.5 MEMORY指令,存储区间说明语句:,PAGE:指定存储器空间页面,最多为255页,取决于目标存储器的配置。每一个PAGE代表一个完全独立的地址空间。通常,PAGE 0用于程序存储器;PAGE 1用于数据存储器。若没有规

42、定PAGE,则链接器默认为PAGE 0。,第4章 DSP的软件开发与设计,4.3.5 MEMORY指令,存储区间说明语句:,name:存储器区间名称。可由用字母、$、.、_ 等组成。存储器区间为内部记号,因此不需要保留在输出文件或者符号表中。不同PAGE上的存储器区间可以取相同的名字,但在同一PAGE内的名字不能相同,且不许重叠配置。,第4章 DSP的软件开发与设计,4.3.5 MEMORY指令,存储区间说明语句:,attr:为任选项,用来为命名的存储器区间规 定14个属性。当对输出段定位时,可利用属性限制输出段分配到一定的存储区间。属性选项共有4项:R 规定可以对存储器执行读操作。W 规定可

43、以对存储器执行写操作。X 规定存储器可以装入可执行的程序代码。I 规定可以对存储器进行初始化。,任何一个没有规定属性的存储器(包括所有默认方式的存储器)都有全部4项属性。,第4章 DSP的软件开发与设计,4.3.5 MEMORY指令,存储区间说明语句:,origin:用来指定存储区间的起始地址,可简 写为org或o。其值以字为单位,可以 用十进制、八进制或十六进制数表示。,Length:用来指定存储器空间的长度,可简写 为len或l,其值以字为单位,可以用 十进制、八进制或十六进制数表示。,第4章 DSP的软件开发与设计,【例】用MEMORY伪指令编写连接命令文件。要求:程序存储器:4K字RO

44、M,起始地址为C00h,取名为ROM。数据存储器:32字RAM,起始地址为60h,取名为SCR。512字RAM,起始地址为80h,取名为CHIP。,file1.obj fiel2.obj-o Prog.out MEMORY PAGE 0:ROM:origin=C00h,length=1000h PAGE 1:SCR:origin=60h,length=20h CHIP:origin=80h,length=200h,两个输入文件,一个输出文件 Prog.out,指令字,页面名称,区间名称,起始地址,区间长度,第4章 DSP的软件开发与设计,【例】用MEMORY伪指令编写连接命令文件。,file1

45、.obj fiel2.obj-o Prog.out MEMORYPAGE 0:ROM:org=C00h,len=1000hPAGE 1:SCR:org=60h,len=20h CHIP:org=80h,len=200h,PAGE 0:ROM:org=C00h,len=1000h,00C00h,1000h,01C00h,ROM,PAGE 1:SCR:org=60h,len=20h,00060h,0007Fh,20h,SCR,CHIP:org=80h,len=200h,00080h,200h,0027Fh,CHIP,第4章 DSP的软件开发与设计,SECTIONS指令,用来控制段的构成与地址分配。

46、,指令功能:说明如何将输入段组合成输出段;在可执行程序中定义输出段;规定输出段在存储器中的存放位置;允许重新命名输出段。,1.SECTIONS指令语法,第4章 DSP的软件开发与设计,SECTIONS指令的句法:,SECTIONS name:property,property,property,name:property,property,property,name:property,property,property,指令字,输出段说明语句,段名:定义输出段的名称。,属性:定义该段的内容和存储器的分配。,段名,1.SECTIONS指令语法,属性,属性,属性,第4章 DSP的软件开发与设计,1

47、.SECTIONS指令语法,段属性用来定义输出段的内容和存储地址的分配。包括的内容如下:,装入存储器分配 运行存储器分配 输入段,第4章 DSP的软件开发与设计,1.SECTIONS指令语法,装入存储器分配 用于定义段装入时的存储器地址。,语法格式:load=allocation 或 allocation 或 allocation,allocation:关于段地址的说明,即给段分配存储 单元。,第4章 DSP的软件开发与设计,1.SECTIONS指令语法,装入存储器分配,例如:.text:load=0 x1000.text:loadROM.bss:load(RW).text:PAGE 0,将.

48、text段定位到一个特定的地址。将.text段定位到命名为ROM的存储区。将.bss段定位到属性为R、W的存储区。将.text段定位到PAGE 0。,第4章 DSP的软件开发与设计,1.SECTIONS指令语法,装入存储器分配,若用到一个以上参数,可以将它们排成一行。例如:.text:ROM(PAGE 0)。,第4章 DSP的软件开发与设计,1.SECTIONS指令语法,运行存储器分配 用于定义段运行时的存储器地址。,语法格式:run=allocation 或 run allocation,第4章 DSP的软件开发与设计,1.SECTIONS指令语法,链接器为段在目标存储器中分配两个地址:加载

49、的地址由装入存储器分配完成 执行程序的地址由运行存储器分配完成 通常,这两个地址是相同的。,若要想把程序的加载和运行分开,先将程序加载到ROM,然后在RAM中运行,则用SECTIONS命令让链接器对这个段定位两次即可。例如:.fir:load=ROM,run=RAM,第4章 DSP的软件开发与设计,1.SECTIONS指令语法,输入段 用于定义组成输出段的输入段。,语法格式:out_section:input_sections,在SECTIONS命令中如果不列出输入文件的输入段的段名,则默认把同名段链接成一个输出段。,例如:SECTIONS.text:.data:.bss,链接时:在输入文件中

50、的所有.text段链接成.text输出段所有.data段链接成.data输出段所有.bss段链接成.bss输出段,第4章 DSP的软件开发与设计,1.SECTIONS指令语法,用文件名和段名来规定输入段。,SECTIONS.text:/*创建.text 输出段*/f1.obj(.text)/*链接来自f1.obj文件中的.text 段*/f2.obj(sec1)/*链接来自f2.obj文件中的sec1 段*/f3.obj/*链接来自f3.obj文件中的所有段*/f4.obj(.text,sec2)/*链接f4.obj文件中的.text 段和sec2段*/,第4章 DSP的软件开发与设计,SEC

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号