资源描述
单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,#,第四章,DSP,软件开发,DSP,软件开发流程,编译工具及其使用,汇编语言格式,TMS320C54x DSP,软件开发流程,一、,DSP,软件开发流程,一、,DSP,软件开发流程,1建立源程序,2,C,编译器(,C Compiler),3汇编器(,Assembler),4连接器(,Linker),5调试工具,6十六进制转换公用程序(,Hex Conversion Utility),我们调试一个程序,首先要编辑一个源文件,这个源文件可以是汇编语言,其后缀名为.,asm,,也可以是,C,语言,其后缀名为.,C,。汇编语言的指令集有两种,,助记符指令集(,Mnemonic Instruction Set,),代数指令集(,Algebraic Instruction Set,),。,C,语言则符合标准,C,、,C+,格式。,编辑好汇编语言源文件后,我们需要对这个文件进行“汇编”,从而生成一个.,obj,后缀的中间文件。,之后,通过一个“链接”动作,把.,obj,文件生成一个,DSP,可以执行的文件,后缀为.,out。,链接的作用是分配执行文件代码在,DSP,内部程序空间的和数据空间的位置。这些分配,通过一个后缀为.,cmd,的文件告诉链接命令。,最后,将调试成功的.,out,代码通过十六进制转换程序转化为可固化在可擦写存储器中,实现,DSP,自动脱机运行。,二、编译工具及其使用,TMS320C54xV3.50,版代码生成工具程序,(一)、编译工具,C,编译器,汇编器,归档器,连接器,asm500,input file object file listing file -options,input file:,汇编源文件名,缺省后缀为.,asm;,object file:,编译输出的,OBJ,文件名,缺省后缀为,.,obj;,listing file:,产生的列表文件名,缺省后缀为,.,lst;,options:,编译器使用的各种选择。,1,、汇编器,-,c:,若使用该选项,编译器忽略字母的大小写。例如,abc,与,ABC,是一样的。系统缺省为区分大小写。,-,i:,设置搜索路径。通知编译器在指定的搜索路径中去查找.,copy,.include,中的文件。,用法举例:-,ic:c54x。,-l:(,小写的,L),在编译时产生列表文件,缺省后缀为.,lst,-mg:,汇编源程序使用代数指令集 或在源代码中使用,-s:,将所有的符号都放入符号表。若不使用该选项,编译器仅将全局变量放入符号表,-,v:,指定版本。特别是需要使用,BOOTLOADER,时,应加-,v548,开关,编译指令执行和参数设置,也可在,CCS,中进行。,2,、归档器,Ar500-commandoptionlibnamefilename,Command:,指示归档器行为,a:,加入某文件到库文件中,d:,从库文件中删除文件,r:,替换库文件中某变量,x:,抽取库文件中某变量,归档器,Option,:归档器工作,-q:,不显示状态栏及相关信息;,-s:,打印全局变量;,Libname:,库文件名,Filename,:目标文件,Ar500 -a function sine.obj cos.obj flt.obj,3,、连接器,lnk500,-options filename 1.filename n,-e global_symbol:,定义程序的进入点;,-c:,使用,C,编译器的,ROM,初始化模式;,-cr:,使用,C,编译器的,RAM,初始化模式;,-i dir:,指定库文件的路径;,-l filename:,指定连接时使用的库文件名;,-m filename:,生成,map,文件;,-o filename:,指定生成的,out,文件名。系统缺省为,a.out.,连接器,文件也可以在命令文件中设置,通常使用系统默认值,即不需设置,;,选项可以在命令文件中设置,效果一样,;,具体执行也是在,CCS,中,;,LNK500,生成的,OUT,文件不是纯二进制代码文件,而是包含代码、符号表、代码定位信息的复合文件,通过查看,MAP,文件可以获得变量、子程序等符号的具体地址。注意:,MAP,文件只列出全局变量的地址。(用.,global,说明的符号),段的概念,汇编器对段的处理,链接器对段的处理,.,(二)、公共目标文件格式,1,COFF,文件的基本单元,段,段(,sections),是,COFF,文件中最重要的概念。一个段就是最终在存储器映象中占据连续空间的一个数据或代码块。目标文件中的每一个段都是相互独立的。一般地,,COFF,目标文件包含3个缺省的段:,text,段、,data,段、,bss,段。,段可以分为两大类,即已初始化段和未初始化段。如图,1,所示为目标文件中的段与目标系统中存储器的关系。,图,3,目标文件中的段与目标存储器的关系,2 汇编器对段的处理,2.1,未初始化段,未初始化段主要用来在存储器中保留空间,通常将它们定位到,RAM,中。这些段在目标文件中没有实际内容,只是保留空间而已。程序可以在运行时利用这些空间建立和存储变量。未初始化段是通过使用.,bss,和.,usect,汇编伪指令建立的,两条伪指令的句法分别为:,.,bss,符号,字数,符号.,usect“,段名”,字数,汇编器对段的处理,2,.2,已初始化段,已初始化段包含可执行代码或已初始化数据。这些段的内容存储在目标文件中,加载程序时再放到,TMS320C54X,存储器中。三个用于建立初始化段的伪指令句法分别为:,.,text,段起点,.,data,段起点,.,sect“,段名”,段起点,汇编器对段的处理,2,.,3命名段,命名段就是程序员自己定义的段,它与缺省的.,text、.data,和.,bss,段一样使用,但与缺省段分开汇编。,data,段不同的存储器中,将未初始化的变量汇编到与,bss,段不同的存储器中。产生命名段的伪指令为:,符号.,usect“,段名”,字数,.,sect“,段名”,段起点,汇编器对段的处理,2,.,4子段,子段(,Subsections),是大段中的小段。链接器可以像处理段一样处理子段。采用子段可以使存储器图更加紧密。子段的命名句法为:,基段名:子段名,子段也有两种,用.,sect,命令建立的是已初始化段,用.,usect,命令建立的是未初始化段。,汇编器对段的处理,2,.,5段程序计数器(,SPC),汇编器为每个段安排一个独立的程序计数器,即段程序计数器(,SPC)。SPC,表示一个程序代码段或数据段内的当前地址。开始时,汇编器将每个,SPC,置0,当汇编器将程序代码或数据加到一个段内时,相应的,SPC,增加。如果汇编器再次遇到相同段名的段,继续汇编至相应的段,且相应的,SPC,在先前的基础上继续增加。,图,2,产生的目标代码,3 链接器对段的处理,链接器对段的处理有两个功能。首先,它将汇编器产生的,COFF,目标文件(.,obj,文件)中的各种段作为输入段,当有多个文件进行链接时,它将输入段组合起来,在可执行的,COFF,输出模块中建立各个输出段。其次,链接器为输出段选择存储器地址。,链接器对段的处理,链接器有两个命令完成上述功能,即:,MEMORY,命令定义目标系统的存储器配置图,包括对存储器各部分的命名,以及规定它们的起始地址和长度。,SECTIONS,命令告诉链接器如何将输入段组合成输出段,以及在存储器何处存放输出段。子段可以用来更精确地编排段,可用链接器,SECTIONS,命令指定子段。,图,3,链接器默认的存储器分配,4 重新定位,4.1,链接时,重新定位,将各个段定位到存储器中,每个段都从合适的地址开始。,将符号值调整到相对于新的段地址的数值。,调整对重新定位后符号的引用。,重新定位,4.,2运行时重新定位,将代码装入存储器的一个地方,而运行在另一个地方。利用,SECTIONS,命令选项让链接器定位两次。一些关键的执行代码必须装入在系统的,ROM,中,但希望在较快的,RAM,中运行。,链接器提供了一个简单的处理该问题的方法。利用,SECTIONS,命令选项让链接器定位两次。第一次使用装入关键字设置装入地址,再用运行关键字设置运行地址。,5 程序装入,(1)硬件仿真器和,CCS,集成开发环境,具有内部的装入器,调用装入器的,LOAD,命令即可装入可执行程序。,(2)将代码固化在片外存储器中,采用,Hex,转换工具(,Hex conversion utility),,例如,Hex500,将可执行的,COFF,目标模块(.,out,文件)转换成几种其他目标格式文件,然后将转换后的文件用编程器将代码写入,EPROM/Flash。,6,COFF,文件中的符号,COFF,文件中有一个符号表,用于存储程序中的符号信息。链接器对符号重定位时使用该表,调试工具也使用该表来提供符号调试。,外部符号指在一个模块中定义,在另一个模块中使用的符号。可使用.,def、.ref,或.,global,汇编伪指令将符号定义为外部符号。.,def,在当前模块中定义,可以在别的模块中使用的符号;.,ref,在当前模块中引用,但在别的模块中定义的符号;.,global,可用于以上任何一种情况。,三 汇编伪指令,汇编语言文件的内容,汇编语言指令;,汇编指令(伪指令);,注释语句;,表5-2 常用的汇编,伪指令,汇编伪指令,1段定义伪指令,为便于链接器将程序、数据分段定位于指定的(物理存在的)存储器空间,并将不同的,obj,文件链接起来。段的使用非常灵活,但常用以下约定:,.,text,此段存放程序代码。,.,data,此段存放初始化了的数据。,.,bss ,此段存入未初始化的变量。,.,sect ,名称 定义一个有名段,放初始化了的数据或程序代码。,汇编伪指令,2条件汇编伪指令,.,if、.elseif、.else、.endif,伪指令告诉汇编器按照表达式的计算结果对代码块进行条件汇编。,.,if expression,标志条件块的开始,仅当条件为真(,expression,的值非0即为真)时汇编代码。,.,elseif expression,标志若.,if,条件为假,而.,elseif,条件为真时要汇编代码块。,.,else,标志若.,if,条件为假时要汇编代码块。,.,endif,标志条件块的结束,并终止该条件代码块。,汇编伪指令,3引用其他文件,.,include ,文件名 将指定文件复制到当前位置,其内容可以是程序、数据、符号定义等。,.,copy ,文件名 与.,include,类似。,.,def,符号名 在当前文件中定义一个符号,可以被其他文件使用。,.,ref,符号名 在其他文件中定义,可以在本文件中使用的符号。,.,global,符号名 其作用相当于.,def、.ref,效果之和。,汇编伪指令,4,初始化常数伪指令,对于初始化段,可以使用下列伪指令定义初始化数据,.,long .word/.int .byte .string,例子同前页,对于未初始化段,可以使用下列伪指令来保留空间,.,space,例如:,lable:.space 19,表示当前段中保留19,bit,空间,首地址为,lable。,也可以如前面例子中,.,bss sym,19 ;Reserve space in.bss,5、,段程序计数器(,SPC),定位指令,SPC,用于记录每个段的当前的指针位置,便于编译器分配各个段,.align,其后只能是2,0,2,7,间的2的幂值,其后不带参数,默认为128,即对准页边界,为1表示对准字边界,为2表示对准偶数边界,为,N,表示对准页内的第,N,个字边界,通常作用是使,SPC,对准字边界,偶地址边界或者页边界,汇编伪指令,汇编伪指令,6,其它指令,.,mmregs,定义存储器映射寄存器的符号名,这样就可以用,AR0、PMST,等助记符替换实际的存储器地址。,.,title,为汇编器提供一个打印在每一页顶部的标题,.,set,把一个常数等效为一个符号,.,end,程序块结束。,汇编伪指令,4宏定义和宏调用,TMS320C54x,汇编支持宏语言。如果程序中需要多次执行某段程序,可以把这段程序定义(宏定义)为一个宏,然后在需要重复执行这段程序的地方调用这条宏。,宏定义如下:,Macname.macroparameter 1,parameter n,.mexit,.endm,四 链接器命令文件的编写与使用,文件参数,MEMORY,伪指令,SECTIONS,伪指令,文件参数,-m:,生成,map,文件,-stack,:,保留存储区为未初始化变量,-o:,输出文件,链接器命令文件,链接器命令文件,MEMORY,伪指令就是用来指定目标存储器的模型。,MEMORY,伪指令的一般语法为:,链接器命令文件,链接器命令文件,段指令语法:,SECTIONS,伪指令功能如下:,说明如何将输入段组合成输出段。,在可执行程序中定义输出段。,指定输出段在存储器中存放的位置。,允许对输出段重新命名,链接器命令文件,链接器命令文件,链接器命令文件,例子:,File1.obj,-o file1.out,-m file1.map,MEMORY,PAGE 0:PRO1:origin=2000h,length=1000h,PRO2:origin=3000h,length=500h,PAGE 1:DAT:origin=80h,length=1000h,SECTIONS,.text:load=PRO1,run=PRO2 PAGE0,.vect:PRO2 PAGE0,.data align(128):DAT PAGE1,.bss:DAT PAGE1,图 段的定位,链接器命令文件,系统默认状态,图 链接器默认的存储器分配,缺省情况下,连接器从地址,080h,依次放入。,五 汇编语言程序编写方法,汇编语言源程序格式,汇编语言中的常数和字符串,(一)汇编语言源程序格式,助记符指令一般包含4个部分,其一般组成形式为:,标号:助记符 操作数 ;注释,语句的开头只能是标号、空格、星号或分号,标号是可选项,如果使用,必须从第一列开始,每个域必须用多个或一个空格分开,注释是可选择的,汇编语言源程序格式,1标号区,所有汇编指令和大多数汇编伪指令前面都可以带有标号,标号可以长达32个字符,由,AZ、az、09、_、,和$符号组成,且第一个字符不能是数字,区分大小写。,标号必须从第一列开始;,标号后可以有一个冒号,但他不算标号;,标号代表其接下来的指令的首地址;,汇编语言源程序格式,2助记符区,助记符区不能从第一列开始,否则被认为是标号。,有汇编语言指令和汇编指令;,例如:,汇编语言指令,stm#1,ar0,汇编指令(伪指令).,data,.set,汇编语言源程序格式,3操作数区,操作数区是一个操作数列表,可以是常数、符号或常数与符号构成的表达式。操作数间需用,“,,,”,号隔开。,关于汇编语言指令中操作数前缀:,-用于表示立即数的前缀,其后可以是一个数字,也可以是一个存储器映射寄存器寄存器名(相当于存储器映射寄存器地址);,*-用于表示间接寻址的一个前缀,其后可以是寄存器名,也可以是常数(绝对地址寻址*(,lk));,-用于算术指令集;,关于汇编指令中的立即数:,汇编指令中的立即数少有用,有也不需要加#前缀。,$表示当前,PC,值,,B$,是常用指令,汇编语言源程序格式,4注释区,注释区可以从任何一列开始,可以包含,ASCII,字符和空格。,如果从第一列开始,可以使用;或者*,否则使用;。,每行所以字符不可以超过200个,否则200个以后的自动截去。,
展开阅读全文