第5章TMS320C54xDSP软件开发_第1页
第5章TMS320C54xDSP软件开发_第2页
第5章TMS320C54xDSP软件开发_第3页
第5章TMS320C54xDSP软件开发_第4页
第5章TMS320C54xDSP软件开发_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

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

文档简介

1、第第5章章 TMS320C54x软件开发软件开发n5.1 软件开发过程及开发工具软件开发过程及开发工具n5.2 公共目标文件格式公共目标文件格式n5.3 常用汇编伪指令常用汇编伪指令n5.4 链接器命令文件的编写与使用链接器命令文件的编写与使用n5.5 汇编语言程序编写方法汇编语言程序编写方法n5.6 TMS320C54x C语言编程语言编程n5.7 用用C语言和汇编语言混合编程语言和汇编语言混合编程5.1 软件开发过程及开发工具软件开发过程及开发工具1建立源程序建立源程序2C编译器(编译器(C Compiler)3汇编器(汇编器(Assembler)4连接器(连接器(Linker)5调试工具

2、调试工具6十六进制转换公用程序(十六进制转换公用程序(Hex Conversion Utility) 返回首页图5-1 TMS320C54x DSP软件开发流程表5-1 TMS320C54xV3.50版代码生成工具程序返回本节5.2 公共目标文件格式公共目标文件格式n5.2.1 COFF文件的基本单元文件的基本单元段段n5.2.2 汇编器对段的处理汇编器对段的处理n5.2.3 链接器对段的处理链接器对段的处理n5.2.4 重新定位重新定位n5.2.5 程序装入程序装入n5.2.6 COFF文件中的符号文件中的符号 返回首页5.2.1 COFF文件的基本单元文件的基本单元段段n段(段(secti

3、ons)是是COFF文件中最重要的概念。文件中最重要的概念。一个段就是最终在存储器映象中占据连续空间的一个段就是最终在存储器映象中占据连续空间的一个数据或代码块。目标文件中的每一个段都是一个数据或代码块。目标文件中的每一个段都是相互独立的。一般地,相互独立的。一般地,COFF目标文件包含目标文件包含3个缺个缺省的段:省的段:text段、段、data段、段、bss段。段。n段可以分为两大类,即已初始化段和未初始化段。段可以分为两大类,即已初始化段和未初始化段。如图如图5-2所示为目标文件中的段与目标系统中存储所示为目标文件中的段与目标系统中存储器的关系。器的关系。图5-2 目标文件中的段与目标存

4、储器的关系返回本节5.2.2 汇编器对段的处理汇编器对段的处理1未初始化段未初始化段n未初始化段主要用来在存储器中保留空间,通常将它们定未初始化段主要用来在存储器中保留空间,通常将它们定位到位到RAM中。这些段在目标文件中没有实际内容,只是中。这些段在目标文件中没有实际内容,只是保留空间而已。程序可以在运行时利用这些空间建立和存保留空间而已。程序可以在运行时利用这些空间建立和存储变量。未初始化段是通过使用储变量。未初始化段是通过使用.bss和和.usect汇编伪指令汇编伪指令建立的,两条伪指令的句法分别为:建立的,两条伪指令的句法分别为:.bss符号,字数符号,字数 符号符号.usect“段名

5、段名”,字数,字数2已初始化段已初始化段n已初始化段包含可执行代码或已初始化数据。这已初始化段包含可执行代码或已初始化数据。这些段的内容存储在目标文件中,加载程序时再放些段的内容存储在目标文件中,加载程序时再放到到TMS320C54X存储器中。三个用于建立初始化存储器中。三个用于建立初始化段的伪指令句法分别为:段的伪指令句法分别为: .text段起点段起点 .data段起点段起点 .sect“段名段名”,段起点,段起点3命名段命名段n命名段就是程序员自己定义的段,它与缺省命名段就是程序员自己定义的段,它与缺省的的.text、.data和和.bss段一样使用,但与缺省段分段一样使用,但与缺省段分

6、开汇编。开汇编。 data段不同的存储器中,将未初始化的段不同的存储器中,将未初始化的变量汇编到与变量汇编到与bss段不同的存储器中。产生命段不同的存储器中。产生命名段的伪指令为:名段的伪指令为: 符号符号.usect“段名段名”,字数,字数 .sect “段名段名”,段起点,段起点4子段子段n子段(子段(Subsections)是大段中的小段。链接器是大段中的小段。链接器可以像处理段一样处理子段。采用子段可以使存可以像处理段一样处理子段。采用子段可以使存储器图更加紧密。子段的命名句法为:储器图更加紧密。子段的命名句法为: 基段名:子段名基段名:子段名n子段也有两种,用子段也有两种,用.sec

7、t命令建立的是已初始化段,命令建立的是已初始化段,用用.usect命令建立的是未初始化段。命令建立的是未初始化段。5段程序计数器(段程序计数器(SPC)n汇编器为每个段安排一个独立的程序计数器,即汇编器为每个段安排一个独立的程序计数器,即段程序计数器(段程序计数器(SPC)。)。SPC表示一个程序代码表示一个程序代码段或数据段内的当前地址。开始时,汇编器将每段或数据段内的当前地址。开始时,汇编器将每个个SPC置置0,当汇编器将程序代码或数据加到一,当汇编器将程序代码或数据加到一个段内时,相应的个段内时,相应的SPC增加。如果汇编器再次遇增加。如果汇编器再次遇到相同段名的段,继续汇编至相应的段,

8、且相应到相同段名的段,继续汇编至相应的段,且相应的的SPC在先前的基础上继续增加。在先前的基础上继续增加。图5-3 例5-1产生的目标代码返回本节5.2.3 链接器对段的处理链接器对段的处理n链接器对段的处理有两个功能。首先,它将汇编链接器对段的处理有两个功能。首先,它将汇编器产生的器产生的COFF目标文件(目标文件(.obj文件)中的各种段文件)中的各种段作为输入段,当有多个文件进行链接时,它将输作为输入段,当有多个文件进行链接时,它将输入段组合起来,在可执行的入段组合起来,在可执行的COFF输出模块中建输出模块中建立各个输出段。其次,链接器为输出段选择存储立各个输出段。其次,链接器为输出段

9、选择存储器地址。器地址。n链接器有两个命令完成上述功能,即:链接器有两个命令完成上述功能,即:nMEMORY 命令命令定义目标系统的存储器配置定义目标系统的存储器配置图,包括对存储器各部分的命名,以及规定它们图,包括对存储器各部分的命名,以及规定它们的起始地址和长度。的起始地址和长度。nSECTIONS命令命令告诉链接器如何将输入段组告诉链接器如何将输入段组合成输出段,以及在存储器何处存放输出段。子合成输出段,以及在存储器何处存放输出段。子段可以用来更精确地编排段,可用链接器段可以用来更精确地编排段,可用链接器SECTIONS命令指定子段。命令指定子段。 图5-4 链接器默认的存储器分配返回本

10、节5.2.4 重新定位重新定位1链接时链接时重新定位重新定位n将各个段定位到存储器中,每个段都从合适的地将各个段定位到存储器中,每个段都从合适的地址开始。址开始。n将符号值调整到相对于新的段地址的数值。将符号值调整到相对于新的段地址的数值。n调整对重新定位后符号的引用。调整对重新定位后符号的引用。2运行时重新定位运行时重新定位n将代码装入存储器的一个地方,而运行在另一个将代码装入存储器的一个地方,而运行在另一个地方。利用地方。利用SECTIONS命令选项让链接器定位两命令选项让链接器定位两次。一些关键的执行代码必须装入在系统的次。一些关键的执行代码必须装入在系统的ROM中,但希望在较快的中,但

11、希望在较快的RAM中运行。中运行。n链接器提供了一个简单的处理该问题的方法。利链接器提供了一个简单的处理该问题的方法。利用用SECTIONS命令选项让链接器定位两次。第一命令选项让链接器定位两次。第一次使用装入关键字设置装入地址,再用运行关键次使用装入关键字设置装入地址,再用运行关键字设置运行地址。字设置运行地址。返回本节5.2.5 程序装入程序装入(1)硬件仿真器和)硬件仿真器和CCS集成开发环境,具有内部集成开发环境,具有内部的装入器,调用装入器的的装入器,调用装入器的LOAD命令即可装入可命令即可装入可执行程序。执行程序。(2)将代码固化在片外存储器中,采用)将代码固化在片外存储器中,采

12、用Hex转换工转换工具(具(Hex conversion utility),),例如例如Hex500将将可执行的可执行的COFF目标模块(目标模块(.out文件)转换成几文件)转换成几种其他目标格式文件,然后将转换后的文件用编种其他目标格式文件,然后将转换后的文件用编程器将代码写入程器将代码写入EPROM/Flash。 返回本节5.2.6 COFF文件中的符号文件中的符号nCOFF文件中有一个符号表,用于存储程序中的文件中有一个符号表,用于存储程序中的符号信息。符号信息。链链接器对符号重定位时使用该表,调接器对符号重定位时使用该表,调试工具也使用该表来提供符号调试。试工具也使用该表来提供符号调

13、试。n外部符号指在一个模块中定义,在另一个模块中外部符号指在一个模块中定义,在另一个模块中使用的符号。可使用使用的符号。可使用.def、.ref或或.global汇编伪汇编伪指令将符号定义为外部符号。指令将符号定义为外部符号。.def在当前模块中在当前模块中定义,可以在别的模块中使用的符号;定义,可以在别的模块中使用的符号;.ref在当在当前 模 块 中 引 用 , 但 在 别 的 模 块 中 定 义 的 符前 模 块 中 引 用 , 但 在 别 的 模 块 中 定 义 的 符号;号;.global可用于以上任何一种情况。可用于以上任何一种情况。返回本节5.3 常用汇编伪指令常用汇编伪指令返回

14、首页表5-2 常用的汇编伪指令1段定义伪指令段定义伪指令n为便于链接器将程序、数据分段定位于指定的(物理存在为便于链接器将程序、数据分段定位于指定的(物理存在的)存储器空间,并将不同的的)存储器空间,并将不同的obj文件链接起来。段的使文件链接起来。段的使用非常灵活,但常用以下约定:用非常灵活,但常用以下约定:n.text 此段存放程序代码。此段存放程序代码。n.data 此段存放初始化了的数据。此段存放初始化了的数据。n.bss 此段存入未初始化的变量。此段存入未初始化的变量。n.sect 名称名称 定义一个有名段,放初始化了的数据或程定义一个有名段,放初始化了的数据或程序代码。序代码。2条

15、件汇编伪指令条件汇编伪指令n.if、.elseif、.else、.endif伪指令告诉汇编器按照表达式伪指令告诉汇编器按照表达式的计算结果对代码块进行条件汇编。的计算结果对代码块进行条件汇编。n.if expression 标志条件块的开始,仅当条件为真标志条件块的开始,仅当条件为真(expression的值非的值非0即为真)时汇编代码。即为真)时汇编代码。n.elseif expression 标志若标志若.if条件为假,而条件为假,而.elseif条件条件为真时要汇编代码块。为真时要汇编代码块。n.else 标志若标志若.if条件为假时要汇编代码块。条件为假时要汇编代码块。n.endif

16、标志条件块的结束,并终止该条件代码块。标志条件块的结束,并终止该条件代码块。3引用其他文件和初始化常数伪指令引用其他文件和初始化常数伪指令n.include 文件名文件名 将指定文件复制到当前位置,其内将指定文件复制到当前位置,其内容可以是程序、数据、符号定义等。容可以是程序、数据、符号定义等。n.copy 文件名文件名 与与.include类似。类似。n.def 符号名符号名 在当前文件中定义一个符号,可以被其他在当前文件中定义一个符号,可以被其他文件使用。文件使用。n.ref 符号名符号名 在其他文件中定义,可以在本文件中使用在其他文件中定义,可以在本文件中使用的符号。的符号。n.glob

17、al 符号名符号名 其作用相当于其作用相当于.def、.ref效果之和。效果之和。n.mmregs 定义存储器映射寄存器的符号名,这样就可定义存储器映射寄存器的符号名,这样就可以用以用AR0、PMST等助记符替换实际的存储器地址。等助记符替换实际的存储器地址。n.float 数数1,数,数2 指定的各浮点数连续放置到存储器中指定的各浮点数连续放置到存储器中(从当前段指针开始)。(从当前段指针开始)。n.word 数数1,数,数2 指定的各数(十六进制)连续放置到指定的各数(十六进制)连续放置到存储器中。存储器中。n.space n 以位为单位,空出以位为单位,空出n位存储空间。位存储空间。n.

18、end 程序块结束。程序块结束。4宏定义和宏调用宏定义和宏调用nTMS320C54x汇编支持宏语言。如果程序中需要多次执汇编支持宏语言。如果程序中需要多次执行某段程序,可以把这段程序定义(宏定义)为一个宏,行某段程序,可以把这段程序定义(宏定义)为一个宏,然后在需要重复执行这段程序的地方调用这条宏。然后在需要重复执行这段程序的地方调用这条宏。n宏定义如下:宏定义如下:Macname .macroparameter 1,parameter n .mexit .endm 返回本节5.4 链接器命令文件的编写与使用链接器命令文件的编写与使用n5.4.1 MEMORY伪指令及其使用伪指令及其使用n5.

19、4.2 SECTIONS伪指令及其使用伪指令及其使用 返回首页5.4.1 MEMORY伪指令及其使用伪指令及其使用nMEMORY伪指令就是用来指定目标存储器的模型。伪指令就是用来指定目标存储器的模型。MEMORY伪指令的一般语法为:伪指令的一般语法为:n SECTIONS name : property ,property ,property . name : property ,property ,property . name : property ,property ,property . 返回本节5.4.2 SECTIONS伪指令及其使用伪指令及其使用nSECTIONS伪指令功能如下:

20、伪指令功能如下:n 说明如何将输入段组合成输出段。说明如何将输入段组合成输出段。n在可执行程序中定义输出段。在可执行程序中定义输出段。n指定输出段在存储器中存放的位置。指定输出段在存储器中存放的位置。n允许对输出段重新命名。允许对输出段重新命名。图5-5 例5-6中段的定位返回本节5.5 汇编语言程序编写方法汇编语言程序编写方法n5.5.1 汇编语言源程序格式汇编语言源程序格式n5.5.2 汇编语言中的常数和字符串汇编语言中的常数和字符串n5.5.3 汇编源程序中的符号汇编源程序中的符号n5.5.4 汇编源程序中的表达式汇编源程序中的表达式 返回首页5.5.1 汇编语言源程序格式汇编语言源程序

21、格式n助记符助记符指令一般包含指令一般包含4个部分,其一般组成形式个部分,其一般组成形式为:为:n标号标号: 助记符助记符 操作数操作数 ;注释;注释1标号区标号区n所有汇编指令和大多数汇编伪指令前面都可以带所有汇编指令和大多数汇编伪指令前面都可以带有标号,标号可以长达有标号,标号可以长达32个字符,由个字符,由AZ、az、09、_、和和$符号组成,且第一个字符不能是数符号组成,且第一个字符不能是数字,区分大小写。字,区分大小写。 2助记符区助记符区n助记符区不能从第一列开始,否则被认为是标号。助记符区不能从第一列开始,否则被认为是标号。3操作数区操作数区n操作数区是一个操作数列表,可以是常数

22、、符号或常数与操作数区是一个操作数列表,可以是常数、符号或常数与符号构成的表达式。操作数间需用符号构成的表达式。操作数间需用“,”号隔开。号隔开。4注释区注释区n注释区可以从任何一列开始,可以包含注释区可以从任何一列开始,可以包含ASCII字符和空格。字符和空格。 返回本节5.5.2 汇编语言中的常数和字符串汇编语言中的常数和字符串表5-3 COFF常数与字符串返回本节5.5.3 汇编源程序中的符号汇编源程序中的符号1标号标号2局部标号局部标号3符号常数符号常数4先定义的符号常数先定义的符号常数5替代符号替代符号表5-4 可以用在表达式中的运算符表5-5 带有绝对符号、可重定位符号的表达式返回

23、本节5.5.4 汇编源程序中的表达式汇编源程序中的表达式n表达式可以是常数、符号或由算术运算符结合的表达式可以是常数、符号或由算术运算符结合的常 数 和 符 号 。 表 达 式 值 的 有 效 范 围 为常 数 和 符 号 。 表 达 式 值 的 有 效 范 围 为 -3276832767。1运算符(运算符(表表5-4 所示)所示)2合格的表达式合格的表达式(表表5-5所示所示 )返回本节5.6 TMS320C54x C语言编程语言编程n5.6.1 存储器模式存储器模式n5.6.2 寄存器规则寄存器规则n5.6.3 函数调用规则函数调用规则n5.6.4 中断处理中断处理n5.6.5 表达式分析

24、表达式分析 返回首页5.6.1 存储器模式存储器模式1段段nC54x将存储器处理为程序存储器和数据存储器两将存储器处理为程序存储器和数据存储器两个线性块。程序存储器包含可执行代码;数据存个线性块。程序存储器包含可执行代码;数据存储器主要包含外部变量、静态变量和系统堆栈。储器主要包含外部变量、静态变量和系统堆栈。编译器的任务是产生可重定位的代码,允许链接编译器的任务是产生可重定位的代码,允许链接器将代码和数据定位进合适的存储空间。器将代码和数据定位进合适的存储空间。C编译编译器 对器 对 C 语 言 编 译 后 除 了 生 成语 言 编 译 后 除 了 生 成 3 个 基 本 段 ,个 基 本

25、段 ,即即. t e x t 、 . d a t a 、 . b s s外 , 还 生外 , 还 生成成.cinit、.const、.stack、.sysmem段段。2C/C+系统堆栈系统堆栈n.stack不同于不同于DSP汇编指令定义的堆栈。汇编指令定义的堆栈。DSP汇编程序中汇编程序中要将堆栈指针要将堆栈指针SP指向一块指向一块RAM,用于保存中断、调用时用于保存中断、调用时的返回地址,存放的返回地址,存放PUSH指令的压栈内容。指令的压栈内容。n.stack定义的系统堆栈实现的功能是保护函数的返回地址,定义的系统堆栈实现的功能是保护函数的返回地址,分配局部变量,在调用函数时用于传递参数,

26、保护临时结分配局部变量,在调用函数时用于传递参数,保护临时结果。果。n.stack定义的段大小(堆栈大小)可用链接器选项定义的段大小(堆栈大小)可用链接器选项-stack size设定,链接器还产生一个全局符号设定,链接器还产生一个全局符号_ _STACK_SIZE,并赋给它等于堆栈长度的值,以字为单位,缺省值为并赋给它等于堆栈长度的值,以字为单位,缺省值为1K。3存储器分配存储器分配(1)运行时间支持函数。)运行时间支持函数。 (2)动态存储器分配。)动态存储器分配。 (3)静态和全局变量的存储器分配。)静态和全局变量的存储器分配。(4)位域)位域/结构的对准。结构的对准。 返回本节5.6.

