在DSP系统中,存在大量、各式各样的存储器,CMD文件所描述的,就是开发工程师对物理存储器的管理、分配和使用情况。CMD全称链接器配置文件,是存放链接器配置信息的,简称命令文件,有三部分组成分别为:输入/输出定义、memory命令、SECTIONS命令。
- 、输入/输出定义:
.obj文件:链接器要链接的目标文件;
.lib文件:链接器要链接的库文件;
.map文件:链接器生成的交叉索引文件;
.out文件:链接器生成的可执行代码;
- 、MEMORY命令
描述系统实际的硬件资源,无论DSP芯片自带还是用户外扩的,凡是可以使用的、需要用到的存储器和空间,用户都要一一声明出来:有哪些存储器,它们的位置和大小。
伪指令:
PAGE关键词:对独立的存储空间进行标记,页号n的最大值为255。实际应用中一般分为两页:PAGE0程序存储器好PAGE1数据存储器。
name:存储区间的名字,不超过8个字符,不同的PAGE上可以出现相同的名字,一个PAGE内不许有相同的name。
origin:空间的起始地址。
length:空间的数据长度
- 、SECTIONS命令
描述段如何定位。
.vectors:中断向量表
.cinit:存放C程序中的变量初值和常量;
.const:存放C程序中的字符常量、浮点常量和用const声明的常量;
.switch:存放C程序中的switch语句的跳帧表;
.text:存放C程序的代码;
.bss:存放C程序中的全局和静态变量保留存储空间;
.far:为C程序用far声明的全局和静态变量保留空间;
.stack:为C程序系统堆栈保留存储空间,用于保存返回空间、函数间的参数传递、存储局部变量和中间结果。
.sysmem:用于C程序中的malloc、calloc和realloc函数动态分配存储空间。
其实在写.CMD文件主要就是告诉DSP:程序放哪,数据放哪,堆栈放哪、中断向量放哪。
例:
/*-w
-stack 500
-sysstack 500
-l rts55x.lib
-heap 102400
*/
-heap 81920 /*100KB=102400 sysmem动态分配的内存大小*/
MEMORY
{
PAGE 0:
MMR : origin = 0000000h, length = 00000c0h
SPRAM : origin = 00000c0h, length = 0000040h
VECS : origin = 0000100h, length = 0000100h
SARAM0 : origin = 0010100h, length = 0000F00h
SARAM1 : origin = 0011000h, length = 0007000h
DARAMBOOT0 : origin = 0000300h, length = 0001400h /*一次加载用的内存*/
SARAM2 : origin = 0018000h, length = 0004000h
SARAM3 : origin = 001c000h, length = 0004000h
DARAM3 : origin = 000c000h, length = 0004000h
PAGE 1:
DARAMBOOT1 : origin = 0001700h, length = 0001400h /*二次加载用的内存*/
DARAM0 : origin = 0002B00h, length = 0001200h
DARAM00 : origin = 0003D00h, length = 0000100h
DARAM01 : origin = 0003E00h, length = 0000100h
DARAM02 : origin = 0003F00h, length = 0000100h
DARAM03 : origin = 0004000h, length = 0000100h
DARAM1 : origin = 0004100h, length = 0003F00h
DARAM2 : origin = 0008000h, length = 0004000h
/* DARAM3 : origin = 000c000h, length = 0004000h
SARAM2 : origin = 0018000h, length = 0004000h
SARAM3 : origin = 001c000h, length = 0004000h*/
SARAM4 : origin = 0020000h, length = 0020000h
SARAM12 : origin = 0040000h, length = 0004000h
SARAM13 : origin = 0044000h, length = 0004000h
SARAM14 : origin = 0048000h, length = 0004000h
SARAM15 : origin = 004c000h, length = 0004000h
CE0 : origin = 0050000h, length = 03b0000h
CE1 : origin = 0400000h, length = 0400000h
CE2 : origin = 0800000h, length = 0400000h
CE3 : origin = 0c00000h, length = 03f8000h
PDROM : origin = 0ff8000h, length = 07f00h
/* VECS : origin = 0ffff00h, length = 00100h */ /* reset vector */
}
SECTIONS
{
.vectors : {} > VECS PAGE 0 /* interrupt vector table */
.cinit : {} > SARAM0 PAGE 0
.text : {} > SARAM1 PAGE 0
.stack : {} > DARAM0 PAGE 1
.sysstack : {} > DARAM0 PAGE 1
.sysmem : {} > SARAM4 PAGE 1
.cio : {} > DARAM1 PAGE 1
.data : {} > DARAM1 PAGE 1
.bss : {} > DARAM1 PAGE 1
.const : {} > DARAM1 PAGE 1
.csldata : {} > DARAM0 PAGE 1
.mybuffer : {} > SARAM4 PAGE 1
.mybuffer1: {} > DARAM2 PAGE 1
.hpiEventbuff: {} > DARAM00 PAGE 1
.hpiRecvbuff : {} > DARAM01 PAGE 1
.hpiSendbuff : {} > DARAM02 PAGE 1
.hpiDebugbuff: {} > DARAM03 PAGE 1
.fftcode : {} > SARAM2 PAGE 0 /* FFT-specific sections */
.twiddle : {} > SARAM3 PAGE 0, align(2048)
.input : {} > DARAM3 PAGE 0, align(4) /* this is due to long-word data memory access */
}