文件中的注释采用 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 为此段分配具体的空间。{}中可以标明所在的目标文件。 */ |
联系客服