如果从事 TI DSP 处理器开发,CMD 文件一定是不可忽略的重要文件。当然,CMD 文件也并不是 DSP 处理器的专利,开发 TI ARM(不运行 HLOS 高阶操作系统),MCU 等处理器也都会遇到 CMD 文件。本文就以C6000 DSP CMD 文件为例,给大家说说 CMD 文件的那些事。
首先,需要知道 CMD 文件到底是什么文件?
CMD 即Linker Command Files 命令链接文件。CMD 发挥作用的阶段是在我们程序开发的链接阶段。即下图 Linker 阶段。

需要注意的是英文 LinkerCommand Files 中的 Files 是复数,也就是说在一个 DSP 项目中,CMD 文件可以不止一个。不论是否运行实时操作系统,都可以有多个 CMD 文件,但是不同的 CMD 文件中的内容不能有冲突,否则编译工具链会报链接错误!
既然 CMD 文件在链接阶段发挥作用,那么就需要知道编译工具链在链接阶段究竟做了些什么?
n 分配段到目标系统可配置内存区域
n 重新定位符号和段并指派最终地址
n 解析不同文件中未定义的外部引用
n 分配段到特定的内存区域
n 合并目标文件段
n 定义或重定义链接时全局符号
说了这么多,简而言之链接过程主要是一些对符号和程序段内存分配的操作。而 CMD 文件最主要的功能就是内存分配。

使用 CMD 文件的文件结构

CMD 文件主要有三部分内容
1、链接选项
可以在 CMD 文件修改链接选项,比如
-heap 0x1000
-stack 0x1000
这两个参数是指定堆和栈的大小,这里需要注意的是堆栈,虽然一般都放在一起描述,但它们可不是一回事。
-l../../../Library/Codec/h264hpvdec_ti.le66
还可以链接静态库(-l 小写英文字母 L),这里使用的是相对路径。
2、MEMORY 指令 - 目标处理器内存区域描述
这一部分主要是描述目标处理器中内存区域,只要是可访问的内存区域都可以在这里描述,当然需要用到的内存空间要描述,不用到的可以不用描述。需要注意的是,这个内存描述仅在 CMD 文件中有效,不会影响其它文件,也不可以在其它文件中引用。
语法
MEMORY
{
name 1 [( attr )] : origin = expression , length = expression [, fill = constant]
.
.
name n [( attr )] : origin = expression , length = expression [, fill = constant]
}
name 命名一段内存区域,长度 1 - 64 个字符,可以使用 A - Z,a - z,$,.以及 _。
attr 为这段内存区域指定 1 - 4 个属性。可选参数。属性限制对于段的分配。如果,不指定该参数即代表不限制该内存段属性。有效的属性有
R 内存区域可读
W 内存区域可写
X 内存区域包含可执行代码
I 内存区域可被初始化
origin :指定内存区域起始地址,也可以写作 origin,org 或 o。地址以字节为单位的 32 位常量表达式,可以是十六进制、十进制或者八进制。
length: 指定内存区域长度,也可以写作 length,len 或 l。可以是十六进制、十进制或者八进制。
fill :使用指定字符填充内存区域,也可以写作fill 或 f。可选参数。填充字符为一个整数常量,可以是十六进制、十进制或者八进制。 fill 用于填充一段不用来分配段的内存区域。
地址操作可以使用的表达式,表达式的规则与标准 C语言一致。
单目运算符 - ~ !
双目运算符 * / % + -<<>> == = <<= >>= & | && ||
其它 START SIZE END 这三个关键字分别用于获取引用内存区域的起始地址、大小及结束地址。

使用表达式描述地址的范例。
/********************************************************/
/* 范例*/
/********************************************************/
file1.obj file2.obj /* 输入文件 */
--output_file=prog.out /* 选项 */
#define ORIGIN 0x00000000
#define BUFFER 0x00000200
#define CACHE 0x0001000MEMORY
{
FAST_MEM (RX): origin =ORIGIN + CACHE length = 0x00001000 + BUFFER
SLOW_MEM (RW): origin = end(FAST_MEM)length = 0x00001800 - size(FAST_MEM)
EXT_MEM (RX): origin = 0x10000000 length = size(FAST_MEM) - CACHE
}

3、SECTIONS 指令 - 分配程序段到内存
描述输入段如何合并到输出段;
定义可执行文件中的输出段;
指定输出段放置到的内存区域;
允许重命名输出段。
SECTIONS
{
name : [property [, property] [, property] … ]
name : [property [, property] [, property] … ]
name : [property [, property] [, property] … ]
}
加载分配:定义段被加载到的内存区域
语法: load = 区域 或 >区域

运行分配 :定义段运行的内存区域
语法: run = 区域 或 run > 区域

输入段:定义用于组成输出段的输入段(目标文件)
语法: { 输入段 }

段类型:定义特定段标志
语法: type = COPY 或 type = DSECT 或 type = NOLOAD

填充值:定义用来填充未初始化区域(Hole)值
语法: fill = 值 或 名称: [属性= 值]

SECTIONS 指令范例
/**************************************************/
/* 范例*/
/**************************************************/
file1.obj file2.obj /* 输入文件 */
--output_file=prog.out /* 选项 */
SECTIONS
{
.text: load =EXT_MEM, run = 0x00000800
.const: load =FAST_MEM
.bss: load =SLOW_MEM
.vectors: load =0x00000000
{
t1.obj(.intvec1)
t2.obj(.intvec2)
endvec = .;
}
.data:alpha: align =16
.data:beta: align =16
}

