http://blog.sina.com.cn/s/blog_abe5740601015b3q.html

CMD的专业名称叫链接器配置文件,是存放链接器的配置信息的,我们简称为命令文件,其中比较关键的就是MEMORY和SECTIONS两个伪指令 的使用,常常令人困惑,系统出现的问题也经常与它们的不当使用有关,我将重点讲解。CCS是从DOS系统下DSP软件继承的开发环境。CCS的命令文件是 DOS命令文件经过很长时间的引申发展了,已经变得非常了简洁(不知道TI文档有没有详细CMD配置说明)。我学CMD是从DOS里的东西开始的,所以也 从DOS环境下的CMD说起:

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 =运行地址”中的“ = ”可以用“>”其它的简化写法就没有了。大家不要乱用。

4 CCS中的案例
在CCS中的命令文件好像简化了不少,少了很多东西,语句也精简了好多,首先不用指定输入链接器的目标文件,CCS会自 动默认处理,其次链接器的配置命令也和DOS的环境不同,需要了解的请找TI文档吧!下面是刘和平书中的例子,大家来看看是不是可以很精确的理解了呢!不 懂的大家继续在本帖讨论!我的QQ605507276!
-stack 40

MEMORY
{
PAGE 0 :  VECS : origin =    0h , length = 40h 
       PVECS : origin =   40h , length = 70h 
       PROG : origin =  0b0h , length = 7F50h 
PAGE 1 :  MMRS : origin =    0h , length =   05Fh 
    B2 : origin = 0060h , length =   020h 
    B0 : origin = 0200h , length =   100h 
    B1 : origin = 0300h , length =   100h 
SARAM   : origin = 0800h , length =  0800h   
EXT : origin = 8000h , length =  8000h 
}

SECTIONS
{
    .reset   : { } > VECS   PAGE 0 
    .vectors : { } > VECS   PAGE 0
    .pvecs   : { } > PVECS  PAGE 0
    .text    : { } > PROG   PAGE 0
    .cinit   : { } > PROG   PAGE 0  
    .bss     : { } > SARAM  PAGE 1
    .const   : { } > SARAM  PAGE 1  
    .stack   : { } > B1     PAGE 1

CCS中cmd文件的编写的更多相关文章

  1. CCS中CMD文件解析

    http://blog.csdn.net/u011392772/article/details/49760897 gel文件中主要包含了PLL.DDR等的初始化工作,具体可以看一下gel源码就明白了: ...

  2. DSP中CMD文件

    DSP中CMD文件 (2012-12-26 20:54:17) 转载▼ 标签: 杂谈 分类: DSP FPGA DSP的存储器的地址范围,CMD是主要是根据那个来编的.CMD 它是用来分配rom和ra ...

  3. TMS320DM642学习----第六篇(CCS中.dat文件类型详解)

    1.如下为.dat文件中文件头的基本格式: MagicNumber Format StartingAddress PageNum Length [NewFormat] 下面是分别的解释: MagicN ...

  4. 【DSP】CCS中.dat文件的格式

    转自“http://e2e.ti.com/support/development_tools/code_composer_studio/f/81/t/168292” Here is the infor ...

  5. 【DSP开发】CMD文件

    DSP的存储器的地址范围,CMD是主要是根据那个来编的. CMD 它是用来分配rom和ram空间用的,告诉链接程序怎样计算地址和分配空间. 所以不同的芯片就有不同大小的rom和ram.放用户程序的地方 ...

  6. 有些CCS工程中为什么会有两个CMD文件?

    这里的CCS就是TI公司的Code Composer Studio 集成开发环境,所以这篇随笔也就是关于TI公司DSP开发过程中对于刚入门同学的一个常见问题了. 那作为一个初学者,对于CCS工程中的c ...

  7. DSP中的cmd文件

    一.CMD文件 链接命令文件(Link Command Files),以后缀.cmd结尾,简称CMD文件. CMD文件的两大功能是指示存储空间和分配段到存储空间. 在编写CMD文件时,主要采用MEMO ...

  8. php中数据库服务器连接类库文件的编写

    <!--数据库服务器连接类库文件的编写--> <?php class mysql{ //连接服务器.数据库以及执行Sql语句的类库 public $database; public ...

  9. 利用(CMD)在Django中创建文件

    django项目的创建(在CMD中) 1.切换到你想要存储项目的位置,我这里保存在桌面上 cd Desktop 2.创建一个django项目,项目名叫guest django-admin startp ...

随机推荐

  1. 深入理解Java虚拟机之JVM垃圾回收随笔

    1.对象已经死亡? 1.1引用计数法:给对象中添加一个引用计数器,每当有一个地方引用他时,计数器值就加1:当引用失效时,计数器值就减1:任何时刻计数器都为0的对象就是不可能再被使用 的.但是它很难解决 ...

  2. SVN使用教程总结(转载)

    SVN简介: 为什么要使用SVN? 程序员在编写程序的过程中,每个程序员都会生成很多不同的版本,这就需要程序员有效的管理代码,在需要的时候可以迅速,准确取出相应的版本. Subversion是什么? ...

  3. 移动端目标识别(1)——使用TensorFlow Lite将tensorflow模型部署到移动端(ssd)之TensorFlow Lite简介

    平时工作就是做深度学习,但是深度学习没有落地就是比较虚,目前在移动端或嵌入式端应用的比较实际,也了解到目前主要有 caffe2,腾讯ncnn,tensorflow,因为工作用tensorflow比较多 ...

  4. Word 通过尾注插入参考文献

    一步:把鼠标移到论文要插入的位置,然后点击引用: 第二步:点击插入尾注: 第三步:点击视图,接着点击草稿: 第四步:再次点击引用,接着点击显示备注,左下角出现尾注矩形框菜单栏,选择尾注分隔符,可以删除 ...

  5. Java框架spring 学习笔记(十一):aop相关概念

    为什么要引入aop? 比如如下情景: 在父类的方法名称发送了变化,在子类调用的方法也需要变化,当工程规模越来越大的时候,维护起来相当不方便,于是就引入了横向切面aop. aop的相关概念: 连接点:类 ...

  6. CodeWarrior 10 添加/修改 头文件路径

    当使用CodeWarrior 10时,默认使用大名鼎鼎的GCC编译器. 我们在构建工程的时候,往往按模块分类文件夹,那么就存在需要包含头文件路径的问题.那么如何加入头文件的路径呢?见下文. 1.打开工 ...

  7. 字符编码:Unicode和UTF-8之间的关系

    Unicode和UTF-8之间的关系 1. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256 ...

  8. Spring:MVC

    摘要 Spring MVC 是一个开源的.基于MVC架构的WEB应用框架.这里记录MVC模型的概念以及Spring MVC 的请求处理流程. 关键词:Spring MVC 一.什么是Spring MV ...

  9. UVA 679 二叉树

    题目链接:https://vjudge.net/problem/UVA-679 参考自:刘汝佳的紫书 思路: 我们发现,对于每一颗子树,假如小球是第奇数次到达这颗子树的根节点时,那么此时应该向左子树走 ...

  10. WPF 初识

    1.WPF 与Winform比较 1.1.WPF所有的操作都不依赖于GDI和GDI+,而是间接依赖于强大的Direct3D,这就意味着通过WPF可以做出以前WinFrom无法想象的视觉效果,包括3D效 ...