版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章DSP软件程序设计基础
5.1DSP软件开发的一般过程
5.2DSP程序的编译和链接原理5.3DSP应用程序的构成5.4DSP软件调试环境简介5.5DSP程序设计和调试实例
5.1DSP软件开发的一般过程一个基于DSP技术的应用系统的开发过程总体上可以分为硬件平台开发和软件程序设计两个环节。与一般计算机应用系统的开发一样,系统硬件和软件是彼此关联、密不可分的,硬件开发过程和软件开发过程是相互关联的。在硬件开发中要考虑系统功能和软件的运行要求,在软件设计中也要考虑系统硬件平台条件,因此不能孤立地考虑软件开发问题。图5-1所示为基于DSP技术的应用系统开发的一般过程。
图5-1基于DSP技术的应用系统开发的一般过程
软件系统设计的第一步是对系统实现的功能和要求进行全面的分析,根据系统功能和要求,结合硬件平台的性能和功能,确定软件方案。以各种图表的形式给出软件的方案,包括软件的功能模块构成、组织关系及各模块之间的调用关系。
第二步是根据各功能模块的功能和性能要求选择各模块实现的算法。算法的选择是模块功能设计的关键环节,不同算法的实现性能和效率有着根本的不同,算法的选择直接从根本上制约了程序的性能。初步选择了算法之后,还需要对算法进行仿真,以确定算法的执行结果是否正确,并对算法的执行时间进行估计,以确定能否达到系统的实时性要求。完成各功能模块的算法仿真后,即可进行各模块的程序编写。
第三步是根据确定的算法编写程序。图5-2给出了DSP系统程序编写和调试的一般过程。程序编写首先要选择适当的编程语言。2000系列DSP和5000系列DSP的程序设计可以采用汇编语言,也可以采用C语言,还支持两种语言的混合编程。一般来讲,利用汇编语言编写程序可以对系统硬件资源进行更好的控制和安排,这样容易实现更高的程序执行效率;而利用C语言编写程序,可以实现更短的软件开发周期,程序也具有很好的移植性。因此一般的产品开发中选择C语言编程,这样可以有效地缩短开发周期,但对于需要反复循环运行的核心算法则采用汇编语言编程,以获得更高的程序性能。
图5-2DSP系统程序编写和调试的一般过程
由两种语言编写源程序的编译过程略有不同,C语言编写的源程序首先需要经过C编译器编译为汇编程序,后面的编译流程和汇编语言的处理过程相同。汇编源程序需要分别经过汇编器和链接器进行汇编和链接,生成目标文件与可执行文件,链接器生成的可执行文件就可以加载到DSP系统中执行了。具体的汇编和链接过程将会在5.2节中进行较为详细的介绍。
第四步是在软件环境下对程序进行调试。该步骤中首先利用相应的调试软件和仿真器在PC机上对程序进行调试,主要完成对程序中的语法错误和计算错误进行调试;然后将程序加载到硬件开发板中对程序进行调试,主要完成对程序执行的实时性问题的调试。
第五步是将经过调试的程序加载到目标板上进行软/硬件的联合调试。第四步已经解决了程序中的软件问题,本步调试主要解决软/硬件之间的协调问题。
5.2DSP程序的编译和链接原理
5.2.1公共目标文件格式和段的概念公共目标文件格式(COFF)是DSP系统中采用的一种文件格式,其程序组织的最小单位叫做段,段就是最终占据存储器映象中一段连续地址空间的一组代码或数据。公共目标文件格式的每一段都是相对独立的。公共目标文件一般包括以下3个默认段。
(1).textsection:文本段或代码段,由程序代码和文本组成。
(2).datasection:数据段,包括初始化的数据。
(3).bsssection:保留空间段,为未初始化变量保留空间。
根据段的作用不同,段可被分为初始化段(Initializedsection)和未初始化段(Uninitializedsection)两种。
(1)Initializedsection:初始化段,用于存放数据和代码。
(2)Uninitializedsection:未初始化段,主要任务是在存储器中为未初始化的数据(主要指变量)保存空间。
从这个意义上讲,文本段和数据段属于初始化段,而保留空间段则属于未初始化段。
除此以外,汇编器和链接器还允许用户自己定义段,用户可以自己命名这些段,它们都可以和
.text、.data、.bss段一样被使用。自定义段也分为初始化段和未初始化段两种基本类型。
汇编器在汇编过程中创建这些段,并根据程序中的伪指令将段组织成如图5-3所示的目标文件。
链接器的功能之一就是把段重新定位在目标存储器上,这一功能称为重定位。一般的DSP系统包括多种类型的存储器,使用段可以帮助用户有效地使用目标存储器。段都是相对独立的,系统允许用户对段的起始位置进行任意的重定位,这样用户可以将任何段放入到目标存储器中的任何位置,这也是公共目标文件格式(COFF)中应用段作为程序组织单位的重要意义。
图5-3公共目标文件格式及其在存储空间中的定位
5.2.2汇编器对段的处理
汇编语言的源程序利用汇编伪指令告诉汇编器如何将程序中的各部分组织为不同的段,汇编器支持以下功能的伪指令。
.text:文本段。
.data:数据段。
.bss:保留空间段。
.sect:用户自定义的初始化段。
.usect:用户自定义未初始化段。
.asect:绝对地址自定义段。
1.未初始化段
未初始化段的作用是在存储器中保留一定数量的空间,它们经常定位到RAM中。这些段在目标文件中没有实际的内容,仅仅能保留空间,程序在运行时可以使用这些空间去创建和储存变量。
系统默认的建立未初始化段使用的是
.bss伪指令,.bss伪指令在
.bss段中保留空间,当调用
.bss伪指令时,汇编器就会在特定的命名段中保留更多的空间。
.bss伪指令的语法结构为
.bsssymbol,sizeinwords[,[blockingflag][,alignmentflag]]
其中:
symbol:地址符号,指向此次被.bss和.usect指令调用所保留的首字。这个符号与保留空间所使用的变量名相对应,其他段可以引用该符号,也可将它声明为全局变量。
sizeinwords:空间大小,应为一个绝对表达式,用以表示该保留空间的大小(以字为单位)。
blockingflag:块标志,这是一个可选参数,当该参数为一个大于0的值时,汇编器会将sizeinwords所指定的空间大小连续存放,只要指定的保留空间大小不超过一个数据页的长度,分配的空间就不会跨过页的边界。
alignmentflag:对齐标志,这是一个可选参数,当该参数为一个大于0的值时,汇编器会在定位该段时将其他地址对齐到长字的边界上。
2.初始化段
初始化段包括可执行代码或已初始化的数据。初始化段在声明时已经确定内容并存储在目标文件中,在程序装载入DSP时就存储于相应的存储器中。每一个初始化段都可以单独地重定位并引用其他段内定义的符号,链接器将自动识别这些段间的引用。
DSP系统中有两个默认的初始化段伪指令:.text和.data,它们分别将源程序中的指令或数据汇编进文本段和数据段。
当汇编器遇到这些伪指令时,停止将指令或数据当前段汇编到原来的段,而将当前段改为伪指令对应的段,并继续将后续的指令或数据汇编到新的段中,直至再遇到另外一个初始化段伪指令。
段是通过累加的过程来建立的。例如,当汇编器第一次遇到
.data伪指令时,.data段为空,在.data伪指令之后的指令和数据将被汇编进.data段中,直至再遇到另外一个初始化段伪指令(如.text伪指令)。如果汇编器在遇到其他伪指令并将当前段转为其他段进行汇编后再次遇到.data段,则当前段又转为.data段,并且.data段中已经有部分内容,此时汇编器继续将再次遇见的.data伪指令后的指令或数据汇编进.data段。这样当整个汇编源程序汇编完成后,就可以形成单个的可被连续存放的.data段。
3.自定义段
自定义段(namedsections)是由用户自己定义的段,它的使用方法与系统默认的
.text、
.data和.bss段完全相同。自定义段允许用户自己定义段,以实现对汇编源程序中的部分代码或数据进行单独存储或进行其他操作。例如,重复地使用.text伪指令会将汇编源程序中不同地方的代码汇编到一个单一的.text段中,在程序链接时就会被连续地存放在一起。若用户因为某种原因希望将一部分代码不与.text段一起存放,而单独地存放在存储器中,则用户就可以自己定义一个自定义段并将相应的代码分配到该段中,这样就可以在链接时对该段进行独立的操作。同理,用户也可以定义类似于.data和.bss段的自定义段。
这样,自定义段也被分为初始化的自定义段和未初始化的自定义段,分别用.sect和.usect来定义。.sect指令用于定义初始化段,经过定义初始化段,用户就可以指定汇编器将相应的代码或数据汇编于其中,其用法类似于系统默认的.text和.data伪指令;伪指令.usect指令在用户定义的未初始化命名段中保留空间,其用法类似于系统默认的.bss伪指令。具体语法如下所示:
.sect"sectionname"
symbol.usect"sectionname",sizeinwords[,[blockingflag][,alignmentflag]]其中:
sectionname:段名,在用户自定义保留空间段时段指定的名字。
symbol:地址符号,指向此次被.bss和.usect指令调用所保留的首字。这个符号与保留空间所使用的变量名相对应,其他段可以引用该符号,也可将它声明为全局变量。
sizeinwords:空间大小,应为一个绝对表达式,用以表示该保留空间的大小(以字为单位)。
blockingflag:块标志,这是一个可选参数,当该参数为一个大于0的值时,汇编器会将sizeinwords所指定的空间大小连续存放,只要指定的保留空间大小不超过一个数据页的长度,分配的空间就不会跨过页的边界。
aligmentflag:对齐标志,这是一个可选参数,当该参数为一个大于0的值时,汇编器会在定位该段时将其地址对齐到长字的边界上。
另外,DSP汇编系统中还有一个用于初始化段定义的伪指令,即.asect指令,但它的应用已经越来越少了。
4.段程序计数器
汇编器为每个段都配置了一个独立的程序计数器,称为段程序计数器,简称为SPC。段中的SPC表示每行代码或者数据汇编后在相应段内的地址。在每个段汇编开始时,汇编器将每个段的SPC都设置为0,当汇编器把代码或数据汇编进某个段时,它就将该段的SPC增加相应的值。如果将数据或代码汇编到一个SPC不等于0的段(即当前段内已经有数据或地址),则汇编器会记住该段SPC原来的值并在此基础上继续把SPC增加相应的值。在汇编时,汇编器将每个段的首地址均设为0,而每个段的SPC只记录指令或数据在段内的相对地址(即偏移地址)。在完成汇编进入链接阶段时,链接器按照用户指定的存储方案为每个段给定在存储空间中的首地址。当首地址确定后,由每条指令或数据的SPC值(段内地址)和每个段在存储空间中的首地址就可以惟一地确定每一条指令或数据的物理地址。
5.段伪指令的应用实例
下面通过一个简单的汇编语言编写的源程序说明段伪指令在汇编建立公共目标文件格式时的作用。该实例通过在不用段之间的来回交换,利用段伪指令逐步建立各目标段。用户可以使用段伪指令汇编定义一个新段并将代码或数据汇编于其中,或者继续汇编代码或数据到已包含内容的段中。以下为该实例的程序清单,在程序清单中,第一列为源程序的行号,第二列为段程序计数器(SPC)的值,第三列为目标代码,第四列为程序源代码。
在上述汇编语言程序中,我们利用段伪指令共创建了5个段。
.text:包含了10个16位字的目标代码。
.data:包含了7个16位字的目标代码。
vectors:是在程序中利用.sect定义的初始化的自定义段,其中包含了2个16位字初始化的目标代码。
.bss:为.bss段保留了10个16位字的存储器空间。
newvars:为在程序中利用.usect定义的未初始化的自定义段,它保留了8个16位字的存储器空间。
图5-4所示为实例中汇编器创建的5个段,其中3个为初始化段,2个为未初始化段。
图5-4实例中汇编器创建的5个段
5.2.3链接器对段的处理
链接器是DSP程序编译过程中的重要工具,它与段相关的功能主要有两个:段的链接和段的定位。段的链接是指链接器要把汇编器生成的公共目标文件(.OBJ文件)中的段进行链接以生成可执行文件,链接器输出的可执行文件的扩展名为.OUT。当汇编器生成的目标文件有多个时,链接器也需要把它们中相同的段进行链接。段的定位是指链接器需要根据用户的要求为各输出段在存储空间中选择存储地址,即为.OUT文件中的每个段确定段首地址,当每个段的首地址确定后,段内各代码(即符号的地址)也就随即确定了。
在实现段的定位时,用户需要告诉链接器各段在系统地址空间中定位的方案,这需要用到两个链接器的段伪指令:MEMORY和SECTION,它们也是编写链接命令文件的主要指令,其功能如下所述。
(1)MEMORY:存储器伪指令。该指令用来定义目标系统的存储器空间,利用它可以将存储器空间分为多个区域,并指定各区域的起始位置和区域长度。
(2)SECTION:段伪指令。该指令告诉链接器如何将输入段组合成输出段,以及如何在存储器空间中定位输出段(即由用户指定输出段的存储地址)。
在DSP程序系统中,用户可以通过链接命令文件(.cmd)来指定以上信息。
图5-5给出了一个链接器对汇编器输出的目标文件的处理过程。在图5-5中,汇编器有两个输出目标文件,分别为file1和file2。这两个文件分别包含了系统默认的
.text、.data和
.bss段,此外还包含了用户自定义段。链接器对这两个目标文件分别进行段的链接和段的定位两个方面的处理。在段的链接方面,链接器分别将两个输入目标文件的同名段链接在一起,组成新的段,并以此形成可执行文件。如图5-5所示,链接器将file1的.text段和file2的.text段组合形成一个新的.text段。链接器对两个文件的.data段和.bss段也进行了同样的处理,最后对自定义段进行类似处理后放在上述段的后面。在段的定位方面,链接器按照用户指定的存储空间分配方案对链接后的各段进行定位,即确定各段的段首地址。用户可通过链接命令文件(.cmd)用MEMORY和SECTION伪指令来指导链接器进行存储地址空间的划分和段的定位。
图5-5链接器对目标文件的处理过程
5.2.4程序的定位和加载
1.程序的定位
1)链接器对程序的定位
在程序链接之前,程序中各段只有段程序计数器(SPC)确定的段内地址,段首均没有定位。链接器在处理每一个段时均假设段首地址为0,链接器通过以下操作来重新定位段(即确定段的首地址):
(1)将各段在存储器空间中进行分配,为各段确定段首地址;
(2)将符号变量调整到对应的新的地址;
(3)将程序中的引用调整到对应的新的地址。
2)程序运行时的定位
在DSP的应用系统中经常会遇到这样的应用要求,即需要将代码加载到存储器的某个地址区域,而在另外一个地址区域运行。例如,在以ROM为程序存储器的系统中,程序在加载时被定位在ROM所分配的地址空间中,但为了缩短程序的取指时间,获得更高的程序运行效率,在运行时将程序定位到DARAM所分配的地址空间中。
链接器提供了实现这种应用要求的简单方法。用户可以通过SECTIONS伪指令来为相应的段指定两个段首地址,其中一个为程序加载时使用的段首地址,另外一个为程序运行时的段首地址。这样在不同的阶段程序处于不同的存储空间,从而方便地满足了程序的存储安全和运行的高效率要求。
2.程序的加载
链接器产生可执行的COFF程序模块。可执行的目标文件和作为链接器输入的目标文件具有同样的COFF格式,只是在可执行目标文件中对段进行了组合并在目标存储器中进行了重定位。
为了运行程序,可执行目标模块中的代码和数据必须传送或加载到目标系统存储器中。有几种方法可以用于加载程序,用户可以根据实际条件和系统要求来选择具体的加载方法。下面给出了两种常用的方法:
(1)DSP系列的调试工具包括软件模拟器、XDS仿真器以及集成化的开发系统CCS,它们都具有内置的加载器。这些工具都有调用加载器的LOAD指令,加载器读取可执行文件并将程序复制到目标系统的存储器中以完成程序的加载过程。
(2)使用Hex转换工具,例如使用dephex可将可执行的公共目标文件模块转换成其他几种目标格式文件。然后,用户可以利用EPROM编程器把转换的文件烧写进EPROM或Flash中。
5.2.5程序文件中的符号
COFF文件中包含一个符号表,用于存储程序中的符号信息。链接器在对程序进行重新定位时要使用该符号表,调用程序时也要用到该符号表。
我们把在一个模块中被定义而在另一个模块中被引用的符号称为外部符号。用户可以通过使用.def、.ref或.global伪指令来声明某个符号为外部符号。
(1).def伪指令:在当前模块中定义而在另一个模块中被引用的符号。
(2).ref伪指令:在当前模块中引用而在另一个模块中定义的符号。
(3).global伪指令:在当前模块中定义而在另一个模块中被引用或在当前模块中引用而在另一个模块中定义的符号。
下面的例子说明了这些伪指令的应用。
x: ADD #56h,A ;Definex
B y ;Referencey
.def x ;DEFofx
.ref y ;REFofy
对x的.def定义说明x是在本模块中定义而在其他模块中引用的外部符号,对y的.ref定义说明y是未在本模块中定义而在另一个模块中定义的符号。
汇编器把x和y都放在目标文件的符号表中,当该文件和其他文件链接时,x的入口定义了其他文件不能识别的符号x,y的入口使链接器搜索其他文件的符号表,以找到y的定义。
链接器必须把所有的符号引用和相应的符号定义一一匹配。如果链接器不能找到某个符号的定义,那么它将提示有关未定义符号的出错信息,在这种情况下链接器将不能生成可执行的目标模块。
5.3DSP应用程序的构成
5.3.1CCS中DSP应用程序的构成在CCS集成化开发环境中,DSP的应用程序是以项目(Project)为单位进行管理的,在CCS中对程序的编译、链接等操作一般也是以项目为单位进行的。我们把一个DSP应用系统(或一个功能模块)的相关文件放在一个项目中进行管理,并最终生成一个可执行文件加载到目标系统中去执行。
在CCS中,一个项目主要由四种文件来构成,分别为源程序、头文件、库文件和链接命令文件。其中,源程序包括由汇编语言或C语言编写的源程序和由汇编语言编写的中断向量文件,这部分文件是DSP程序系统的核心,体现了系统的主要功能和任务;头文件是源程序编译过程中的说明文件,主要完成源程序中一些符号常量和数据结构的定义,包括源程序中要用到的函数及DSP的主要寄存器的定义;库文件是源程序编译过程中的支持文件,TI公司针对不同的DSP产品系列提供了不同的库文件供用户调用;链接命令文件是源程序链接过程中要用到的文件,该文件通知链接器目标系统地址空间的分配方案和链接后各段的定位方案。
以上文件中库文件一般是由TI公司提供的,用户可以直接调用,其他文件一般需要用户根据系统要求自己编写。这些文件的核心是源程序,用户应在对系统功能、系统要求及硬件平台条件进行充分分析的基础上选择汇编语言或C语言进行编写。若要编写汇编语言的源程序,则用户除需要对DSP的指令集有全面的了解外,还需要充分掌握DSP的硬件结构和原理,包括DSP的程序控制原理。这些内容本书前面的章节已经进行了较为详细的介绍,具体指令集中每条指令的语法和用法,读者可参考TI公司的相关说明书。
5.3.2链接命令文件的编写
1.存储器伪指令MEMORY
为了实现链接后各段在存储空间中的定位,充分利用系统中的存储器资源,需要对存储空间进行配置。MEMORY伪指令用来定义目标系统的存储器空间,利用它可以将存储器空间分为多个区域,并指定各区域的起始位置和区域长度。
MEMORY伪指令在命令文件中的书写方式为:以大写的MEMORY开始,然后用大括号给出关于存储空间分配的说明。该指令将所有使能的存储空间分为一系列存储区域,每个区域给出起始地址和长度,这样就确定了存储空间的分配方案。
MEMORY伪指令的一般语法如下:
MEMORY
{
PAGE0:name1[(attr)]:origin=constant,length=constant;
…
PAGEn:namen[(attr)]:origin=constant,length=constant;
}其中:
PAGE:存储空间的页的划分,每一个PAGE页代表一个完全独立的地址空间。页号n最大可以达到255,但应用中将整个存储空间分为两页:PAGE0为程序存储器页,PAGE1为数据存储器页。每个PAGE页上可以划分多个存储区域。
name:划分的存储器页的命名。这个名字只用来标记每个存储空间区域,本身并没有特殊的含义,
原则上用户可以为定义的存储区域指定任意的满足命名规则的名字。不同的PAGE页上划分的存储区域可以取相同的名字,但在同一PAGE页上的区域名不能相同。
attr:存储区域属性参数。这是一个可选的参数项,它规定了MEMORY伪指令定义的每个存储区域的读/写属性。其属性一般分为R、W、X、I共4种。其中,R表示该存储区域可读;W表示该存储区域可写;X表示该存储区域可以加载可执行的代码;I表示该存储区域可以进行初始化。如果用户在利用MEMORY伪指令时对某个存储器区域不指定该参数,则系统默认该区域同时具有上述的4个属性。
origin:划分的存储区域的起始地址,用origin、org或o表示均可。这个值默认用16位的二进制常数来表示。
length:划分的存储区域的长度,用length、len或l表示均可。这个值默认用16位的二进制常数来表示。在确定了存储区域划分的起始地址和长度后就可以惟一地确定该区域的范围。
以下给出一个MEMORY伪指令的简单例子:
MEMORY
{
PAGE0:ROM: origin=0h,length=1000h;
PAGE1:B2:origin=60h,length=20h;
B0B1:
origin=200h,length=200h;
}上述MEMORY伪指令的执行结果是:系统的程序存储空间和数据存储空间实现了如图5-6所示的划分。
图5-6MEMORY伪指令对存储空间的划分结果
2.段伪指令SECTION
在链接命令文件中,利用MEMORY伪指令实现对存储空间的划分后就可以利用SECTION伪指令来通知链接器如何对多个目标文件中的段进行链接,并如何定位链接后的各段。
SECTION伪指令在命令文件中的书写方式为:以大写的SECTION开始,然后用大括号给出关于输出段说明的语句。每一个输出段的说明都从段名开始,段名后是一行说明段的内容和如何给段分配存储空间的属性参数。
SECTION伪指令的一般语法如下:
SECTION
{
name:[property,property,property,...]
name:[property,property,property,...]
name:[property,property,property,...]
}其中,name为需要在SECTION伪指令中进行定位的段名,其后是说明段的内容和如何给段分配存储空间的属性参数。这些参数主要包括如下几个:
Loadallocation:段加载地址。用于指定将该段加载到存储空间的什么地址,其语法为Load=allocation
或 allocation
或
>allocation其中,allocation是关于输出段地址的说明。例如,
.text:load=0x1000 ;将.text输出段定位为以0x1000为起始地址的存储区域
.text:load>ROM ;将.text输出段定位到名为ROM的存储区域
.text:align=0x80 ;将.text输出段定位到与0x80对齐的存储区域
Runallocation:段运行地址。用于指定将该段在存储空间的什么地址开始运行,其语法与Loadallocation的语法相同。链接器可以为段指定不同的加载地址和运行地址。
Inputsections:输入段。它用来指定由输入目标文件中的哪些段组成当前的输出段。
Sectiontype:段的类型。它是输出段定义特殊形式的标志。
Fillvalue:段的初始化值。在段初始化时为段指定一个初始的填充值。其语法为Fill=value。其中,value为指定的数值。
下面给出一个SECTION伪指令的简单例子:
SECTION
{
.text: load=ROM
.const: load=ROMrun=RAM
.bss: load=RAM
vectors: load=0h
{
t1.obj(.intvec1)
t2.obj(.intvec2)
}
.data: align=16
}上例中通过SECTION伪指令定义了5个输出段,分别如下:
.text段是由输入的目标文件的.text段组合而成的,程序加载和运行的地址均被定位在名为ROM的存储区域中。
.const段由输入的目标文件的.const段组合而成,该段加载地址定位于名为ROM的存储区域中,而运行地址定位于名为RAM的存储区域中。
.bss段由输入的目标文件的.bss段组合而成,在存储空间中定位于名为RAM的存储区域中。
vectors段由输入的目标文件t1的.intvec1段和目标文件t2的.intvec2段组合而成。
.data段由输入的目标文件的.data段组合而成,该链接命令文件允许链接器将该段定位于存储空间的任何区域,但必须对齐16位字的边界。
图5-7SECTION伪指令定义的段在存储空间中的定位
3.链接命令文件实例
上述内容介绍了链接命令文件中两个重要的伪指令的用法及示例,这两个伪指令的参数较多,但在许多实际工程项目中编写链接命令文件时,许多参数是很少用到的,因而在实际项目应用中编写链接命令文件是比较简单的。
在链接命令文件中,除MEMORY和SECTION两个伪指令外,还可以指定输入的目标文件和输出的可执行文件。输入文件的文件名在链接命令文件的首行直接列出,输出文件名用-o参数来引出。
下面给出了一个典型的TMS320LF240xA系列DSP的链接命令文件的编写实例,以供读者参考使用。
5.3.3中断向量文件的编写
2000系列DSP的中断向量文件的结构与5000系列DSP的中断向量文件的结构基本相同,但2000系列DSP的中断系统相对来讲比较复杂,掌握好2000系列DSP的中断向量文件的编写,再编写5000系列的向量文件也就相对比较容易了。因此本节以2000系列DSP为例介绍中断向量文件的编写。
前面章节在介绍2000系列DSP的中断系统时已经说明,由于TMS320LF240xA系列DSP的中断系统在硬件上是一种两级中断管理结构,因此DSP的软件系统在中断服务程序上也相应地采用了两级中断服务程序,分别为全局中断服务程序(GISR)和专用中断服务程序(SISR)。
全局中断服务程序(GISR)是针对CPU直接响应的6个中断源的中断服务程序(ISR),INT1~INT6中每个中断均对应一个GISR,因此DSP系统中应具有6个GISR。GISR的主要功能有两点:一是保存CPU状态和原程序执行的上下文;二是从外设中断向量寄存器(PIVR)中读取与CPU相应中断对应的外设中断向量(PIV),并由PIV的值确定专用中断服务程序(SISR)的入口地址,控制CPU分支到SISR。
专用中断服务程序(SISR)是处理外设中断的具体程序,一般系统中用到的外设中断都具有自己的SISR,根据外设中断所需完成的任务不同,SISR的具体内容也不相同。一般在完成了特定的处理任务后,SISR应通过指令语句将外设寄存器(PR)中的中断标志位(IF)清0,并将CPU状态寄存器ST0的INTM位清0,以解除对所有的可屏蔽中断的禁止。
为了保持中断系统的完整性,保证在发生意外错误时系统以可以控制的方式正常运行,DSP在中断系统中引入了假中断向量。所谓假中断向量,是指在中断系统中人为设置的一种中断,其目的是当中断系统因为某种错误在CPU响应中断后,不能正确获得中断向量值时调用假中断服务程序,以使系统退出中断响应,恢复到正常的工作状态。具体来说,当一个中断被CPU响应后,CPU将从外设中断扩展(PIE)的外设中断向量寄存器(PIVR)中读取PIV的值,用以确定SISR的入口地址,此时若因某种错误使PIE未将中断的PIV值加载到PIVR中,则CPU读出的将是假中断的PIV值,即0000h。用户可以在假中断服务程序中使系统退出本次中断响应,以避免系统因错误的PIV值而发生程序执行失控。
因此,用户在编写中断系统的程序时,应该给出3种文件:中断向量表定义文件、全局中断服务程序(GISR)和专用中断服务程序(SISR)。其中,GISR主要用来保存CPU状态和原程序执行的上下文,确定外设中断向量(PIV)及专用中断服务程序(SISR)的入口地址,并控制CPU分支到SISR;SISR主要完成外设中断的具体处理任务,用户需根据外设和应用系统的功能需要来具体确定,除此之外,SISR一般还需完成外设寄存器(PR)的中断标志位(IF)清0和将CPU状态寄存器ST0的INTM位清0等操作。
中断向量表定义文件采用汇编语言编写,对于同一DSP平台其格式和内容基本相同,下面给出一个基于TMS320LF240xA系列DSP的应用系统中断向量表定义文件的实例,以供读者参考使用。
5.3.4TMS320LF240xA系列DSP的头文件
头文件是DSP应用系统软件的重要组成部分,它是源程序编译过程中的说明文件,主要完成源程序中一些符号常量和数据结构的定义,包括源程序中要用到的函数及DSP的主要寄存器的定义。关于符号常量和数据结构的定义可以在源程序中进行,但对在多个程序中都要引用的符号,放在头文件中定义可以方便用户编程,也便于在程序调试和运行中修改符号定义,因此用户可以根据源程序的需要进行编写。在DSP应用系统的编程中经常要对DSP系统中的寄存器进行访问,若根据寄存器地址访问寄存器,则不但会增加编程的工作量,同时也会降低程序的可读性。因此可以在头文件中对所选用DSP中的寄存器进行定义,这样不但便于编写程序,而且也会提高程序的可读性。当然,不同系列DSP的寄存器的定义和地址可能不同,对不同系列DSP的应用软件应该给出不同的寄存器定义文件。
下面给出了一个基于TMS320LF240xA系列DSP的寄存器定义头文件的实例,该文件对LF2407的处理器核心的寄存器、片上外设的相关寄存器中常用的存储空间和数据页均进行了定义,用户还可以根据实际系统的需要在文件中加入其他常量的定义。以下是该文件的程序清单,供读者参考使用。
5.4DSP软件调试环境简介
5.4.1CCS的主要特征
CCS代码调制器是一种集成化开发环境(IDE),它是一种针对标准TMS320调试接口的交互式调试工具,其界面如图5-8所示。CCS为用户提供了环境设置、源文件编辑、程序调试、跟踪和分析等工具,用户可以在一个软件环境下完成编辑、编译、链接、调试和数据分析等工作。CCS还提供了丰富且强有力的调试手段来提高程序调试的效率和精度。它采用Windows风格界面,操作简单直观,极大地方便了DSP程序的设计与开发。
图5-8CCS软件界面
图5-9利用CCS开发应用程序的流程
CCS具有调试器的主要特性,除此之外还有以下特性:
(1)支持多DSP调试;
(2)断点工具,包括硬件断点、数据空间读/写断点、条件断点等;
(3)探针工具(probepoints),可用于算法仿真,数据监视等;
(4)分析工具(profilepoits),可用于评估代码执行的时间和指令数;
(5)数据的图形显示工具,可绘制时域/频域波形、眼图、星座图、图像等,并可自动刷新;
(6)支持RTDX(RealTimeDataeXchange)技术,利用该技术可在不中断目标系统运行的情况下,实现DSP与其他应用程序(OLE)的实时数据交换;
(7)提供DSP/BIOS工具,利用该工具可增强对代码的实时分析能力,如分析代码执行的效率、调度程序执行的优先级,方便管理或使用系统资源(代码/数据存储空间、中断服务程序的调用、定时器的使用等),从而降低对开发人员对硬件资源熟悉程度的要求。
5.4.2CCS的基本操作
1.创建一个新的项目工程
工程项目的信息储存在一个单一的工程文件(*.pjt)中。创建一个新的项目工程有如下步骤。
(1)打开新建窗口。从工程菜单中选择New选项,弹出工程创建窗口,界面如图5-10所示。
图5-10CCS中建立新项目的界面
(2)输入工程名。在工程名区域中输入工程名字,每个工程必须有惟一的名字。
(3)选择文件夹。在Location区域选择一个文件夹来储存所创建的工程文件,一般将不同的工程储存于不同的文件夹中。
(4)选择工程类型。在工程类型区域,从下拉菜单选项中选择工程的类型,可以建立两种工程类型:可执行文件(*.out)或库文件(*.lib)。可执行文件类型说明将要创建的工程输出一个可执行文件;库文件类型说明将要创建的工程输出一个目标文件库。
(5)确定DSP系列。在Target区域,按照系统所选用的DSP系列来选择产品系列。
(6)点击“完成”按钮。
2.在工程中添加文件
(1)打开添加文件对话框。选择Project→AddFilestoProject,或在工程窗口中的文件名上点击右键并选择添加文件选项,弹出添加文件对话框,界面如图5-11所示。
图5-11CCS中添加文件对话框的界面
(2)选择文件。在添加文件对话框的文件类型下拉列表中选择所添加的文件类型,在放置文件的文件夹中选择所要添加的文件。
(3)点击“打开”按钮来添加选定的文件到工程中。
当需要删除一个文件时,可在ProjectView窗口中相应文件上单击右键,并选择“从工程中删除”选项。在添加文件时,不必手动添加工程中需要的
.h文件,因为系统在编译该项目时会自动在项目文件夹中搜索引用的.h文件,并将其添加到项目文件中。
3.由项目建立和运行程序
(1)启动编译过程。选择Project→RebuildAll,或者点击按钮,启动汇编和链接过程以建立程序。选择该选项后,CCS将依次启动汇编和链接过程对项目进行编译,这一系列过程的相关信息会显示在窗口底部。
(2)生成可执行文件。在默认情况下,编译生成的可执行文件(.out文件)被存放于调试文件夹下,要改变它的地址,可从CCS工具栏里选择另外一个文件夹。
(3)加载文件。选择File→LoadProgram选
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 客运站消防安装施工设计
- 年产50万吨沥青混合料站建设项目资金申请报告
- 城市综合管廊工程施工组织设计实施
- 生态保护生态旅游和民生改善培训内容
- 河北省南宫市奋飞中学高中数学必修5教学设计+教学设计
- 2026年企业培训学习项目标杆案例分析培训考试试题及答案
- 2026年康复医院技师岗招聘笔试试题(附答案)
- 三年级信息技术下册 保护地球家园教学设计 冀教版
- 五年级下册品德教学设计-《15.灾难之中的救护》(6)∣人民未来版
- 天然气输气管道项目技术方案
- 《陆上风电场工程设计概算编制规定及费用标准》(NB-T31011-2024)
- 2025年二中招生考试题目及答案
- 石料破碎安全协议书
- 2025内蒙古能源集团有限公司招聘55人笔试参考题库附带答案详解
- 2024年汽车驾驶员(技师)考试题及答案
- 商业银行风险偏好和限额管理管理办法
- DLT 5434-2021 电力建设工程监理规范表格
- 古代汉语文选无标点(第一册,第二册)教案资料
- JTG-T D32-2012 高清版 公路土工合成材料应用技术规范
- SBT-11205-2017-公用纺织品清洗服务规范1
- APQP全套表格范例
评论
0/150
提交评论