结合前面的范例,最终的内存分配如下图所示

此外,有部分段由编译器及程序设计语言(C++ / C / 汇编)定义,当然开发人员也可以自行定义段。
编译工具创建的已初始化的程序段(EABI)

编译工具创建的未初始化的程序段(COFFABI 及 EABI)

自行定义段名称不能跟这些名称冲突。

TI DSP处理器中CMD 文件的那些事儿相关推荐

  1. TI DSP处理器中的CMD 文件

    原文转载于:http://blog.csdn.net/hj199404182515/article/details/52838869  非常感谢. 如果从事 TI DSP 处理器开发,CMD 文件一定 ...

  2. [DSP学习笔记]cmd文件的讲解

    一.前言 在笔者学习F28335的过程中,发现网上少有对于cmd文件的讲解,而学习DSP,肯定是要编写或修改cmd文件的.故笔者基于自己的学习经验,给出了自己对于cmd文件的理解. 在正式开始学习cm ...

  3. cmd c语言 文件,DSP,如何编写CMD文件!(转)

    刚找到的资料,虽然不够全,希望能帮到你... 祝愿同在努力的你,成功 CMD文件的作用: 在DSP里,程序执行过程中也有好多地方需要跳转,所以需要跳转的目标地址.如果你在编程序时知道你所要跳转的地址, ...

  4. C语言中的文件操作那些事儿~~

    是时候该学着操作文件了 什么是文件 文件种类 文件名 为什么要使用文件 文件的打开和关闭 文件的顺序读写 fgetc/fputc fgets/gputs fscanf/fprintf fread/fw ...

  5. 在TI DSP开发板中烧写Flash程序

    实现在FLASH存储器烧写程序一般有以下三种方法:一是通过编程器下载烧写:二是通过开发商提供的专门软件工具+在线仿真器烧写:三是自己编程通过DSP烧写.个人使用的是合众达电子SEED-VPM642开发 ...

  6. linux中cmd是什么文件格式,CMD 文件扩展名: 它是什么以及如何打开它?

    CMD 问题的来源 打开 CMD 文件的麻烦 Microsoft Notepad 不在 尝试打开 CMD 时,你会遇到一条错误消息,例如 "%%os%% 无法打开 CMD 文件". ...

  7. 如何使用TI的DSP芯片cmd文件

    CMD文件一句话来表达:定义芯片内部硬件资源和分配管理软件代码的一个配置文件.因此从cmd文件的组织上你能看到两个部分:1定义硬件资源,2管理软件代码 (非原创,总结与网络) 用户通过编写CMD 文件 ...

  8. DSP芯片CMD文件中各段的实验验证(上)

    上篇文章详细讲解了DSP中的CMD文件,请看:http://blog.csdn.net/qq_29545231/article/details/78175977<超详细的CMD文件讲解(DSP2 ...

  9. DSP学习(8)—— linker.cmd文件解析

    DSP学习(8)-- linker.cmd文件解析 文章目录 DSP学习(8)-- linker.cmd文件解析 前言 前言 写工程的时候遇到报内存不够的错误,出现在linker.cmd的内存分配se ...

  10. TMS320F280049C 学习笔记9 CMD文件 程序从FLASH复制到RAM中运行

    文章目录 动机 CMD文件结构与语法 MEMORY和SECTIONS指令 MEMORY指令 SECTIONS指令 程序与数据段 已初始化段 未初始化段 其他指令 #pragma指令的使用 程序从FLA ...

最新文章

  1. jquery 吐司_jquery – 更改toastr通知的positionclass
  2. 留恋 nyoj 854
  3. C# 中Bitmap图像处理含增强对比度的三种方法
  4. 计网 --- 域名服务系统:因特网的目录服务
  5. 使用sstableloader恢复Cassandra Priam备份
  6. 买iphone不买android,为何宁可用4年前的苹果6s,也不买两三千的安卓呢?理由很真实...
  7. php商品低库存报警,Magento中产品库存不报警解决方案
  8. 带刺的下沉市场:小镇青年要的不止是9块9包邮
  9. 推荐系统的公平性:用户侧与生产侧
  10. [已解决] org.hibernate.AnnotationException:未为实体类指定标识符
  11. 软件测试知识点 | APP蓝牙连接测试
  12. [量化学院]基于协整的配对交易
  13. 计算机应用技术企业信息化,计算机应用技术对企业信息化作用
  14. php ios表情包,[iOS] 自定义表情包
  15. java --运用hhs 框架,tomcat 访问mysql 数据库 连接 失败后,自动 重新连接怎么做?
  16. ES6 对象的解构赋值
  17. 九龙证券|光模块概念股封单资金超3亿元,传媒板块涨停潮来袭
  18. EasyX 窗口如何最大化,以及拖拽调整大小
  19. 超级 POM,POM的层级关系
  20. Android Studio报错--Error: Library projects cannot set applicationId. applicationId is set to ...

热门文章

  1. 9月30日skype事件
  2. 【基础】SAP 新增计量单位
  3. python3爬虫实战-requests+beautifulsoup-爬取下载顶点网站的小说
  4. PS2019渐变工具、油漆桶工具、3D材质拖放工具
  5. mysql蠕虫复制原理_mysql蠕虫复制基础知识点
  6. 西门子 HTML控件 上不了网,Win10系统在西门子PLC调试中以太网连接异常处理办法...
  7. 简支梁挠度计算公式推导_自己整理的简支梁挠度计算公式
  8. Python批量自定义文件夹图标
  9. ATSHA204A加密芯片
  10. 今天我们来聊聊递归喝汽水问题