DSP中cmd文件
CMD 的专业名称叫链接器配置文件,是存放链接器的配置信息的,我们简称为命令文件,其中比较关键的就是MEMORY和SECTIONS两个伪指令的使用。
1、命令文件的组成
命令文件的开头部分是要链接的各个子目标文件的名字,这样链接器就可以根据子目标文件名,将相应的目标文件链接成一个文件;接下来就是链接器的操作指令,这些指令用来配置链接器,接下来就是MEMORY和SECTIONS两个伪指令的相关语句,必须大写。
CMD分配ROM和RAM空间,告诉链接程序怎样计算地址和分配空间。所以不同的芯片就有不同大小的ROM和RAM,存放用户程序的地方也不尽相同。所以要根据芯片进行修改,分为 MEMORY和SECTIONS两个部分。
MEMORY:用来指定芯片的ROM和RAM的大小和划分出几个区间。PAGE 0对应ROM, PAGE 1对应RAM。PAGE 里包含的区间名字与其后面的参数反映了该区间的起始地址和长度。(描述系统硬件资源)
MEMORY
{
PAGE 0: VECS: origin = 00000h, length = 00040h
LOW: origin = 00040h, length = 03FC0h
SARAM: origin = 04000h, length = 00800h
B0: origin = 0FF00h, length = 00100h
PAGE 1: B0: origin = 00200h, length = 00100h
B1: origin = 00300h, length = 00100h
B2: origin = 00060h, length = 00020h
SARAM: origin = 08000h, length = 00800h
}
PAGE 0 : VECS(区间名字): origin(起始地址) = 800000h , length (长度)=40h
如应用字段名".vectors"的程序或数据将被放到vecs,vecs是page0即是rom空间00H至40H的地方
SECTIONS:在程序里添加下面的段名,如.vectors。用来指定该段名以下,另一个段名以上的程序(属于PAGE0)或数据(属于PAGE1)放到">"符号后的空间名字所在的地方。(描述"段"如何定位)
SECTIONS
{
.vectors : { } > VECS PAGE 0 /* Interrupt vector table */
.reset : { } > VECS PAGE 0 /* Reset code */
............
}
.vectors,.reset都是段名。加不加"."随你便,即.vectors表示名为 ".vectors"的段。
{}表示段的全部,{}> VECS PAGE 0表示将段的全部放入名为 VECS PAGE 0的内存区。
分成两个基本的部分:
(1)被初始化的Section(包含数据表和可执行代码)
.text: 它包含所有的可执行代码和常数,必须放在程序页
.cinit: 它包含初始化的变量和常量表,要求放在程序页
.pinit: 它包括全局构造器(C++)初始化的变量表,要求放在程序页
.const: 它包括字符串、声明、以及被明确初始化过的全局和静态变量,要求放在低地址数据页。
.econst: 是在使用大存储器模式时使用的,包括字符串、声明、以及被明确初始化过的全局变量和静态变量,可以在数据页的任何地方。
.switch:它包括为转换声明设置的表格,可以放在程序页,也可以放在低地址的数据页。
(2)未被初始化的Section(为程序运行中创建和存放的变量在存储器中保留空间)
.bss:它为全局变量和静态变量保留空间.在程序开始运行时,C导入路径把数据从.cinit节复制出去然后存在.bss节中.要求放在低地址的数据页.
.ebbs:它是在远访问(C)和大存储器模式下使用,它为全局变量和静态变量保留空间.在程序开始运行时,C导入路径把数据从.cinit段复制出去然后存在.ebss节中。可以存放在数据页的任何地方。
.stack:为C系统堆栈保留空间,这部分存储器为用来将声明传给函数及为局部变量留出空间。要求放在低地址的数据页。
.system:动态存储器分配保留空间,这个空间用于malloc函数,如果不使用malloc函数,这个段的大小就是0。要求放在低地址的数据页。
.esystem:动态存储器分配保留空间,这个空间用于外部malloc函数,如果不使用外部malloc函数,这个段的大小就是0。可也放在数据页的任何地方
eg:命令文件示例
MEMORY
{
PAGE 0 : VECS: origin = 00000h, length = 00040h //程序复位
PVECS: origin = 00040h, length = 00070h //外围模块中断向量
PROG: origin = 000b0h, length = 07F50h //片上Flash
PAGE 1 : B0: origin = 00200h, length = 00100h //DRAM B0块
B1: origin = 00300h, length = 00100h //DRAM B1块
B2: origin = 00060h, length = 00020h //DRAM B2块
SARAM: origin = 00800h, length = 00800h //SRAM块
EXT:origin = 08000h, length = 08000h //外部存储器
}
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 //块B2
.const : { } > SARAM PAGE 1 //块B2
.stack : { } > B1 PAGE 1 //堆栈,40个单元
}
例:
MEMORY
{
PAGE 0: VECS: origin = 00000h, length = 00040h
LOW: origin = 00040h, length = 03FC0h
SARAM: origin = 04000h, length = 00800h
B0: origin = 0FF00h, length = 00100h
PAGE 1: B0: origin = 00200h, length = 00100h
B1: origin = 00300h, length = 00100h
B2: origin = 00060h, length = 00020h
SARAM: origin = 08000h, length = 00800h
}
/*--------------------------------------------------------------------------*/
/* SECTIONS ALLOCATION */
/*--------------------------------------------------------------------------*/
SECTIONS
{
.text : { } > LOW PAGE 0
.cinit : { } > LOW PAGE 0
.switch : { } > LOW PAGE 0
.const : { } > SARAM PAGE 1
.data : { } > SARAM PAGE 1
.bss : { } > SARAM PAGE 1
.stack : { } > SARAM PAGE 1
.sysmem : { } > SARAM PAGE 1
}
系统定义:
.cinit 存放c程序中的变量初值和常量;
.const 存放c程序中的字符常量、浮点常量和用const声明的常量;
.switch 存放c程序中的switch语句的跳针表;
.text 存放c程序的代码;
.bss 为c程序中的全局和静态变量保留存储空间;
.far 为c程序中用far生命的全局和静态变量保留空间;
.stack 为c程序系统堆栈保留存储空间,用于保存返回地址、函数间的参数传递、存储局部变量和保存中间结果;
.system 用于c程序中malloc、calloc和realloc函数动态分配存储空间;
6455.cmd文件内容
-l rts64plus.lib
MEMORY
{
VECS: o = 0x00800000 l = 0x00000200
BOOT: o = 0x00800200 l = 0x00000200
L2RAM: o = 0x00800400 l = 0x001FFC00 /* 2MB L2 Internal SRAM */
L1PRAM: o = 0x00E00000 l = 0x00008000 /* 32kB L1 Program SRAM/CACHE */
L1DRAM: o = 0x00F00000 l = 0x00008000 /* 32kB L1 Data SRAM/CACHE */
EMIFA_CE2: o = 0xA0000000 l = 0x00800000 /* 8MB EMIFA CE2 */
EMIFA_CE3: o = 0xB0000000 l = 0x00800000 /* 8MB EMIFA CE2 */
EMIFA_CE4: o = 0xC0000000 l = 0x00800000 /* 8MB EMIFA CE2 */
EMIFA_CE5: o = 0xD0000000 l = 0x00800000 /* 8MB EMIFA CE2 */
DDR2_CE0: o = 0xE0000000 l = 0x20000000 /* 512MB EMIFB CE0 */
}
SECTIONS
{
"vectors" > VECS
"bootload" > BOOT
.csl_vect > L2RAM
.text > L2RAM
.stack > L2RAM
.bss > L2RAM
.cio > L2RAM //printf等输入输出函数使用的缓冲区所在块
.const > L2RAM
.data > L2RAM
.switch > L2RAM
.sysmem > L2RAM
.far > L2RAM
.args > L2RAM
.ppinfo > L2RAM
.ppdata > L2RAM
/* COFF sections */
.pinit > L2RAM
.cinit > L2RAM
/* EABI sections */
.binit > L2RAM
.init_array > L2RAM
.neardata > L2RAM
.fardata > L2RAM
.rodata > L2RAM
.c6xabi.exidx > L2RAM
.c6xabi.extab > L2RAM
}