DSP的CMD文件详解(整理版).docx

上传人:夺命阿水 文档编号:1142669 上传时间:2024-03-24 格式:DOCX 页数:18 大小:42.45KB
返回 下载 相关 举报
DSP的CMD文件详解(整理版).docx_第1页
第1页 / 共18页
DSP的CMD文件详解(整理版).docx_第2页
第2页 / 共18页
DSP的CMD文件详解(整理版).docx_第3页
第3页 / 共18页
DSP的CMD文件详解(整理版).docx_第4页
第4页 / 共18页
DSP的CMD文件详解(整理版).docx_第5页
第5页 / 共18页
点击查看更多>>
资源描述

《DSP的CMD文件详解(整理版).docx》由会员分享,可在线阅读,更多相关《DSP的CMD文件详解(整理版).docx(18页珍藏版)》请在课桌文档上搜索。

1、DSP的CMD文件详解CMD是用来分配ROM和RAM空间用的,告诉链接程序若何计算地址和分配空间。所以不同的芯片就有不同大小的ROM和RAM,存放用户程序的地方也不尽一样。所以要根据芯片进展修改,分为MEMORY和SECTIONS两个局部。MEMORY(PAGE0PAGE1)SECTIONS(.vectors.reset)MEMORY是用来指定芯片的ROM和RAM的大小和划分出几个区间。PAGEO对应RoM,PAGEl对应RAM。PAGE里包含的区间名字与其后面的参数反映了该区间的起始地址和长度。SECTIONS:(在程序里添加下面的段名,如.vectors。用来指定该段名以下,另一个段名以上

2、的程序(属于PAGEO)或数据(属于PAGEl)放到“符号后的空间名字所在的地方。)SECTIONS.vectors:VECSPAGE0.reset:VECSPAGE0eg:MEMORY(PAGE0:VECS:origin=00000h,length=00040h1.OW:origin=00040h,length=03FC0hSARAM:origin=04000h,length=00800hBO:origin=OFFOOh,length=OOlOOhPAGE1:BO:origin=00200h,length=001OOhB1:origin=00300h,length=001OOhB2:orig

3、in=00060h,length=00020hSARAM:origin=08000h,length=00800hSECTIONS.text:LOWPAGE0.cinit:LOWPAGE0.switch:LOWPAGE0.const:SARAMPAGE1.data:SARAMPAGE1.bss:SARAMPAGE1.stack:SARAMPAGE1.sysmem:SARAMPAGE1)由三局部组成:输入/输出定义:这一局部,可以通过ccs的“BuildOption菜单设置:.obj(链接的目标文件)、.lib(链接的库文件)、.map(生成的穿插索引文件)、.out(生成的可执行代码)。MEMO

4、RY命令:描述系统实际的硬件资源SECTloN命令:描述“段若何定位例子:d文件-C-Ohello.out-mhello.map-stack100-1rts2xx.libMEMORYPAGE0:VECT:origin=0x8000,length0x040PAGE0:PROG:origin=0x8040,length0x6000PAGE1:DATA:origin=0x8000,length0x400)SECTIONS.vextorsVECTPAGE0.textPROGPAGE0.bssDATAPAGE1.constDATAPAGE1)存储模型:C程序的代码和数据若何定位系统定义:.cinit存放

5、程序中的变量初值和常量.const存放程序中的字符常量、浮点常量和用ConSt声明的常量.switch存放程序中SWitCh语句的跳转地址表.text存放程序代码.bss为程序中的全局和静态变量保存存储空间.far为程序中用far声明的全局和静态变量保存空间.stack为程序系统堆栈保存存储空间,用于保存返回地址、函数间的参数传递、存储局部变量和保存中间结果.sysmem用于程序中的ma11oc、calloc、和realoc函数动态分配存储空间CMD的专业名称叫链接器配置文件,是存放链接器的配置信息的,我们简称为命令文件,其中比较关键的就是MEMORY和SECTloNS两个伪指令的使用,常常令