27、2 寄存器规则寄存器规则n寄存器规则明确了编译器如何使用寄存器以及在函数调用寄存器规则明确了编译器如何使用寄存器以及在函数调用过程中如何保护寄存器。过程中如何保护寄存器。(1)辅助寄存器)辅助寄存器 (2)堆栈指针)堆栈指针SP (3)ARP (4)在默认情况下,编译器总是假定)在默认情况下,编译器总是假定ST1中的中的OVM在硬件在硬件复位时被清复位时被清0。若在汇编代码中对。若在汇编代码中对OVM置位为置位为1,返回到,返回到C环境时必须复位。环境时必须复位。(5)寄存器变量)寄存器变量 返回本节5.6.3 函数调用规则函数调用规则(1)局部帧的产生)局部帧的产生 (2)参数传递)参数传递

28、 (3)函数的返回)函数的返回 返回本节5.6.4 中断处理中断处理(1)中断的使能和屏蔽必须由程序员自己来设置。)中断的使能和屏蔽必须由程序员自己来设置。 (2)中断程序没有参数传递,即使说明,也会被)中断程序没有参数传递,即使说明,也会被忽略忽略(3)中断处理程序不能被正常的)中断处理程序不能被正常的C程序调用。程序调用。(4)为了使中断程序与中断一致,在相应的中断)为了使中断程序与中断一致,在相应的中断矢量中必须放置一条转移指令,可以用矢量中必须放置一条转移指令,可以用.sect汇编汇编伪指令建立一个简单的跳转指令表来完成此项功伪指令建立一个简单的跳转指令表来完成此项功能。能。(5)在汇

