CMD命令文件详解

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

CMD 命令文件解析

CMD 文件的专业名称叫做链接器配置文件,用以存放链接器的配置信息,简称命令文件。其中比较关键的就是MEMORY、SECTIONS两个伪指令的使用。MEMORY和SECTIONS 的相关语句必须使用大写字符。MEMORY是用以配置目标存储器的,而SECTIONS是用以指定段的存放位置的。

1 存储空间的配置

DSP存储器分为三个独立选择的空间:程序空间、数据空间和I/O空间,其中程序存储器存放待执行的指令和执行中所用的系数(常数),可使用片内或片外的RAM、ROM、EPROM 等构成;数据存储器存放指令执行中产生的数据,可使用片内或片外的RAM和ROM来构成。I/O存储器存放与映像外围接口相关的数据,也可以作为附加的数据存储空间来使用。下表是TMS320F28335的存储空间分布:

TMS320F28335的存储空间分布:

2 BootRom

BootRom 是位于存储器地址0x3F E000 ~ 0x3F FFFF处的8K * 16位存储区域。并利用M0区域的0x0002 ~ 0x004E作为其Boot程序的堆栈和ebss区。其内存映射如下:

3 Cmd 文件的分配方法

TI公司新的汇编器和链接器创建的目标文件采用一种COFF(通用目标文件格式),该目标文件格式更利于模块化编程,为管理代码段和目标系统存储器提供了强有力和灵活的编程方法。用户可以通过编写链接命令文件(cmd文件)将链接信息放在一个文件中,以便在多次使用同样的链接信息时调用。在命令文件中使用两个十分有用的伪指令MEMORY 和SECTIONS,来指定实际应用中的存储器结构和进行地址的映射。M EMORY用来指定目标存储器结构,MEMORY下可以通过PAGE选项配置地址空间。链接器把每一页都当作一个独立的存储空间,通常情况下,PAGE0 代表程序存储器用来存放程序,PAGE1 代表数据存储器,用来存放数据。由编译器生成的可重定位的代码和数据块叫做“SECTIONS”(段),SECTIONS 用来控制段的构成与地址分配。对于不同的系统配置,“SECTION”的分配方式也不相同,链接器通过“SECTIONS”来控制地址的分配,所以“SECTIONS”的定义及分配就成了配置.cmd 文件的重要环节。以下是对“SECTIONS”的定义及分配的详细介绍。

4 SECTIONS介绍

SECTIONS可分为两个基本的部分:

1.被初始化的“SECTIONS”,包括数据表和可执行代码。

a).text :所有的可执行代码和常数,必须放在程序页

b).cinit :存放程序中的变量初值和常量,要求放在程序页

c).pinit :C++的全局构造器列表,要求放在程序页。

d).const :全局及静态常量,包括字符串,要求放在低地址的数据页,由const

进行申明。

e).econst :在使用大存储器模式时使用,包括字符串、申明,以及被明确初始

化过的全局变量和静态变量,或由(far const)进行申明,可放在数据段的任何

位置

f).switch :大的Switch语句的跳转地址表,当有-mt编译选项时放在程序页,

否则放在数据页

2.未被初始化的“SECTIONS”(为程序运行中创建和存放的变量在存储器中保留空间)

a).bss :为全局变量和静态变量保留空间。在程序开始运行时,C导入程序

把数据从.cinit节复制出去然后存在.bss节中。要求放在低地址的数据页

b).ebss :在远(far)访问(只用于C)和大存储模式下使用,它为全局变量和

静态变量保留空间。在程序开始运行时,C导入程序把数据从.cinit段复制出来

然后存于.ebss节中。可以放在数据页的任何地方

c).stack :为C系统堆栈保留空间,这部分存储器为用来将声明传给函数及位

局部变量留出空间。要求放在低地址的数据页。

d).sysmem :动态存储器分配保留空间,这个空间用于malloc函数,如果不使

用malloc函数,这个段的大小就是0。要求放在低地址的数据页。

e).esysmem:动态存储器分配保留空间,这个空间用于外部malloc函数

(far_malloc),如果不使用外部malloc函数,这个段的大小就是0。可以放

在数据页的任何地方。

5 .const详述

上述几个常用段中,.text段和.cinit段被固定连接至程序空间,存储器类型可以使ROM 或RAM(一般为ROM);.bss段和.stack段则被固定连接至数据空间,存储器类型只能是RAM。.const的使用则相对灵活。.const段被固定连接至数据空间,但存储器类型可以是ROM 或RAM,这有别于.cinit段、cinit段被连接至程序空间,程序在执行时,再被复制到数据空间中的.bss段。这样一张未用const声明的数据表要同时占用程序(.cinit段)和数据空间(.bss 段)的一部分。与之相比较,如果系统支持数据ROM,则该数据表改用const声明后,只需占用数据空间(.const段)的一部分。

6 存储模式

C语言编译器将存储器当作一个由代码子模块和数据子模块组成的线性模块,每个由C 程序生成的代码子模块或数据子模块被放到各自的连续存储空间中。编译器认为目标存储器的全部24位地址都有效。

编译器支持两种存储器模式:小存储器模式和大存储器模式,两种存储模式的数据在存储器中的放置和访问有所不同。

6.1 小存储器模式(默认模式)

使用小存储器模式将得到比使用大存储器模式时更少的代码和数据。但是,程序必须满足一定的大小和存储放置限制。

在小存储器模式中,在单页(64KB)存储器内的以下段都必须分配合适:

●.bss 和.data段(所有静态和全局数据)

●.stack 和sysstack段(第1和第2系统堆栈)

●.sysmem段(动态存储空间)

●.const段

而对.text段(代码)、.switch(Switch语句)和.cinit(变量初始化)的大小和位置没有限制。

小模式下编译器使用16位数据指针来访问数据。XARn寄存器的高7位用来设置指向包含.bss段的存储页。

6.2 大存储器模式

大存储器模式支持不严格的数据放置。用-ml 选项就可以应用该模式。在大存储器模式下,数据指针为23位,在存储器中占2字空间。.stack和.sysstack必须在同一页上。在大存储器模式下编译代码时,必须与rts55x.lib运行时间库链接。应用程序中的所有文件都必须使用相同的存储器模式。

链接器不允许同时存在大存储器模式和小存储器模式

《摘自TMS 320C55X DSP 的说明》

相关文档
最新文档