帮忙求解DSP中 CMD文件含义
发布网友
发布时间:2022-05-13 13:53
我来回答
共2个回答
热心网友
时间:2023-08-17 22:34
1命令文件的组成
命令文件的开头部分是要链接的各个子目标文件的名字,这样链接器就可以根据子目标文件名,将相应的目标文件链接成一个文件;接下来就是链接器的操作指令,这些指令用来配置链接器,接下来就是MEMORY和SECTIONS两个伪指令的相关语句,必须大写。MEMORY,用来配置目标存储器,SECTIONS用来指定段的存放位置。结合下面的典型DOS环境的命令文件link.cmd来做一下说明:
file.obj //子目标文件名1
file2.obj //子目标文件名2
file3.obj //子目标文件名3
- o prog.out //连接器操作指令,用来指定输出文件
- m prog.m //用来指定MAP文件
MEMORY
{ 略 }
SECTIONS
{ 略 }
otherlink.cmd
本命令文件link.cmd要调用的otherlink.cmd等其他命令文件,则文件的名字要放到本命令文件最后一行,因为放开头的话,链接器是不会从被调用的其他命令文件中返回到本命令文件。
2 MEMORY伪指令
MEMORY用来建立目标存储器的模型,SECTIONS指令就可以根据这个模型来安排各个段的位置,MEMORY指令可以定义目标系统的各种类型的存储器,及容量。MEMORY的语法如下:
MEMORY
{
PAGE 0 : name1[(attr)] : origin = constant,length = constant
name1n[(attr)] : origin = constant,length = constant
PAGE 1 : name2[(attr)] : origin = constant,length = constant
name2n[(attr)] : origin = constant,length = constant
PAGE n : namen[(attr)] : origin = constant,length = constant
namenn[(attr)] : origin = constant,length = constant
}
PAGE关键词对独立的存储空间进行标记,页号n的最大值为255,实际应用中一般分为两页,PAGE 0程序存储器和PAGE 1数据存储器。
name存储区间的名字,不超过8个字符,不同的PAGE上可以出现相同的名字(最好不用,免的搞混),一个PAGE内不许有相同的name。
attr的属性标识,为R表示可读;W可写X表示区间可以装入可执行代码;I表示存储器可以进行初始话,什么属性代码也不写,表示存储区间具有上述的四种属性,基本上我们都选择这种写法。
origin:略。
length:略。
下面是我经常用的2407的简单写法大家参考,程序从0x060是要避开加密位,不从0x0044开始更可靠一点,此例中的同名的页可以只写第一个,其后省略,但写上至少安全一点:
MEMORY
{
PAGE 0: VECS: origin = 0x0000, length 0x40
PAGE 0: PROG: origin = 0x0060, length 0x6000
PAGE 1: B0 : origin = 0x200, length 0x100
PAGE 1: B1 : origin = 0x300, length 0x100
PAGE 1: DATA: origin = 0x0860, length 0x0780
}
3 SECTIONS伪指令
SECTIONS指令的语法如下:
SECTIONS
{
.text: {所有.text输入段名} load=加载地址 run =运行地址
.data: {所有.data输入段名} load=加载地址 run =运行地址
.bss: {所有.bss输入段名} load=加载地址 run =运行地址
.other: {所有.other输入段名} load=加载地址 run =运行地址
}
SECTIONS必须用大写字母,其后的大括号里是输出段的说明性语句,每一个输出段的说明都是从段名开始,段名之后是如何对输入段进行组织和给段分配存储器的参数说明:
以.text段的属性语句为例,“{所有.text输入段名}”这段内容用来说明连接器输出段的.text段由哪些子目标文件的段组成,举例如下
SECTIONS
{
.text:{ file1.obj(.text) file2(.text) file3(.text,cinit)}略
}
指明输出段.text要链接file1.obj的.text和 file2的.text 还有file3的.text和.cinit。在CCS的SECTIONS里通常只写一个中间没有内容的“{ }”就表示所有的目标文件的相应段
接下来说明“load=加载地址 run =运行地址”链接器为每个输出段都在目标存储器里分配两个地址:一个是加载地址,一个是运行地址。通常情况下两个地址是相同的,可以认为输出段只有一个地址,这时就可以不加“run =运行地址”这条语句了;但有时需要将两个地址分开,比如将程序加载到FLASH,然后放到RAM中高速运行,这就用到了运行地址和加载地址的分别配置了,如下例所示:
.const :{略} load = PROG run = 0x0800
常量加载在程序存储区,配置为在RAM里调用。
“load=加载地址”的几种写法需要说明一下,首先“load”关键字可以省略,“=”可以写成“>”, “加载地址”可以是:地址值、存储区间的名字、PAGE关键词等,所以大家见到“.text:{ } > 0x0080”这样的语句可千万不要奇怪。“run =运行地址”中的
热心网友
时间:2023-08-17 22:35
l rts2800.lib //包含2800的库文件
-stack 400h //栈大小为400h
-heap 100// 堆大小100h
MEMORY//配置目标存储器关键词,划分出不同类型存储空间;空间名字自定
{ //定义存储空间PAGE0
PAGE 0 : PROG(R) : origin = 0x3E8000, length = 0x10000//PROG空间的起始地址以及空间长度
PAGE 0 : BOOT(R) : origin = 0x3FF000, length = 0xFC0// BOOT空间起始地址3FF000,length0xFC0
PAGE 0 : RESET(R) : origin = 0x3FFFC0, length = 0x2//RESET空间起始地址3FFC0,长度0x2
PAGE 0 : VECTORS(R) : origin = 0x3FFFC2, length = 0x3E//中断向量表起始地址和大小
//定义存储空间PAGE1
PAGE 1 : M0RAM(RW) : origin = 0x000000, length = 0x400//片内存储空间M0RAM
PAGE 1 : M1RAM(RW) : origin = 0x000400, length = 0x400//片内存储空间M1RAM
PAGE 1 : L0L1RAM(RW) : origin = 0x008000, length = 0x2000//片内存储空间L0L1RAM
PAGE 1 : H0RAM(RW) : origin = 0x3F8000, length = 0x2000//片内存储空间H0L1RAM
}
SECTIONS//指定段的存储位置的关键词
{
/* 22-bit program sections */
.reset : > RESET, PAGE = 0//复位信号存储在之前定义的RESET空间中
vectors : > VECTORS, PAGE = 0//中断向量存储在之前定义的RESET空间中
.pinit : > PROG, PAGE = 0//全局构造器初始化的变量和常量表
.cinit : > PROG, PAGE = 0//cinit为对全局变量和静态变量初始化的常数,存储在PROG中
.text : > PROG, PAGE = 0//二进制指令代码段,存储在PROG中
/* 16-Bit data sections */
.const : > L0L1RAM, PAGE = 1 //字符串/声明以及被明确初始化的全局变量和静态变量的存储地址L0L1RAM
.bss : > L0L1RAM, PAGE = 1//BSS全局变量和静态变量的存储地址L0L1RAM
.stack : > M1RAM, PAGE = 1 //堆栈存储地址M1RAM
.sysmem : > M0RAM, PAGE = 1//动态存储器分配保留空间,包括malloc等,存储地址M0RAM
/* 32-bit data sections */
.ebss : > H0RAM, PAGE = 1//下面这三个加E开头的存储在片外RAM中,在最大模式存储器的情况下使用
.econst : > H0RAM, PAGE = 1//
.esysmem : > H0RAM, PAGE = 1//
}
CMD文件的配置和你的GEL文件有很大联系,你可以看看GEL文件里面芯片的寄存器和各个存储空间的信息。百度文库里面有个叫“CMD文件的原理”的PDF还不错,最好还是把TI 2800的英文手册拿来看,下面这个是我上传的可以拿来参考下
http://wenku.baidu.com/view/b2714485ec3a87c24028c479.html