理论教育 链接命令文件详解

链接命令文件详解

时间:2023-06-15 理论教育 版权反馈
【摘要】:2)利用链接器命令文件实现。即编写一个链接器命令文件,将所有链接器选项写在文件中,并将此文件加入到项目,这样CCS在进行编译链接时,会自动按照链接器命令文件中的选项进行。有两条链接器命令MEMORY和SECTIONS可以实现对程序存储器和数据存储器空间的分配。例4-1 链接命令文件1。该例链接命令文件分为两个,一个是用于DSP2803x片内外设寄存器连接的命令文件DSP2803x_Headers_nonBIOS.cmd。

链接命令文件详解

CCS的链接器可以有很多选项,如-l(包含库文件)、-stack(定义堆栈)、-o(定义输出文件)等,并且将用户软件定义的段与目标系统存储器物理地址对应关系定义清楚。

链接器选项的实现通常采用下面两种方法:

1)利用项目选项菜单实现。在CCS菜单Project>Build Option>Linker页面中可以对链接器选项进行设置。

2)利用链接器命令文件(.cmd)实现。即编写一个链接器命令文件,将所有链接器选项写在文件中,并将此文件加入到项目,这样CCS在进行编译链接时,会自动按照链接器命令文件中的选项进行。

有两条链接器命令MEMORY和SECTIONS可以实现对程序存储器和数据存储器空间的分配。MEMORY命令定义目标存储器的配置,SECTIONS命令定义编程段与目标存储器的关系。

1.MEMORY命令

MEMORY命令定义目标系统中可以使用的存储器范围,每个存储器范围具有名字、起始地址和长度。一般形式为

MEMORY

{

PAGE0:name:origin=constant,length=constant;

PAGEn:name:origin=constant,length=constant;

}

PAGEn:定义存储器空间。n=0~254.通常PAGE0定义程序存储器,PAGE1定义数据存储器。

name:存储器范围名字。可以是1~8个字符。

origin或简写为o:存储器范围的起始地址。

constant:常数。

length或简写为l:存储器范围的长度。

2.SECTIONS命令

SECTIONS命令用于将输出各段定位到所定义的存储器。一般形式为

SECTIONS

{

name:[property,property,…]

name:[property,property,…]

}

在段名(name)之后是是特性(property)列表,它定义段的内容以及是怎样分配的。段的特性(property)是指装载位置、运行位置、输入段以及段类型等。通常的特性符号“>”表示输出段装载位置。

例4-1 链接命令文件1。

a.obj b.obj c.obj /∗输入被链接的文件名a.obj,b.obj和c.obj∗/

-o prog.out /∗选择输出的可执行文件名prog.out∗/

-mprog.map /∗选择map文件名prog.map∗/

-lrts2800.lib /∗链接运行时支持库∗/(www.daowen.com)

MEMORY /∗MEMORY命令∗/

{

RAM: origin=100h length=100h /∗RAM存储器的起始地址与长度∗/

ROM: origin=1000h length=100h /∗ROM存储器的起始地址与长度∗/

}

SECTIONS /∗SECTIONS命令∗/

{

.text: >ROM /∗将.text段分配到ROM∗/

.data: >ROM /∗将.data段分配到ROM∗/

.bss: >RAM /∗将.bss段分配到RAM∗/

.pint: >ROM /∗将.pint段等分配到对应的存储器∗/

.cint: >ROM

.switch: >ROM

.const: >RAM

.stack: >RAM

.sysmem: >RAM

}

例4-2 链接命令文件2。该例链接命令文件分为两个,一个是用于DSP2803x片内外设寄存器连接的命令文件DSP2803x_Headers_nonBIOS.cmd。另一个是用于C程序默认段链接的文件:28035_RAM_lnk.cmd。

上述实例的用户程序存放到L0~L1SARAM,进行调试与执行。

对于28035,调试好的程序一般存放到片内Flash存储器(64KW),其地址为0x3E800~0x3F7FFF。引导程序跳到Flash的0x3F7FF6地址单元,用户必须在此处事先放好跳转指令,使代码继续执行。上述要求相应的命令语句可以改写为

PAGE0: /∗程序存储器∗/

BEGIN :origin=0x3F7FF6,length=0x0002 /∗PartofFLASH∗/

FLASH :origin=0x3E8000,length=0x00FF00 /∗64KWFLASH∗/

codestart:>BEGIN,PAGE=0

.text:>FLASH,PAGE=0

通常,跳转指令转移到位于C编译器运行时支持库rts2800_ml.lib中的初始化子程序的开始处。这个子程序的入口符号为_c_int00。只有运行该设置子程序后,其他C代码才可以被执行。项目文件中有一个名为DSP2803x_CodeStartBranch.asm的汇编语言程序文件,可以实现此功能,其主要内容为

.ref _c_int00 ;声明一个全局符号_c_int00,为C语言程序入口

.sect “codestart” ;定一个段名为codestart

LB _c_int00 ;长跳转指令,跳转到_c_int00

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