这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » FPGA » 存储器配置与CMD文件的编写

共1条 1/1 1 跳转至

存储器配置与CMD文件的编写

助工
2014-12-21 10:43:43     打赏
1. VC5402 的存储器配置文件

文件中的注释采用 C 语言风格,即用 /* */ 可以注释一行或多行。特别注意,
不能用 // 来注释一行。

一个例子:
    
/*filename: uxer_learn.cmd
*This file is a configration file for VC5402 Program and Data Space
*Last modified by Zhang Yong. */
MEMORY
{
    PAGE 0: PROG(RWXI): origin = 0x80, length = 0x3000
            VECS(RXI):  origin = 0xff80, length = 0x80
    PAGE 1: DATA(RWI):  origin = 0x3080, length = 0xf80
}
/* MEMORY 为存储器指示关键字,程序区用 PAGE 0 来表示,数据区用 PAGE 1 
来表示。程序区和数据区都使用了 VC5402 片上的 64Kx16 bit 的 DARAM。程序
区和数据区的名称可以按 C 语言的风格任意取名。程序区命名为 PROG,占据了
约 12Kx16bit 的空间;数据区命名为 DATA,占据了约 4Kx16bit 的 DARAM 空间。
origin = 0x80 代表了程序空间的起始地址,length = 0x3000 代表程序空间长度
为 0x3000。
*/
SECTIONS
{
    .text    {} >    PROG PAGE 0
    .cinit    {} >    PROG PAGE 0
    .pint    {} >    PROG PAGE 0
    .vectors    {} >    PROG PAGE 0
    .stack    {} >    DATA PAGE 1
    .bss    {} >    DATA PAGE 1
    .const    {} >    DATA PAGE 1
    .switch    {} >    DATA PAGE 1
    .sysmem    {} >    DATA PAGE 1
    .cio    {} >    DATA PAGE 1
}
/* SECTIONS 是存储器区段关键字;.text 等是汇编指示关键字,它的含义为
将程序段放入 PAGE 0 的 PROG 区域;.cinit 指示将 C 语言初始化数据存入
PROG 区域中;.pint 指示将 C++ 程序初始化数据存入 PROG 区域中;.stack
表示在 PAGE 1 的 DATA 区域开辟堆栈;.bss 指示将未初始化的变量分配在 
DATA 区域;.const 指示将常量分配在 DATA 区域;.switch 指示将 C 语言的
 switch 语句分配到 DATA 区域;.sysmem 指示将 C 语句(如 malloc 或 alloc)
开辟的存储区分配到 DATA 区域。
*/
对于不同的芯片,有不同的存储器分配方案。对于同一种芯片,使用在不同的开发
项目中,其存储器配置方案也不尽相同。

在 .cmd 文件中,可以插入连接指令,最常用的是 -m 命令。这个命令用来生成一个
以指定文件名为文件名的连接 MAP 表。.map 文件向软件设计人员详细展示了存储器
的配置和使用情况、各个段的绝对地址和重新分配后的全局符号。

2. .cmd 文件的编写
在连接过程中,连接器会将存储空间进行分段,并将相应的程序代码与这个区段的绝对
地址进行绑定,即将目标文件分配到各个存储区段内。完成这个过程的语言称为连接
命令语言,文件的扩展名默认为 .cmd.

.cmd 文件的总体框架为:
MEMORY
{
    PAGE 0:
    PAGE 1:
}
SECTIONS
{
}
一般包括两个页面,即 PAGE 0 和 PAGE 1, PAGE 0 指程序存储空间,PAGE 1 指
数据空间,最多可以设置到第 255 个页面。

连接命令语言的关键字:
align(ALIGN)
attr(ATTR)
block(BLOCK)
COPY
DSECT
f(fill/FILL)
group(GROUP)
load(LOAD/>)
l(len/length/LENGTH)
MEMORY
NOLOAD
page(PAGE)
o(org/origin/ORIGIN)
range
run(RUN)
SECTIONS
spare
type(TYPE
UNION

用在连接命令文件中的常数可以用汇编语言格式也可以采用 C 语言格式,还可以
混用,例如,对于十进制常数 100 (dec), 用汇编语言表示为 100(dec) 、144q(八进制)、
64h (十六进制);用 C 语言表示为 100(十进制)、0144(八进制)、0x144(十六进制)。

实际编写连接命令文件时,常用的关键字不多。结合下面这个例子来看这些关键字的用法:

MEMORY
{
    PAGE 0:    PROG(RWXI):    o = 0x80, l = 0x3000
    PAGE 1:    DATA(RWI):    o = 0x3080, l = 0xf00
    PAGE 2:    ONCHIP(RW):    o = 0x3f00, l = 0x80, f = 0x0000
}
/*MEMORY 指示符的通用语法为:
MEMORY
{
    PAGE 0: name0[(attr)]: origin = constant, length = constant
    PAGE 1: name1[(attr)]: origin = constant, length = constant
}
其中,attr 可以为 W、R、X、I的组合形式,其中 W 代表此存储区域可写,R 代表
可读;X 代表可存入运行代码,I 代表可以初始化。本例中定义了三个页面,分别
命名为 PROGE、DATA 和 ONCHIP。ONCHIP 中没有定义段,所以初始化填充了 0x000
(填充必须是两个字节)。
*/
SECTIONS
{
    .cinit:    {} > PSARAM1 PAGE 0
    .pinit:    {} > PSARAM1 PAGE 0
    .text    load=PROG, run=0x2000, align=0x2000
    .cinit    {} > PROG PAGE 0, align=0x80
    .pint    > PROG align 0x20 PAGE 0
    .vectors > PROG PAGE 0
    .stack:    {} > DATA PAGE 1
    .bss    {} > DATA PAGE 1
    .const:    {} > DATA PAGE 1
    .switch:    {} > DATA PAGE 1
    .sysmem:    {} > DATA PAGE 1
}
/* SECTIONS 的通用语法为:
SECTIONS
{
    name: [property,property,property,...]
    name: [property,property,property,...]
    name: [property,property,property,...]
}
其中,load 指示此段在存储器中装入的位置,run 指示此段在存储器中运行的位置
align 为此段分配具体的空间。{}中可以标明所在的目标文件。
*/

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]