F2812的CMD文件的编写--经验总结

时间:2022-03-19 20:41:03

CMD文件里包含三部分内容:

1)输入/输出定义:

  .obj文件:链接器要链接的目标文件;

  .lib文件:链接器要链接的库文件;

  .map文件:链接器生成的交叉索引文件;

  .out文件:链接器生成的可执行代码;

  链接器选项

2)MEMORY命令:描述系统实际的硬件资源

3)SECTIONS命令:描述“段”如何定位

 

F2812的CMD文件只包含后两部分,现对它的编写做一下总结:

(一)用于调试时用,取名为SRAM.CMD

这里有个比较标准的F2812的CMD文件,可以供大家借鉴使用:

MEMORY

{

PAGE 0:   

   ZONE0       : origin = 0x002000, length = 0x002000    

   ZONE1       : origin = 0x004000, length = 0x002000    

   RAML0       : origin = 0x008000, length = 0x001000    

   ZONE2       : origin = 0x080000, length = 0x080000    

   ZONE6       : origin = 0x100000, length = 0x080000    

   OTP          : origin = 0x3D7800, length = 0x000800    

   FLASHJ      : origin = 0x3D8000, length = 0x002000    

   FLASHI      : origin = 0x3DA000, length = 0x002000    

   FLASHH      : origin = 0x3DC000, length = 0x004000    

   FLASHG      : origin = 0x3E0000, length = 0x004000    

   FLASHF      : origin = 0x3E4000, length = 0x004000    

   FLASHE      : origin = 0x3E8000, length = 0x004000    

   FLASHD      : origin = 0x3EC000, length = 0x004000    

   FLASHC      : origin = 0x3F0000, length = 0x004000    

   FLASHA      : origin = 0x3F6000, length = 0x002000    

  

   BEGIN_H0    : origin = 0x3F8000, length = 0x000002     

   BEGIN_FLASH : origin = 0x3F7FF6, length = 0x000002    

   PRAMH0      : origin = 0x3F8002, length = 0x001FFE     

   ZONE7       : origin = 0x3FC000, length = 0x003FC0     

   ROM         : origin = 0x3FF000, length = 0x000FC0     // boot ROM available if MP/MCn=0

   RESET       : origin = 0x3FFFC0, length = 0x000002     

   VECTORS     : origin = 0x3FFFC2, length = 0x00003E     

 PAGE 1 :   // Data Memory

   RAMM0       : origin = 0x000000, length = 0x000400    

   RAMM1       : origin = 0x000400, length = 0x000400    

 

   DEV_EMU     : origin = 0x000880, length = 0x000180    

   FLASH_REGS  : origin = 0x000A80, length = 0x000060    

   CSM         : origin = 0x000AE0, length = 0x000010    

   XINTF       : origin = 0x000B20, length = 0x000020    

   CPU_TIMER0  : origin = 0x000C00, length = 0x000008    

   PIE_CTRL    : origin = 0x000CE0, length = 0x000020    

   PIE_VECT    : origin = 0x000D00, length = 0x000100    

   ECAN_A      : origin = 0x006000, length = 0x000100    

   ECAN_AMBOX  : origin = 0x006100, length = 0x000100    

   SYSTEM      : origin = 0x007010, length = 0x000020    

   SPI_A       : origin = 0x007040, length = 0x000010    

   SCI_A       : origin = 0x007050, length = 0x000010    

   XINTRUPT    : origin = 0x007070, length = 0x000010    

   GPIOMUX     : origin = 0x0070C0, length = 0x000020    

   GPIODAT     : origin = 0x0070E0, length = 0x000020    

   ADC         : origin = 0x007100, length = 0x000020    

   EV_A        : origin = 0x007400, length = 0x000040    

   EV_B        : origin = 0x007500, length = 0x000040     

   SCI_B       : origin = 0x007750, length = 0x000010    

   MCBSP_A     : origin = 0x007800, length = 0x000040    

   RAML1       : origin = 0x009000, length = 0x001000    

   FLASHB      : origin = 0x3F4000, length = 0x002000    

   CSM_PWL     : origin = 0x3F7FF8, length = 0x000008     

   DRAMH0      : origin = 0x3f9000, length = 0x001000    

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, TYPE = DSECT  // we are not using the .reset

                                                              // section

 

//Peripheral Frame 0 Register Structures

   DevEmuRegsFile    : > DEV_EMU,     PAGE = 1

   FlashRegsFile     : > FLASH_REGS,  PAGE = 1

   CsmRegsFile       : > CSM,         PAGE = 1

   XintfRegsFile     : > XINTF,       PAGE = 1

   CpuTimer0RegsFile : > CPU_TIMER0,  PAGE = 1 

   PieCtrlRegsFile   : > PIE_CTRL,    PAGE = 1     

   PieVectTable      : > PIE_VECT,    PAGE = 1

 

//Peripheral Frame 1 Register Structures

   SysCtrlRegsFile   : > SYSTEM,      PAGE = 1

   SpiaRegsFile      : > SPI_A,       PAGE = 1

   SciaRegsFile      : > SCI_A,       PAGE = 1

   XIntruptRegsFile  : > XINTRUPT,    PAGE = 1

   GpioMuxRegsFile   : > GPIOMUX,     PAGE = 1

   GpioDataRegsFile  : > GPIODAT      PAGE = 1

   AdcRegsFile       : > ADC,         PAGE = 1

   EvaRegsFile       : > EV_A,        PAGE = 1

   EvbRegsFile       : > EV_B,        PAGE = 1

   ScibRegsFile      : > SCI_B,       PAGE = 1

   McbspaRegsFile    : > MCBSP_A,     PAGE = 1

 

//Peripheral Frame 2 Register Structures

   ECanaRegsFile     : > ECAN_A,      PAGE = 1  

   ECanaMboxesFile   : > ECAN_AMBOX   PAGE = 1

 

//Code Security Password Locations 

   CsmPwlFile        : > CSM_PWL,     PAGE = 1

 

}

 

