DSP的CMD文件详解(整理版)
初学CMD文件

一、有关段(sections)的知识汇编器和链接器产生的可被DSP装置执行的目标程序,这些目标文件格式被称为通用目标文件格式(COFF)。
COFF使得模块化编程更容易,它鼓励用户在写汇编语言程序时根据代码块和数据块的方式来思考如何编写程序,这些“模块(block)”就是“段(sections)”。
目标文件的最小单位称为段,段是占据一个连续空间的代码块或数据块,与其他段一起在存储器映射图内。
目标文件的各个段是分开的,有特色的。
一个COFF目标文件总是包含3个默认段:(1).text段,通常包含可执行代码;(2).data段,通常含有初始化数据;(3).bss段,通常为未初始化变量预留的空间。
自定义的段:(1)由汇编伪指令.sect创建的段(2)由汇编伪指令.usect创建的段其中,.text、.data、由.sect创建的段属于初始化段(含有数据和代码);.bss、由.usect创建的段属于未初始化段(为未初始化的数据在存储器映像图内预留空间)。
注:不能用不同的伪指令定义相同的段。
二、由汇编器产生的COFF格式的OBJ文件中的段作为构造块,当有多个文件进行链接时,链接器会将输入段结合在一起产生可执行的COFF输出模块,然后链接器为各输出段选择存储器地址,这就是CMD文件。
CMD文件是用来分配ROM和RAM的,告诉链接程序怎么计算地址和分配空间。
它包括三个部分:(1)输入、输出定义:.obj文件——链接器要链接的目标文件;.lib文件——链接器要链接的库文件;.map文件——链接器生成的交叉索引文件;.out文件——链接器生成的可执行代码。
这部分可通过CCS中的Build Option菜单进行设置。
(2)MEMORY命令:描述系统实际的硬件资源,即指定芯片的ROM和RAM的大小和并划分出的几个区间。
默认的,PAGE0对应ROM(程序存储区),PAGE1对应RAM(数据存储区),例定义一个VECS存储区域,具有R和W属性,填充常数ffffh:MEMORY{PAGE 0:VECS(RW):origin=0000h,length=00ffh,f=ffffh;}注:1)PAGE就是对一个存储空间进行标记,最多可以有255个PAGE,每个PAGE代表一个完全独立的地址空间,不同的PAGE上的存储器区间可以取相同的名字;2)Attr:可选项,规定存储器属性:①R,可以对存储器执行读操作;②W,可以对存储器执行写操作;③X,命名的存储器能包含可执行的代码;④I,可以对存储器进行初始化;3)origin:起始地址,可写成org或o;length:长度,可写成len或l。
CCS中CMD文件的作用

CCS中CMD文件的作用cmd 文件用于DSP 代码的定位。
由于DSP 的编译器的编译结果是未定位的,DSP没有操作系统来定位执行代码,每个客户设计的DSP 系统的配置也不尽相同,因此需要用户自己定义代码的安装位置。
安装位置是指,编译完成的代码是存放在dsp的那个位置,程序空间RAM或者数据空间RAM,起始地址以及长度。
以C5000 为例,基本格式为:-o sample.out //生成.OUT文件-m sample.map //生成MAP文件,MAP文件中包含程序的section信息,用于自举表信息的编写和烧写flash-stack 100 //开辟堆栈sample.obj meminit.obj-l rts.lib //链接rts.lib库MEMORY{PAGE 0: VECT: origin = 0xff80, length 0x80 //page0一般是程序空间,PAGE 0: PROG: origin = 0x2000, length 0x400PAGE 1: DATA: origin = 0x800, length 0x400 //page1一般是数据空间}SECTIONS{.vectors : {} >VECTPAGE 0 //.vectors段是中断向量表,存放在程序空间VECT部分//.text : {} >PROG PAGE 0 // .text 是程序段,放在程序空间PROG部分.data : {} >PROG PAGE 0 //.data是数据段,放在程序空间PROG部分,紧接.text 之后.cinit : {} >PROG PAGE 0 //.cinit 段包含了变量初始化记录.bss : {} >DATA PAGE 1 //.bss段是未初始化段,放在数据空间DATA部分}连接器会自动创建以下的段:The C54x compiler creates the following sections:初始化段包含数据和可执行代码。
CMD文件的设定

