《电子技术应用》
您所在的位置:首页 > 嵌入式技术 > 业界动态 > TMS320C/F2xx系列DSP的目标文件格式

TMS320C/F2xx系列DSP的目标文件格式

2009-08-18
作者:朱春海 李玉忍

  摘  要: 对TI公司新的汇编器和链接器创建的目标文件所采用的一种格式——COFF目标文件格式的组成和产生过程作了详细的阐述。

  关键词: DSP技术  COFF文件格式

 

  近年来,数字信号处理器(DSPs)在信号处理及运动控制方面得到了日益广泛的应用。开发DSPs时不论使用汇编语言还是C语言,源程序都要经过编译(对C语言)生成目标文件,再由链接器把目标文件链接成可执行的COFF文件。TI公司新的汇编器和链接器创建的目标文件采用一种称为COFF(Common Object File Format)的目标文件格式。采用这种文件格式更有利于模块化编程,并且为管理代码段和目标系统存储器提供更强有力和更灵活的方法。

1  块的基本概念

  COFF文件格式鼓励程序员用汇编语言或高级语言编程时使用基于代码块和数据块的概念,而不是一条条命令或一个个数据,这就使得程序的可读性和可移植性大大增强。在COFF格式中,这种块称为section。TI公司新的汇编器和链接器提供了相关的命令来创建块和对块进行处理。

  块是目标文件中的最小单元,是最终在TMS320C/F2xx存储器映象中占据一段连续空间的代码或数据。目标文件中的每一个块都是相互独立的。通常COFF目标文件包含3个默认的块:(1).text块:包括可执行代码;(2).data块:包括已初始化的数据;(3).bss块:为没有初始化的数据保留空间。

  此外,汇编器和链接器允许程序员创建、命名、链接自定义的块,这些块与.text、.data、和.bss的使用类似。所有的块可分为二种基本类型,即已初始化的块和未初始化的块。已初始化的块包括已初始化的数据和程序代码,上面提到的.text块和.data块就属于这类块。另外,汇编器命令.sect和.asect所创建的块也属于这类块。未初始化的块为没有初始化的数据在存储器映象中保留空间,.bss块和由汇编器命令.usect所创建的块属于这一类。

  汇编器提供了将各种代码和数据段与相应块联系的命令。

2 块的汇编

  汇编器对块的处理功能主要是确定汇编语言程序的各部分属于哪个特定的块。汇编器用.text、.data、.sect、.asect、.bss、.usect命令完成对块的定位。其中,.text、.data、.sect和.asect命令建立已初始化的块,.bss和.usect命令则用来建立未初始化的块。如果程序中没有用任何命令对块进行操作,则汇编器将把所有的程序块或数据块统一汇编到.text块中。

2.1 汇编器对已初始化块的处理

  已初始化块包括已初始化的数据和程序代码。这部分块的内容存储在目标文件中。当程序下载时被下载到TMS320C/F2xx的存储器中。每个已初始化块可以独立地进行重定位,并且可以引用其他块中定义的变量。链接器可以自动解决块与块之间变量引用的问题。

  下面4个命令将代码或数据存放在一个块中,其命令格式如下:

  .text

  .data

  .sect “块名”

  .asect “块名”,地址

  在这些命令中,.text和.data命令建立的块名称就是.text和.data,而后二个命令建立的块是自定义的块。其中.asect建立的块具有绝对地址,一般不要使用。当汇编器遇到上述命令时,立即停止汇编当前块,且开始将随后的代码或数据汇编到当前命令所对应的块中。

2.2 汇编器对未初始化块的处理

  未初始化块在TMS320C/F2xx存储器中为没有初始化的数据保留空间,它们通常被分配到RAM中。程序在运行时利用这些空间创建和存储变量。

  汇编器用.bss和.usect命令建立未初始化块。其中,.bss命令在.bss块中保留空间,.usect命令在自定义的块中保留空间。它们的命令格式如下:

  .bss        变量,块大小

  变量.usect“块名”,块大小

  汇编器遇到.bss和.usect命令时并不结束当前块,只是暂时离开当前块而去创建一个新块。所以,.bss和.usect命令可以出现在一个已初始化块中的任何地方,而不影响已初始化块的内容。

2.3 汇编器对自定义块的处理

  自定义块是程序员自己建立的块,它与默认的.text、

  .data和.bss块的使用方法相同,而与默认块是分开汇编的。

  程序员可以用.usect、.sect和.asect命令建立自定义的块。其中,.usect建立的块用来在RAM中为变量保留空间,其用法类似于.bss块;.sect和.asect建立包括代码和数据的块,用法类似于.text块和.data块。.sect命令建立的块是可重定位的,.asect命令建立的块是具有绝对地址的块,是不能重定位的。它们的命令格式如下:

  变量.usect“块名”,块大小

  .sect “块名”

  .asect “块名”,地址

3  块的链接

  链接器对块的处理主要包括下面2个方面。首先,链接器将COFF目标文件中的块建立为程序块或数据块并以这些块作为输入块,链接器再把这些输入块组合起来以建立可执行的COFF输出模块。然后,链接器为输出块选择存储器地址。链接器提供Memory和Sections 2个命令来完成上述工作。其中,Memory命令定义目标系统的存储器分配,程序员可以通过指定存储器起始地址和长度来定义每一块存储器。Sections命令定义如何组合输入块以及在存储器何处存放输出块。若不用这二条命令,链接器就会采用默认的分配方法;若采用这二条命令,则需要在链接器命令文件(扩展名为.cmd)中确定。下面是一个TMS320F240链接命令文件的例子。

  

  

4 程序的重定位

  汇编器对目标文件中的每个块汇编时都假定其起始地址为0,所以每一块中的重定位符号都是相对于0地址而言的。当然,所有的块在存储器中并不都是以0地址起始,因此链接器用以下方法对每一个块进行重定位。首先,链接器把块分配到存储器中,从而使各个块都有自己的起始地址;然后调整符号值使之对应于新的块地址;最后通过调整重定位后符号的参考值来反映调整后的符号值。

  链接器利用重定位项来调整符号的参考值。汇编器在每次可重定位符号被参考时会建立一个重定位项,链接器则在符号被重定位后利用这个重定位项来修正参考值。

5 COFF目标文件的生成

  下面以C语言编写的源程序为例,给出如图1所示的COFF目标文件的生成框图。

 

  用户编写的C源程序经过C编译器的处理后,转化为具有相同功能的汇编语言代码。之后再作为独立的汇编源程序经过汇编处理产生COFF目标文件,其中包含上述的各类程序块或数据块。接下来,链接器以这些块作为输入将其组合起来,并参照具体的CMD文件,最终生成可执行的COFF文件。此外在链接过程中系统将自动访问目标文件库和运行库,以简化链接过程,缩短链接过程所需的时间。

6  结  论

  本文介绍了TI公司新的汇编器和链接器所采用的COFF目标文件格式及这种文件格式中的最小单元——块,讨论了汇编器和链接器对块的处理方法。COFF目标文件格式非常有利于模块化编程,使管理代码段和系统存储器更加方便和灵活,使程序具有更强的可读性和可移植性。
本站内容除特别声明的原创文章之外,转载内容只为传递更多信息,并不代表本网站赞同其观点。转载的所有的文章、图片、音/视频文件等资料的版权归版权所有权人所有。本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如涉及作品内容、版权和其它问题,请及时通过电子邮件或电话通知我们,以便迅速采取适当措施,避免给双方造成不必要的经济损失。联系电话:010-82306118;邮箱:aet@chinaaet.com。