(二)用于烧写到FLASH中时用,取名为FLASH.CMD

     FLASH.CMD与SRAM.CMD基本一样,只是有两处改动:一是MEMORY中将你的程序代码部分映射到FLASH空间里;二是在SECTIONS中添加一个用户定义的起始段,起始段的代码如下:

//User Defined Sections , Used by file DSP28_CodeStartBranch.asm

   codestart         : > BEGIN,      PAGE = 0         

其中DSP28_CodeStartBranch.asm中的关键代码为:

.ref _c_int00

.sect “codestart”

Code_start:

LB _c_int00

.end

 

(三)SECTIONS中段的含义与用户自定义段的方法

1、各个段的含义

    以下是TI公司的技术文档中对一些段的说明,现截个图给大家参考:

F2812的CMD文件的编写--经验总结  

除此外还有一些段的含义如下(这仅是我见过的,有漏下的还请提示,大家一起学习):

.reset         复位中断向量表

.vectors       中断向量表

.data          已初始化数据,常数数据(比如对变量的初始化数据)

.pvecs         外围模块中断向量表

.ref           引用外部定义的变量或函数名

.global        引用全局变量或函数

.space         定义要保留的空间

.def           定义变量,与#define功能相同

.end           段的结束标识

.sect          用户自定义的已初始化段

.asect         比.sect多了绝对地址定位功能,一般不用

.usect         用户自定义的未初始化段

 

已初始化的段:.text, .cinit, .const, .econst, .pinit, .switch

.text:所有可以执行的代码和常量

.cinit:全局变量和静态变量的C初始化记录

.const:包含字符串常量和初始化的全局变量和静态变量(const)的初始化和说明

.econst:包含字符串常量和初始化的全局变量和静态变量(far const)的初始化和说明

.pinit:全局构造器(C++)程序列表

.switch:包含转换语气声明的列表

非初始化的段:.bss, .ebss, .stack, .sysmem, .esysmem(更好的理解就是,这些段就是存储空间而已)

..bss:为全局变量和局部变量保留的空间,在程序上电时,cinit空间中的数据复制出来并存储在.bss空间中

.ebss:为使用大寄存器模式时的全局变量和静态变量预留的空间,在程序上电时,cinit空间中的数据复制出来并存储在.ebss

.stack:为系统堆栈保留的空间,主要用于和函数传递变量或为局部变量分配空间

.sysmem:为动态存储分配保留的空间。如果有宏函数,此空间被宏函数占用,如果没有宏函数,此空间保留为0

.esysmem:为动态存储分配保留的空间,如果有far函数,此空间被相应的占用,如果没有,此空间保留为0

 

 

2、自定义段的方法:

 我知道的有两种:

(1)用汇编代码,如上述中的codestart段。

       格式为:

       .sect “段名”

       (段的内容)

       .end  

(2)用C语言中的#pragma,如上述中的CsmPwlFile段。

       格式为:

#pragma DATA_SECTION(函数名或变量名,"段名");

#pragma CODE_SECTION(函数名或变量名,"段名");

 

http://www.61ic.com/Services/Course/C2000/201009/27623.html