FLASHE
: origin = 0x3E8000, length = 0x004000
FLASHD
: origin = 0x3EC000, length = 0x004000
FLASHC
: origin = 0x3F0000, length = 0x004000
FLASHA
: origin = 0x3F6000, length = 0x001F80
}
Code 放在 FlashA;
我们可以修改 cmd 文件;如我们把 FLASHC-J 当作一个 FLASH,即
FLASHJ
: origin = 0x3D8000, length = 0x018000 /* on-chip FLASHC-J */
当然 CECTIONS 段里要把
IQmath
: > FLASHC
CMD 文件的设定
以.CMD 为扩展名的文件,这个文件的作用是用来分配存储空间的。由于 DSP 编译器 的编译结果是未定位的,DSP 也没有操作系统来定位执行代码,DSP 系统的配置需求也不 尽相同,因此我们根据实际的需求,自己定义代码的存储位置。打个通俗的比喻,就是我们 有一个仓库,现在需要把货物存放到仓库里面去,为了便于日后取用货物,我们将货物分门 别类,然后把它们存放到指定的位置去。把哪些货物放到哪个位置的规则,就是我们的 CMD 文件的内容。
PAGE = 0
.reset
: > RESET,
PAGE = 0, TYPE = DSECT /* not used, */
.stack
: > RAMM1,
PAGE = 1
.ebss
: > DRAMH0,
CMD配置介绍