6、人困惑,系统出现的问题也经常与它们的不当使用有关。CCS是DSP软件对DOS系统继承的开发环境,CCS的命令文件经过DOS命令文件长时间的引申开展,已经变得非常简洁(不知道Tl文档有没有详细CMD配置说明)。我学CMD是从DOS里的东西开场的,所以也从DC)S环境下的CMD说起:1、命令文件的组成命令文件的开头局部是要链接的各个子目标文件的名字,这样链接器就可以根据子目标文件名,将相应的目标文件链接成一个文件;接下来就是链接器的操作指令,这些指令用来配置链接器,接下来就是MEMORY和SECTIONS两个伪指令的相关语句,必须大写。MEMORY,用来配置目标存储器,SECTIONS用来指定段的

7、存放位置。结合下面的典型DOS环境的命令文件linkd来做一下说明:file.obj子目标文件名1file2.obj子目标文件名2file3.obj子目标文件名3-0PrOg.out/连接器操作指令,用来指定输出文件-mprog.m用来指定MAP文件MEMORY略SECTIONS略Otherlinkd本命令文件Iinkd要调用的OtherIinkd等其他命令文件,那么文件的名字要放到本命令文件最后一行,因为放开头的话,链接器是不会从被调用的其他命令文件中返回到本命令文件。2、MEMORY伪指令MEMORY用来建设目标存储器的模型,SECTIONS指令就可以根据这个模型来安排各个段的位置,MEM