29、编语言中,注意在符号名前面加上一个)在汇编语言中,注意在符号名前面加上一个下划线,例如下划线,例如c_int00记为记为_ c_int00。(6)中断程序使用的所有寄存器,包括状态寄存中断程序使用的所有寄存器,包括状态寄存器和程序中调用函数使用的寄存器都必须予以保器和程序中调用函数使用的寄存器都必须予以保护。护。(7)TMS320C54x C编译器将编译器将C语言进行了扩展,语言进行了扩展,中断可以利用中断可以利用interrupt关键字由关键字由C/C+函数直接函数直接处理。处理。返回本节5.6.5 表达式分析表达式分析n当当C程序中需要计算整型表达式时,必须注意以程序中需要计算整型表达式时

30、,必须注意以下几点:下几点:(1)算术上溢和下溢。)算术上溢和下溢。 (2)整除和取模。)整除和取模。 (3)C代码对代码对16位乘法结果高位乘法结果高16位的访问。位的访问。 返回本节5.7 用用C语言和汇编语言混合编程语言和汇编语言混合编程n5.7.1 独立的独立的C模块和汇编模块接口模块和汇编模块接口n5.7.2 从从C程序中访问汇编程序变量程序中访问汇编程序变量n5.7.3 在在C程序中直接嵌入汇编语句程序中直接嵌入汇编语句 返回首页5.7.1 独立的独立的C模块和汇编模块接口模块和汇编模块接口n在编写独立的汇编程序时,必须注意以下几点:在编写独立的汇编程序时,必须注意以下几点:(1)

31、不论是用)不论是用C语言编写的函数还是用汇编语言编语言编写的函数还是用汇编语言编写的函数,都必须遵循寄存器使用规则。写的函数,都必须遵循寄存器使用规则。(2)必须保护函数要用到的几个特定寄存器。)必须保护函数要用到的几个特定寄存器。 (3)中断程序必须保护所有用到的寄存器。)中断程序必须保护所有用到的寄存器。(4)从汇编程序调用)从汇编程序调用C函数时,第一个参数(最左函数时,第一个参数(最左边)必须放入累加器边)必须放入累加器A中,剩下的参数按自右向中,剩下的参数按自右向左的顺序压入堆栈。左的顺序压入堆栈。(5)调用)调用C函数时,注意函数时,注意C函数只保护了几个特定的函数只保护了几个特定的寄存器,而其他是可以自由使用的。寄存器,而其他是可以自由使用的。(6)长整型和浮点数在存储器中存放的顺序是低位)长整型和浮点数在存储器中存放的顺序是低位

温馨提示

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

评论

0/150

提交评论