最近有很多新手问关于cmd的编写问题,这里粗略的讲一下:DSP的存储器的地址范围,CMD是主要是根据那个来编的。
CMD 它是用来分配rom和ram空间用的,告诉链接程序怎样计算地址和分配空间.所以不同的芯片就有不同大小的rom和ram.放用户程序的地方也不尽相同.所以要根据芯片进行修改.分两部分.MEMORY和SECTIONS.MEMORY{ PAGE 0 ..........PAGE 1.........}SECTIONS{SECTIONS{.vectors ..................reset .................................}MEMORY是用来指定芯片的rom和ram的大小和划分出几个区间.PAGE 0 对应romAGE 1对应ramPAGE 里包含的区间名字与其后面的参数反映了该区间的起始地址和长度.SECTIONS:(在程序里添加下面的段名如.vectors.用来指定该段名以下,另一个段名以上的程序(属于PAGE0)或数据(属于PAGE1)放到“>”符号后的空间名字所在的地方。
SECTIONS{.vectors : { } > VECS PAGE 0 /* Interrupt vector table */.reset : { } > VECS PAGE 0 /* Reset code */..................................}eg:MEMORY{PAGE 0: VECS: origin = 00000h, length = 00040hLOW: origin = 00040h, length = 03FC0hSARAM: origin = 04000h, length = 00800hB0: origin = 0FF00h, length = 00100hPAGE 1: B0: origin = 00200h, length = 00100hB1: origin = 00300h, length = 00100hB2: origin = 00060h, length = 00020hSARAM: origin = 08000h, length = 00800h}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}最近在搞CMD看到你的帖子.不由有些感想我想这些东西不是你写的吧.是从那里摘抄的吧希望你的就自己做的东西.把CMD这部分好好写写.不要这样写我想.你既然知道CMD.想必水平也不是很低.但是看到你写的东西真的不是很...做为一个斑竹.或是一个爱好者最少要写一个有自己见解的东西我最近也在学习DSP.所以对CMD这部分比较感兴趣.这是我的问题.希望大家能看看.如果我解决了。
CMD命令文件详解

CMD 命令文件解析CMD 文件的专业名称叫做链接器配置文件,用以存放链接器的配置信息,简称命令文件。
其中比较关键的就是MEMORY、SECTIONS两个伪指令的使用。
MEMORY和SECTIONS 的相关语句必须使用大写字符。
MEMORY是用以配置目标存储器的,而SECTIONS是用以指定段的存放位置的。
1 存储空间的配置DSP存储器分为三个独立选择的空间:程序空间、数据空间和I/O空间,其中程序存储器存放待执行的指令和执行中所用的系数(常数),可使用片内或片外的RAM、ROM、EPROM 等构成;数据存储器存放指令执行中产生的数据,可使用片内或片外的RAM和ROM来构成。
I/O存储器存放与映像外围接口相关的数据,也可以作为附加的数据存储空间来使用。
下表是TMS320F28335的存储空间分布:TMS320F28335的存储空间分布:2 BootRomBootRom 是位于存储器地址0x3F E000 ~ 0x3F FFFF处的8K * 16位存储区域。
并利用M0区域的0x0002 ~ 0x004E作为其Boot程序的堆栈和ebss区。
其内存映射如下:3 Cmd 文件的分配方法TI公司新的汇编器和链接器创建的目标文件采用一种COFF(通用目标文件格式),该目标文件格式更利于模块化编程,为管理代码段和目标系统存储器提供了强有力和灵活的编程方法。
用户可以通过编写链接命令文件(cmd文件)将链接信息放在一个文件中,以便在多次使用同样的链接信息时调用。
在命令文件中使用两个十分有用的伪指令MEMORY 和SECTIONS,来指定实际应用中的存储器结构和进行地址的映射。
M EMORY用来指定目标存储器结构,MEMORY下可以通过PAGE选项配置地址空间。
链接器把每一页都当作一个独立的存储空间,通常情况下,PAGE0 代表程序存储器用来存放程序,PAGE1 代表数据存储器,用来存放数据。
由编译器生成的可重定位的代码和数据块叫做“SECTIONS”(段),SECTIONS 用来控制段的构成与地址分配。
DSP2812的标准CMD文件

DSP2812的标准CMD文件MEMORY{PAGE0:/*Program Memory*/ZONE0:origin=0x002000,length=0x002000/*XINTF zone0*/ZONE1:origin=0x004000,length=0x002000/*XINTF zone1*/RAML0:origin=0x008000,length=0x001000/*on-chip RAM block L0*/ZONE2:origin=0x080000,length=0x080000/*XINTF zone2*/ZONE6:origin=0x100000,length=0x080000/*XINTF zone6*/OTP:origin=0x3D7800,length=0x000800/*on-chip OTP*/FLASHJ:origin=0x3D8000,length=0x002000/*on-chip FLASH*/FLASHI:origin=0x3DA000,length=0x002000/*on-chip FLASH*/FLASHH:origin=0x3DC000,length=0x004000/*on-chip FLASH*/FLASHG:origin=0x3E0000,length=0x004000/*on-chip FLASH*/FLASHF:origin=0x3E4000,length=0x004000/*on-chip FLASH*/FLASHE:origin=0x3E8000,length=0x004000/*on-chip FLASH*/FLASHD:origin=0x3EC000,length=0x004000/*on-chip FLASH*/FLASHC:origin=0x3F0000,length=0x004000/*on-chip FLASH*/FLASHA:origin=0x3F6000,length=0x002000/*on-chip FLASH*/BEGIN:origin=0x3F8000,length=0x000002/*Part of ed for"boot to H0"bootloader mode.*/PRAMH0:origin=0x3F8002,length=0x001FFE/*0xFF E/*portion of H0we've mapped to PAGE0*//*ZONE7:origin=0x3FC000,length=0x003FC0/ *XINTF zone7available if MP/MCn=1*/ROM:origin=0x3FF000,length=0x000FC0/*boot ROM available if MP/MCn=0*/RESET:origin=0x3FFFC0,length=0x000002/*part of boot ROM(MP/MCn=0)or XINTF zone7(MP/MCn=1)* /VECTORS:origin=0x3FFFC2,length=0x00003E/ *part of boot ROM(MP/MCn=0)or XINTF zone7(MP/MCn=1)*/PAGE1:/*Data Memory*/RAMM0:origin=0x000000,length=0x000400/*on-chip RAM block M0*/RAMM1:origin=0x000400,length=0x000400/*on-chip RAM block M1*/DEV_EMU:origin=0x000880,length=0x000180/ *device emulation registers*/FLASH_REGS:origin=0x000A80,length=0x000060/*F LASH registers*/CSM:origin=0x000AE0,length=0x000010/*code security module registers*/XINTF:origin=0x000B20,length=0x000020/*external interface registers*/CPU_TIMER0:origin=0x000C00,length=0x000008/*C PU Timer0registers(CPU Timer1and Timer2are reserved for BIOS)*/ PIE_CTRL:origin=0x000CE0,length=0x000020/* PIE control registers*/PIE_VECT:origin=0x000D00,length=0x000100/* PIE vector table*/ECAN_A:origin=0x006000,length=0x000100/*eCAN registers*/ECAN_AMBOX:origin=0x006100,length=0x000100/*e CAN mailboxes*/SYSTEM:origin=0x007010,length=0x000020/*System control registers*/SPI_A:origin=0x007040,length=0x000010/*SPI registers*/SCI_A:origin=0x007050,length=0x000010/*SCI-A registers*/XINTRUPT:origin=0x007070,length=0x000010/* external interrupt registers*/GPIOMUX:origin=0x0070C0,length=0x000020/ *GPIO mux registers*/GPIODAT:origin=0x0070E0,length=0x000020/ *GPIO data registers*/ADC:origin=0x007100,length=0x000020/*ADC registers*/EV_A:origin=0x007400,length=0x000040/*Event Manager A registers*/EV_B:origin=0x007500,length=0x000040/*Event Manager B registers*/SCI_B:origin=0x007750,length=0x000010/*SCI-B registers*/MCBSP_A:origin=0x007800,length=0x000040/ *McBSP registers*/RAML1:origin=0x009000,length=0x001000/*on-chip RAM block L1*/FLASHB:origin=0x3F4000,length=0x002000/*on-chip FLASH*/CSM_PWL:origin=0x3F7FF8,length=0x000008/ *CSM password locations in FLASHA*/DRAMH0:origin=0x3f9000,length=0x001000/*portion of H0we've mapped to PAGE1*/}SECTIONS{/***Compiler Required Sections***/.text:>PRAMH0,PAGE=0.cinit:>PRAMH0,PAGE=0.stack:>RAMM1,PAGE=1.bss:>RAMM0,PAGE=1.ebss:>RAMM0,PAGE=1.const:>RAMM0,PAGE=1.econst:>RAMM0,PAGE=1.sysmem:>RAMM1,PAGE=1.reset:>RESET,PAGE=0,TY PE=DSECT/*we are not using the.reset section*//***User Defined Sections***/codestart:>BEGIN,PAGE=0/*Used by file DSP28_CodeStartBranch. asm*//***Peripheral Frame0Register Structures***/DevEmuRegsFile:>DEV_EMU,PAGE=1FlashRegsFile:>FLASH_REGS,PAGE=1CsmRegsFile:>CSM,PAGE=1XintfRegsFile:>XINTF,PAGE=1CpuTimer0RegsFile:>CPU_TIMER0,PAGE=1PieCtrlRegsFile:>PIE_CTRL,PAGE=1PieVectTable:>PIE_VECT,PAGE=1/***Peripheral Frame1Register Structures***/SysCtrlRegsFile:>SYSTEM,PAGE=1SpiaRegsFile:>SPI_A,PAGE=1SciaRegsFile:>SCI_A,PAGE=1XIntruptRegsFile:>XINTRUPT,PAGE=1GpioMuxRegsFile:>GPIOMUX,PAGE=1GpioDataRegsFile:>GPIODAT PAGE=1AdcRegsFile:>ADC,PAGE=1 EvaRegsFile:>EV_A,PAGE=1 EvbRegsFile:>EV_B,PAGE=1 ScibRegsFile:>SCI_B,PAGE=1McbspaRegsFile:>MCBSP_A,PAGE=1/***Peripheral Frame2Register Structures***/ECanaRegsFile:>ECAN_A,PAGE=1ECanaMboxesFile:>ECAN_AMBOX PAGE=1/***Code Security Password Locations***/CsmPwlFile:>CSM_PWL,PAGE=1}。
TMS320F28335_CMD命令

ž 编写CMD文件,就是要搞清楚以下情况,并
ž 存储模型:c程序的代码和数据如何定位
存放程序中的变量初值和常量 ž .const 存放程序中的字符常量、浮点常量 和用const声明的常量 ž .switch 存放程序中switch语句的跳转地址 表 ž .text 存放程序代码 ž .bss 为程序中的全局和静态变量保留存储 空间
ž 3>
PDF 文件使用 "pdfFactory Pro" 试用版本创建
ž ramfuncs ž ž
: LOAD = FLASHD, RUN = RAML0,
LOAD_START(_RamfuncsLoadStart),
ž
LOAD_END(_RamfuncsLoadEnd),
ž 用户编写完自己的程序以后,要经过开发环
PDF 文件使用 "pdfFactory Pro" 试用版本创建
诉链接程序怎样计 ž 算地址和分配空间。所以不同的芯片就有不 同大小的ROM和RAM, ž 存放用户程序的地方也不尽相同。所以要根 据芯片进行修改,分为 ž MEMORY和SECTIONS两个部分。
• .stack 存放C语言的栈
• .switch switch语句产生的常数表格(program/低64K数据空间) • .pinit Tables for global constructors (C+it 用来存放对全局和静态变量的初始化常数值(program) .const 全局和静态的const变量初始化值和字符串常数(data) .econst 长.const(可定位到任何地方)(data)
[原]TMS320F28335项目开发记录6_28335之cmd文件详解
![[原]TMS320F28335项目开发记录6_28335之cmd文件详解](https://img.taocdn.com/s3/m/911b8f5bcf84b9d528ea7a16.png)
[原]TMS320F28335项目开发记录6_28335之cmd文件详解2014-11-3阅读970 评论01.CMD文件的作用CMD文件的作用就像仓库的货物摆放记录一样,为程序代码和数据分配指定的空间。
2.C语言生成的段C语言生成的段大致分为两大类:初始化和未初始化,已初始化的段含有真正的指令和数据,未初始化段只是保留变量的地址空间。
已初始化段通常放在程序空间,未初始化段通常放在数据空间。
已初始化段:.text——C语言编译生成的汇编指令代码存放于此.cinit——存放初始化的全局和静态变量.const——字符串常量和const定义的全局和静态变量.econst——字符串常量和far const定义的全局和静态变量.print——全局构造器(C++)程序列表.switch——存放switch语句产生的常数表格以.const段为例:const int a = 10; //注意必须是全局的如果声明为局部const初始化变量,不会放在.const段,局部变量都是运行时放在.bss段中char * p = "ABC";数组和结构体的初始值——是局部变量时,产生的是.const,如果是全局变量,产生的是.cinit未初始化段:.bss——为全局变量和局部变量保留的空间,程序上电时,.cinit空间中的数据复制出来并存放在.bss空间中.ebss——为使用大寄存器模式时预留的全局和局部变量空间,程序上电时,.cinit空间中的数据复制出来并存放在.bss空间中.stack——堆栈空间,主要用于函数传递变量或为局部变量分配空间.system——为动态存储分配保留的空间(malloc),如果有宏函数,此空间被占用.esystem——为动态存储分配保留的空间(far malloc),如果有far函数,此空间会被占用3.自定义段上面的都是官方预先定义好的,我们可以定义自己的段么?可以,使用如下语句:#pragma CODE_SECTION(symbol, "section name");#pragma DATA_SECTION(symbol, "section name");symbol——符号,可以是函数名/变量名section name——自定义的段名CODE_SECTION用来定义代码段DATA_SECTION用来定义数据段注意:不能再函数体内声明#pragma;必须在符号被定义和使用之前声明#pragma例子:#pragma DATA_SECTION(data, "data_name");char data[100];4.CMD文件在DSP28335工程文件里(不用BIOS产生CMD文件),手写CMD文件一般有两个,RAM里调试时用的两个CMD文件分别为DSP2833x_Headers_nonBIOS.cmd 和28335_RAM_lnk.cmd,烧写到flash里时用的两个CMD文件分别为DSP2833x_Headers_nonBIOS.cmd和F28335.cmd,其中DSP2833x_Headers_nonBIOS.cmd文件可以在所有工程文件中通用,主要作用是把外设寄存器产生的数据段映射到对应的存储空间,可以跟DSP2833x_GlobalVariableDefs.c文件对照一下看看。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
DSP的CMD文件详解CMD是用来分配ROM和RAM空间用的,告诉链接程序怎样计算地址和分配空间。
所以不同的芯片就有不同大小的ROM和RAM,存放用户程序的地方也不尽相同。
所以要根据芯片进行修改,分为 MEMORY 和SECTIONS两个部分。
MEMORY{PAGE 0 ..........PAGE 1.........}SECTIONS{.vectors ..................reset .................................}MEMORY是用来指定芯片的ROM和RAM的大小和划分出几个区间。
PAGE 0对应ROM, PAGE 1对应RAM。
PAGE 里包含的区间名字与其后面的参数反映了该区间的起始地址和长度。
SECTIONS:(在程序里添加下面的段名,如.vectors。
用来指定该段名以下,另一个段名以上的程序(属于PAGE0)或数据(属于PAGE1)放到“>”符号后的空间名字所在的地方。
){.vectors : { } > VECS PAGE 0.reset : { } > VECS PAGE 0..................................}eg: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 }{.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}由三部分组成:①输入/输出定义:这一部分,可以通过ccs的“BuildOption........”菜单设置: .obj(链接的目标文件)、.lib(链接的库文件)、.map(生成的交叉索引文件)、.out(生成的可执行代码)。
②MEMORY命令:描述系统实际的硬件资源③SECTION命令:描述“段”如何定位例子:.cmd文件-c-o-m-stack 100-lMEMORY{PAGE 0: VECT:origin=0x8000,length 0x040PAGE 0: PROG:origin=0x8040,length 0x6000PAGE 1: DATA:origin=0x8000,length 0x400}SECTIONS{.vextors >VECT PAGE 0.text >PROG PAGE 0.bss >DATA PAGE 1.const >DATA PAGE 1}存储模型:c程序的代码和数据如何定位系统定义:.cinit 存放程序中的变量初值和常量.const 存放程序中的字符常量、浮点常量和用const声明的常量.switch 存放程序中switch语句的跳转地址表.text 存放程序代码.bss 为程序中的全局和静态变量保留存储空间.far 为程序中用far声明的全局和静态变量保留空间.stack 为程序系统堆栈保留存储空间,用于保存返回地址、函数间的参数传递、存储局部变量和保存中间结果.sysmem 用于程序中的malloc 、calloc 、和realoc 函数动态分配存储空间CMD 的专业名称叫链接器配置文件,是存放链接器的配置信息的,我们简称为命令文件,其中比较关键的就是MEMORY和SECTIONS 两个伪指令的使用,常常令人困惑,系统出现的问题也经常与它们的不当使用有关。
CCS是DSP软件对DOS系统继承的开发环境,CCS的命令文件经过DOS命令文件长时间的引申发展,已经变得非常简洁(不知道TI文档有没有详细CMD配置说明)。
我学CMD是从DOS里的东西开始的,所以也从DOS环境下的CMD说起:1、命令文件的组成命令文件的开头部分是要链接的各个子目标文件的名字,这样链接器就可以根据子目标文件名,将相应的目标文件链接成一个文件;接下来就是链接器的操作指令,这些指令用来配置链接器,接下来就是MEMORY和SECTIONS两个伪指令的相关语句,必须大写。
MEMORY,用来配置目标存储器,SECTIONS 用来指定段的存放位置。
结合下面的典型DOS环境的命令文件来做一下说明:ext: {所有.text输入段名} load=加载地址 run =运行地址.data: {所有.data输入段名} load=加载地址 run =运行地址.bss: {所有.bss输入段名} load=加载地址 run =运行地址.other: {所有.other输入段名} load=加载地址 run =运行地址}SECTIONS必须用大写字母,其后的大括号里是输出段的说明性语句,每一个输出段的说明都是从段名开始,段名之后是如何对输入段进行组织和给段分配存储器的参数说明:以.text段的属性语句为例,“{所有.text输入段名}”这段内容用来说明连接器输出段的.text段由哪些子目标文件的段组成,举例如下SECTIONS{.text:{ (.text) file2(.text) file3(.text,cinit)}略}指明输出段.text要链接的.text和 file2的.text 还有file3的.text和.cinit。
在CCS的SECTIONS里通常只写一个中间没有内容的“{ }”就表示所有的目标文件的相应段。
接下来说明“load=加载地址 run =运行地址”链接器为每个输出段都在目标存储器里分配两个地址:一个是加载地址,一个是运行地址。
通常情况下两个地址是相同的,可以认为输出段只有一个地址,这时就可以不加“run =运行地址”这条语句了;但有时需要将两个地址分开,比如将程序加载到FLASH,然后放到RAM中高速运行,这就用到了运行地址和加载地址的分别配置了,如下例所示:.const :{略} load = PROG run = 0x0800,常量加载在程序存储区,配置为在RAM里调用。
“load=加载地址”的几种写法需要说明一下,首先“load”关键字可以省略,“=”可以写成“>”, “加载地址”可以是:地址值、存储区间的名字、PAGE关键词等,所以大家见到“.text:{ } > 0x0080”这样的语句可千万不要奇怪。
“run =运行地址”中的“ = ”可以用“>”,其它的简化写法就没有了。
大家不要乱用。
4 、CCS中的案例在CCS中的命令文件好像简化了不少,少了很多东西,语句也精简了好多,首先不用指定输入链接器的目标文件,CCS会自动默认处理,其次链接器的配置命令也和DOS的环境不同,需要了解的请找TI文档吧!下面是刘和平书中的例子,大家来看看是不是可以很精确的理解了呢!-stack 40MEMORY{PAGE 0 : VECS : origin = 0h , length = 40hPVECS : origin = 40h , length = 70h PROG : origin = 0b0h , length = 7F50h PAGE 1 : MMRS : origin = 0h , length = 05Fh B2 : origin = 0060h , length = 020h B0 : origin = 0200h , length = 100h B1 : origin = 0300h , length = 100h SARAM : origin = 0800h , length = 0800hEXT : origin = 8000h , length = 8000h}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.const : { } > SARAM PAGE 1.stack : { } > B1 PAGE 1}第二章 CMD文件的编写1、 COFF格式1> 通用目标文件格式(Common Object File Format)是一种流行的二进制可执行文件格式,二进制可执行文件包括库文件(lib),目标文件(obj)最终可执行文件(out)。
,现今PC机上的Windows95和以后的操作系统的二进制文件格式(PE)就是在COFF格式基础上的进一步扩充。
2> COFF格式:详细的COFF文件格式包括段头,可执行代码和初始化数据,可重定位信息,行号入口,符号表,字符串表等,这些属于编写操作系统和编译器人员关心范畴。
而对于C只需要了解定义段和给段分配空间就可以了。
3> 采用COFF更有利于模块化编程,程序员可以自由决定愿意把哪些代码归属到哪些段,然后加以不同的处理。
2、Section目标文件中最小单位称为块。
一个块就是最终在存储器映象中占据连续空间的一段代码或数据。
1> COFF目标文件包含三个默认的块:.text可执行代码.data已初始化数据.bss为未初始化数据保留的空间2> 汇编器对块的处理未初始化块:.bss 变量存放空间.usect 用户自定义的未初始化段初始化块:.text 汇编指令代码.data 常数数据(比如对变量的初始化数据).sect 用户自定义的已初始化段.asect 通.sect,多了绝对地址定位功能,一般不用3>C语言的段未初始化块(data):.bss 存放全局和静态变量.ebss 长调用的.bss(超过了64K地址限制).stack 存放C语言的栈.sysmem 存放C语言的堆.esysmem 长调用的.sysmem(超过了64K地址限制)初始化块:.text 可执行代码和常数(program).switch switch语句产生的常数表格(program/低64K数据空间).pinit Tables for global constructors (C++)(program).cinit 用来存放对全局和静态变量的初始化常数值(program).const 全局和静态的const变量初始化值和字符串常数,(data).econst 长.const(可定位到任何地方)(data)3> 自定义段(C语言)#pragma DATA_SECTION(函数名或全局变量名,"用户自定义在数据空间的段名");#pragma CODE_SECTION(函数名或全局变量名,"用户自定义在程序空间的段名"),不能在函数体内声明,必须在定义和使用前声明,#pragma可以阻止对未调用的函数的优化3、连接命令文件(CMD)1> MEMORY指定存储空间MEMORY{PAGE 0:name 0 [attr] : origin = constant, length = constant PAGE n:name n [attr] : origin = constant, length = constant }PAGE n:标示存储空间,n SECTIONS分配段SECTIONS{name : [property,property,……]}name:输出段的名称property:输出段的属性:load=allocation(强制地址或存储空间名称)同>allocation:定义输出段将会被装载到哪里。