8、ORY指令可以定义目标系统的各种类型的存储器及容量。MEMORY的语法如下:MEMORY(PAGE0:namel(attr):origin=constant,length=constantnameln(attr):origin=constant,length=constantPAGE1:name2(attr):origin=ConstantJength=constantname2n(attr):origin=constant,length=constantPAGEn:namen(attr):origin=constant,length=constantnamenn(attr):origin=c

9、onstant,length=constantPAGE关键词对独立的存储空间进展标记,页号n的最大值为255,实际应用中一般分为两页,PAGEO程序存储器和PAGEl数据存储器。name存储区间的名字,不超过8个字符,不同的PAGE上可以出现一样的名字(最好不用,免的搞混),一个PAGE内不许有一样的nameoattr的属性标识,为R表示可读;W可写X表示区间可以装入可执行代码;I表示存储器可以进展初始话,什么属性代码也不写,表示存储区间具有上述的四种属性,基本上我们都选择这种写法。Origin:略。Iength:略。下面是经常用的2407的简单写法大家参考,程序从0x060开场,要避开加密位

10、,不从OXO044开场更可靠一点,此例中的同名的页可以只写第一个,其后省略,但写上至少安全一点:MEMORY(PAGE0:VECS:origin=0x0000,length0x40PAGE0:PROG:origin=0x0060,length0x6000PAGE1:B0:origin=0x200,length0x100PAGE1:Bl:origin=0x300,length0x100PAGE1:DATA:origin=0x0860,length0x07803、SECrnoNS伪指令SECTIONS指令的语法如下:SECTIONS(.text:所有.text输入段名load=加载地址run二运行

11、地址.data:所有.data输入段名load=加载地址run二运行地址.bss:所有.bss输入段名load=加载地址run=运行地址.other:所有.other输入段名load=加载地址run二运行地址)SECTIONS必须用大写字母,其后的大括号里是输出段的说明性语句,每一个输出段的说明都是从段名开场,段名之后是若何对输入段进展组织和给段分配存储器的参数说明:以MXt段的属性语句为例,“所有MXt输入段名这段内容用来说明连接器输出段的.text段由哪些子目标文件的段组成,举例如下SECTIONS(.text:filel.obj(.text)file2(.text)file3(.text

12、,cinit)略)指明输出段.text要链接filel.obj的.text和file2的.text还有file3的.text和.cinit。在CCS的SECTIONS里通常只写一个中间没有内容的“就表示所有的目标文件的相应段。接下来说明“load=加载地址run=运行地址链接器为每个输出段都在目标存储器里分配两个地址:一个是加载地址,一个是运行地址。通常情况下两个地址是一样的,可以认为输出段只有一个地址,这时就可以不加“run=运行地址这条语句了;但有时需要将两个地址分开,比方将程序加载到FLASH,然后放到RAM中高速运行,这就用到了运行地址和加载地址的分别配置了,如下例所示:.const:

13、略load=PROGrun=0x0800,常量加载在程序存储区,配置为在RAM里调用。load=加载地址的几种写法需要说明一下,首先“load关键字可以省略,“=可以写成“,”加载地址可以是:地址值、存储区间的名字、PAGE关键词等,所以大家见到text0x0080这样的语句可千万不要奇怪。run=运行地址中的“=可以用“,其它的简化写法就没有了。大家不要乱用。4、CCS中的案例在CCS中的命令文件好似简化了不少,少了很多东西,语句也精简了好多,首先不用指定输入链接器的目标文件,CCS会自动默认处理,其次链接器的配置命令也和DOS的环境不同,需要了解的请找Tl文档吧!下面是刘和平书中的例子,大

14、家来看看是不是可以很准确的理解了呢!-stack40MEMORYPAGE0:VECS:origin=Oh,length=40hPVECS:origin=40h,length=70hPROG:origin=ObOh,length=7F50hPAGE1:MMRS:origin=Oh,length=05FhB2:origin=0060h,length=020hBO:origin=0200h,length=100hBl:origin=0300h,length=100hSARAM:origin=0800h,length=0800hEXT:origin=8000h,length=8000h)SECTION

15、S(.reset:VECSPAGEO.vectors:VECSPAGEO.pvecs:PVECSPAGE0.text:PROGPAGEO.cinit:PROGPAGEO.bss:SARAMPAGE1.const:SARAMPAGE1.stack:B1PAGE1第二章CMD文件的编写1、COFF格式1通用目标文件格式(CommonObjectFileFormat)是一种流行的二进制可执行文件格式,二进制可执行文件包括库文件UibL目标文件(Obj)最终可执行文件(OUt)o,现今PC机上的Windows95和NT4.0以后的操作系统的二进制文件格式(PE)就是在COFF格式根基上的进一步扩大。2

16、COFF格式:详细的CoFF文件格式包括段头,可执行代码和初始化数据,可重定位信息,行号入口,符号表,字符串表等,这些属于编写操作系统和编译器人员关心范畴。而对于C只需要了解定义段和给段分配空间就可以了。3采用COFF更有利于模块化编程,程序员可以自由决定愿意把哪些代码归属到哪些段,然后加以不同的处理。2、Section目标文件中最小单位称为块。一个块就是最终在存储器映象中占据连续空间的一段代码或数据。1COFF目标文件包含三个默认的块:.text可执行代码.data已初始化数据.bss为未初始化数据保存的空间2汇编器对块的处理未初始化块:上SS变量存放空间.usect用户自定义的未初始化段初

17、始化块:.text汇编指令代码.data常数数据(比方对变量的初始化数据).sect用户自定义的已初始化段.asect通.sect,多了绝对地址定位功能,一般不用3C语言的段未初始化块(data):.bss存放全局和静态变量.ebss长调用的.bss(超过了64K地址限制).stack存放C语言的栈.sysmem存放C语言的堆.esysmem长调用的.sysmem(超过了64K地址限制)初始化块:.text可执行代码和常数(PrOgram).switchswitch语句产生的常数表格(PrOgram/低64K数据空间).pinitTablesforglobalconstructors(C+)(

18、program).cinit用来存放对全局和静态变量的初始化常数值(PrOgram).const全局和静态的COnSt变量初始化值和字符串常数,(data).econst长.const(可定位到任何地方)(data)3自定义段(C语言)pragmaDATA_SECTION(函数名或全局变量名J用户自定义在数据空间的段名”);#PragmaCoDE_SECTION(函数名或全局变量名,”用户自定义在程序空间的段名”),不能在函数体内声明,必须在定义和使用前声明,#Pragma可以阻止对未调用的函数的优化3、连接命令文件(CMD)1MEMORY指定存储空间MEMORY(PAGE0:name0att

19、r:origin=constant,length=constantPAGEn:namenattr:origin=constant,length=constant)PAGEn:标示存储空间,nSECTIONS分配段SECTIONS(name:property,property,)name:输出段的名称property:输出段的属性:load=allocation(强制地址或存储空间名称)同allocation:定义输出段将会被装载到哪里。run=allocation(强制地址或存储空间名称)同a11ocation:定义输出段将会在哪里运行。注:CMD文件中只出现一个关键字load或run时,表示

20、两者的地址时表示两者的地址时重合的。PAGE=n,段位于那个存储页面空间。例:ramfuncs:LOAD=FLASHD,RUN=RAMLO,1.OAD_START(_RamfuncsLoadStart),LOAD_END(_RamfuncsLoadEnd),RUN_STARTJRamfuncsRunStart),PAGE=03直接写编译命令- 1rts2800,ml.lib连接系统文件rts2800_ml.lib- Ofilename.out最终生成的二进制文件命名为filename.out- mfilename.map生成映射文件filename.map- stack0x200堆栈为512字

21、4、.const段:由关键字ConSt限定的全局变量(COnSt限定的局部变量不产生)初始化值,和出现在表达式(做指针使用,而用来初始化字符串数组变量不产生)中的字符串常数,另外数组和构造体是局部变量时,其初始值会产生.const段,而全局时不产生。DSP的CMD文件讲解2:CMD文件由三局部组成:(1)输入输出定义;MEMORY命令;SECTION命令。输入/输出定义:这一局部,可以通过CCS的BuildOption菜单设置。Obj链接的目标文件。Iib链接的库文件。map生成的穿插索引文件。out生成的可执行代码MEMORY命令:描述系统实际的硬件资源SECTIoN命令:描述“段若何定位下

22、面给出一个例子:-C- ohello,out- mhello,map-stack100- 1rts2xx.libMEMORY(PAGE0:VECT:origin=0x8000,length0x040PAGE0:PR0G:origin=0x8040,length0x6000PAGE1:DATAiorigin=OxSOOO,length0x400)SECTIONS(.vextorsVECTPAGE0.textPROGPAGE0.bssDATAPAGE1.constDATAPAGE1存储模型说明:.cinit存放程序中的变量初值和常量.const存放程序中的字符常量、浮点常量和用COnSt声明的常量

23、.switch存放程序中switch语句的跳转地址表.text存放程序代码.bss为程序中的全局和静态变量保存存储空间.far为程序中用far声明的全局和静态变量保存空间.stack为程序系统堆栈保存存储空间,用于保存返回地址、函数间的参数传递、存储局部变量和保存中间结果.sysmem用于程序中的ITlallOC、calIoc、和rcaloc函数动态分配存储空间.text可执行代码一、CMD命令文件常用的伪指令.cint:存放已明确初始化的全局变量和静态变量2、 .const:存放己明确初始化的字符串常量、全局变量和静态常量3、 .switch:存放对于大型SWitCh语句的跳转表4、 .te

24、xt:存放可执行代码和浮点数常量5、 .bss:存放没有初始化的全局变量和静态变量6、 .stack:定义软件堆栈二、CMD命令文件内容CMD是用来分配程序存储器空间rom和数据存储器空间ram的,告诉链接程序若何计算地址和分配空间。不同的芯片有不同大小的rom和ram,放用户程序的地方也不尽一样,所以要根据DSP的存储器的地址范围来编写。分两局部:MEMoRY和SECTlONS.1.MEMORY是用来指定芯片的rom和ram的大小和划分出几个区间。MEMORYPAGE0:namel(attr):origin=constant,Iength=Constant;PAGE1:namen(attr)

25、:origin=constant,Iength=Constant;)PAGEO对应rom,PAGEl对应ram。PAGE里包含的区间名字与其后面的参数反映了该区间的起始地址和长度。name存储器名称,同一页上的存储器名称不能一样,不同页上的可以一样。attr存储区的属性,未规定的可以有R(只读)、W(只写)、X(存储器可以包含可执行代码)、I(存储器可以被初始化)。2、SeCtion块用来控制段的构成与地址分配。对于不同的系统配置,SeCtiOn的分配方式也不一样,链接器通过SeCtiOn来控制地址的分配,所以SeCtiOn的分配成了配置Cl文件的重要环节。SECTIONS(.vectors:

26、VECSPAGE0.reset:)VECSPAGE0)它分成两个基本的局部:(1)被初始化的SCCtiOn(包含数据表和可执行代码).text:它包含所有的可执行代码和常数,必须放在程序页.cinit:它包含初始化的变量和常量表,要求放在程序页.pinit:它包括全局构造器(C+)初始化的变量表,要求放在程序页.const:它包括字符串、声明、以及被明确初始化过的全局和静态变量,要求放在低地址数据页。.econst:是在使用大存储器模式时使用的,包括字符串、声明、以及被明确初始化过的全局变量和静态变量,可以在数据页的任何地方。.switch:它包括为转换声明设置的表格,可以放在程序页,也可以放

27、在低地址的数据页。(2)未被初始化的SeCtiOn(为程序运行中创立和存放的变量在存储器中保存空间).bss:它为全局变量和静态变量保存空间.在程序开场运行时,C导入路径把数据从.cinit节复制出去然后存在.bss节中.要求放在低地址的数据页.ebbs:它是在远访问(C)和大存储器模式下使用,它为全局变量和静态变量保存空间.在程序开场运行时,C导入路径把数据从.cinit段复制出去然后存在.ebss节中可以存放在数据页的任何地方。.stack:为C系统堆栈保存空间,这局部存储器为用来将声明传给函数及为局部变量留出空间。要求放在低地址的数据页。,system:动态存储器分配保存空间,这个空间用

28、于InaIloC函数,如果不使用InallOC函数,这个段的大小就是0。要求放在低地址的数据页。.esystem:动态存储器分配保存空间,这个空间用于外部InalIOC函数,如果不使用外部InaIIOC函数,这个段的大小就是0。可也放在数据页的任何地方eg:命令文件例如程序复位MEMORYPAGE0:VECS:origin=00000h,length=00040hPVECS:origin=00040h,length=00070h外围模块中断向量PROG:origin=OOObOh,length=07F50h片上FlaShPAGE1:B0:origin=00200h,length=00100h/

29、DRAMBO块Bl:origin=00300h,length=00100h/DRAMBl块B2:origin=00060h,length=00020h/DRAMB2块SARAM:origin=00800h,length=00800h/SRAM块EXT:origin=08000h,length=08000h外部存储器)SECTIONS(.reset:VECSPAGE0复位中断向量.vectors:VECSPAGE0/中断向量表.pvecs:PVECSPAGE0外围模块中断向量表text:PROGPAGE0代码cinit:PROGPAGE0bss:SARAMPAGE1块B2const:SARAMP

30、AGE1块B2stack:)BlPAGE1堆栈,40个单元DSP的CMD文件写法综述DSP的存储器的地址范围,CMD是主要是根据那个来编的。CMD它是用来分配rom和ram空间用的,告诉链接程序若何计算地址和分配空间.所以不同的芯片就有不同大小的rom和ram.放用户程序的地方也不尽一样.所以要根据芯片进展修改.分两局部.MEMORY和SECTIONS.MEMoRYPAGEOPAGE1)SECTIONSSECTIONS.vectors.reset)MEMORY是用来指定芯片的rom和ram的大小和划分出几个区间.PAGE0对应rom;PAGE1对应ramPAGE里包含的区间名字与其后面的参数反

31、映了该区间的起始地址和长度.SECTloNS:(在程序里添加下面的段名如.vectors.用来指定该段名以下,另一个段名以上的程序(属于PAGEo)或数据(属于PAGEI)放到符号后的空间名字所在的地方。SECTIONS(.vectors:VECSPAGE0*Interruptvectortable*/.reset:VECSPAGE0*Resetcode*/)eg:MEMoRY(PAGE0:VECS:origin=00000h,length=00040h1.OW:origin=00040hzlength=03FCOhSARAM:origin=04000hzlength=00800h80: origin=OFFOOh,length=00100hPAGE1:B0:origin=00200hzlength=00100h81: origin=00300h,length=00100h82: origin=00060h,length=00020hSARAM:origin=08000h,length=00800h)SECTIONS.text:LOWPAGE0.cinit:LOWPAGE0.SWITCH:LOWPAGE0.const:SARAMPAGE1.data:SARAMPAGE1.bss:SARAMPAGE1.stack:SARAMPAGEl.sysmem:SARAMPAGE1

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 在线阅读 > 生活休闲


备案号:宁ICP备20000045号-1

经营许可证:宁B2-20210002

宁公网安备 64010402000986号