[原创] TMS320F28335项目开发记录6_28335之cmd文件详解

风雨也无晴   2015-3-30 09:30 楼主
1.CMD文件的作用

    CMD文件的作用就像仓库的货物摆放记录一样,为程序代码数据分配指定的空间。

2.C语言生成的段

    C语言生成的段大致分为两大类:初始化和未初始化,已初始化的段含有真正的指令和数据,未初始化段只是保留变量的地址空间。已初始化段通常放在程序空间,未初始化段通常放在数据空间。

已初始化段:

.text——C语言编译生成的汇编指令代码存放于此

.cinit——存放初始化的全局和静态变量

.const——字符串常量和const定义的全局和静态变量

.econst——字符串常量和far const定义的全局和静态变量

.print——全局构造器(C++)程序列表

.switch——存放switch语句产生的常数表格

以.const段为例:

  1. const int a = 10;  //注意必须是全局的 如果声明为局部const初始化变量,不会放在.const段,局部变量都是运行时放在.bss段中  
  2. char * p = "ABC";  
  3. 数组和结构体的初始值——是局部变量时,产生的是.const,如果是全局变量,产生的是.cinit  

未初始化段:

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

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

.stack——堆栈空间,主要用于函数传递变量或为局部变量分配空间

.system——为动态存储分配保留的空间(malloc),如果有宏函数,此空间被占用

.esystem——为动态存储分配保留的空间(far malloc),如果有far函数,此空间会被占用

3.自定义段

上面的都是官方预先定义好的,我们可以定义自己的段么?可以,使用如下语句:

  1. #pragma CODE_SECTION(symbol, "section name");  
  2. #pragma DATA_SECTION(symbol, "section name");  

symbol——符号,可以是函数名/变量名


section name——自定义的段名

CODE_SECTION用来定义代码段

DATA_SECTION用来定义数据段

注意

不能再函数体内声明#pragma;

必须在符号被定义和使用之前声明#pragma

例子:

  1. #pragma DATA_SECTION(data, "data_name");  
  2. 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文件对照一下看看。在我的上一篇文章中也有提到。

    其实我们也不需要详细的知道如何编写cmd文件,可以照着原有的修改就可以了。

    下面是官方28335_RAM_lnk.cmd,一般情况下直接用TI给的,不需要做修改即可满足调试用,模式较固定,当然你也可以做相应的修改用到哪块RAM存储空间,在CMD文件里做相应的分配即可。

  1. MEMORY  
  2. {  
  3. PAGE 0 :  
  4.    /* BEGIN is used for the "boot to SARAM" bootloader mode      */  
  5.   
  6.    BEGIN      : origin = 0x000000, length = 0x000002     /* Boot to M0 will go here                      */  
  7.    RAMM0      : origin = 0x000050, length = 0x0003B0  
  8.    RAML0      : origin = 0x008000, length = 0x001000  
  9.    RAML1      : origin = 0x009000, length = 0x001000  
  10.    RAML2      : origin = 0x00A000, length = 0x001000  
  11.    RAML3      : origin = 0x00B000, length = 0x001000  
  12.    ZONE7A     : origin = 0x200000, length = 0x00FC00    /* XINTF zone 7 - program space */  
  13.    CSM_RSVD   : origin = 0x33FF80, length = 0x000076     /* Part of FLASHA.  Program with all 0x0000 when CSM is in use. */  
  14.    CSM_PWL    : origin = 0x33FFF8, length = 0x000008     /* Part of FLASHA.  CSM password locations in FLASHA            */  
  15.    ADC_CAL    : origin = 0x380080, length = 0x000009  
  16.    RESET      : origin = 0x3FFFC0, length = 0x000002  
  17.    IQTABLES   : origin = 0x3FE000, length = 0x000b50  
  18.    IQTABLES2  : origin = 0x3FEB50, length = 0x00008c  
  19.    FPUTABLES  : origin = 0x3FEBDC, length = 0x0006A0  
  20.    BOOTROM    : origin = 0x3FF27C, length = 0x000D44  
  21.   
  22.   
  23. PAGE 1 :  
  24.    /* BOOT_RSVD is used by the boot ROM for stack.               */  
  25.    /* This section is only reserved to keep the BOOT ROM from    */  
  26.    /* corrupting this area during the debug process              */  
  27.   
  28.    BOOT_RSVD  : origin = 0x000002, length = 0x00004E     /* Part of M0, BOOT rom will use this for stack */  
  29.    RAMM1      : origin = 0x000400, length = 0x000400     /* on-chip RAM block M1 */  
  30.    RAML4      : origin = 0x00C000, length = 0x001000  
  31.    RAML5      : origin = 0x00D000, length = 0x001000  
  32.    RAML6      : origin = 0x00E000, length = 0x001000  
  33.    RAML7      : origin = 0x00F000, length = 0x001000  
  34.    ZONE7B     : origin = 0x20FC00, length = 0x000400     /* XINTF zone 7 - data space */  
  35. }  
  36.   
  37. SECTIONS  
  38. {  
  39.    /* Setup for "boot to SARAM" mode:
  40.       The codestart section (found in DSP28_CodeStartBranch.asm)
  41.       re-directs execution to the start of user code.  */  
  42.    codestart        : > BEGIN,     PAGE = 0  
  43.    ramfuncs         : > RAML0,     PAGE = 0  
  44.    .text            : > RAML1,     PAGE = 0  
  45.    .cinit           : > RAML0,     PAGE = 0  
  46.    .pinit           : > RAML0,     PAGE = 0  
  47.    .switch          : > RAML0,     PAGE = 0  
  48.   
  49.    .stack           : > RAMM1,     PAGE = 1  
  50.    .ebss            : > RAML4,     PAGE = 1  
  51.    .econst          : > RAML5,     PAGE = 1  
  52.    .esysmem         : > RAMM1,     PAGE = 1  
  53.   
  54.    IQmath           : > RAML1,     PAGE = 0  
  55.    IQmathTables     : > IQTABLES,  PAGE = 0, TYPE = NOLOAD  
  56.   
  57.    /* Uncomment the section below if calling the IQNexp() or IQexp()
  58.       functions from the IQMath.lib library in order to utilize the
  59.       relevant IQ Math table in Boot ROM (This saves space and Boot ROM
  60.       is 1 wait-state). If this section is not uncommented, IQmathTables2
  61.       will be loaded into other memory (SARAM, Flash, etc.) and will take
  62.       up space, but 0 wait-state is possible.
  63.    */  
  64.    /*
  65.    IQmathTables2    : > IQTABLES2, PAGE = 0, TYPE = NOLOAD
  66.    {

  67.               IQmath.lib<IQNexpTable.obj> (IQmathTablesRam)

  68.    }
  69.    */  
  70.   
  71.    FPUmathTables    : > FPUTABLES, PAGE = 0, TYPE = NOLOAD  
  72.   
  73.    DMARAML4         : > RAML4,     PAGE = 1  
  74.    DMARAML5         : > RAML5,     PAGE = 1  
  75.    DMARAML6         : > RAML6,     PAGE = 1  
  76.    DMARAML7         : > RAML7,     PAGE = 1  
  77.   
  78.    ZONE7DATA        : > ZONE7B,    PAGE = 1  
  79.   
  80.    .reset           : > RESET,     PAGE = 0, TYPE = DSECT /* not used                    */  
  81.    csm_rsvd         : > CSM_RSVD   PAGE = 0, TYPE = DSECT /* not used for SARAM examples */  
  82.    csmpasswds       : > CSM_PWL    PAGE = 0, TYPE = DSECT /* not used for SARAM examples */  
  83.   
  84.    /* Allocate ADC_cal function (pre-programmed by factory into TI reserved memory) */  
  85.    .adc_cal     : load = ADC_CAL,   PAGE = 0, TYPE = NOLOAD  
  86.   
  87. }  
  88.   
  89. /*
  90. //===========================================================================
  91. // End of file.
  92. //===========================================================================
  93. */  

下面是官方F28335.cmd;

编写用于flash烧写的F28335.cmd文件时相对来说较复杂些,根据不同的情况需要做一些修改。

1 不需要把部分代码copy到RAM里,一般情况不需要外扩RAM等时直接用TI的F28335.cmd即可。
2 需要把部分代码从flash 复制到RAM里,如延时函数DSP2833x_usDelay.asm等,这时CMD文件需要做相应的修改,具体参考博文:http://blog.sina.com.cn/s/blog_762cf5f80101asmq.html

3 从时间开销方面考虑,需要把整个程序从flash复制到RAM里,这时程序及CMD文件都要做相应的修改,具体参考博文https://bbs.eeworld.com.cn/thread-458525-1-1.html
  1. MEMORY  
  2. {  
  3. PAGE 0:    /* Program Memory */  
  4.            /* Memory (RAM/FLASH/OTP) blocks can be moved to PAGE1 for data allocation */  
  5.   
  6.    ZONE0       : origin = 0x004000, length = 0x001000     /* XINTF zone 0 */  
  7.    RAML0       : origin = 0x008000, length = 0x001000     /* on-chip RAM block L0 */  
  8.    RAML1       : origin = 0x009000, length = 0x001000     /* on-chip RAM block L1 */  
  9.    RAML2       : origin = 0x00A000, length = 0x001000     /* on-chip RAM block L2 */  
  10.    RAML3       : origin = 0x00B000, length = 0x001000     /* on-chip RAM block L3 */  
  11.    ZONE6       : origin = 0x0100000, length = 0x100000    /* XINTF zone 6 */   
  12.    ZONE7A      : origin = 0x0200000, length = 0x00FC00    /* XINTF zone 7 - program space */   
  13.    FLASHH      : origin = 0x300000, length = 0x008000     /* on-chip FLASH */  
  14.    FLASHG      : origin = 0x308000, length = 0x008000     /* on-chip FLASH */  
  15.    FLASHF      : origin = 0x310000, length = 0x008000     /* on-chip FLASH */  
  16.    FLASHE      : origin = 0x318000, length = 0x008000     /* on-chip FLASH */  
  17.    FLASHD      : origin = 0x320000, length = 0x008000     /* on-chip FLASH */  
  18.    FLASHC      : origin = 0x328000, length = 0x008000     /* on-chip FLASH */  
  19.    FLASHA      : origin = 0x338000, length = 0x007F80     /* on-chip FLASH */  
  20.    CSM_RSVD    : origin = 0x33FF80, length = 0x000076     /* Part of FLASHA.  Program with all 0x0000 when CSM is in use. */  
  21.    BEGIN       : origin = 0x33FFF6, length = 0x000002     /* Part of FLASHA.  Used for "boot to Flash" bootloader mode. */  
  22.    CSM_PWL     : origin = 0x33FFF8, length = 0x000008     /* Part of FLASHA.  CSM password locations in FLASHA */  
  23.    OTP         : origin = 0x380400, length = 0x000400     /* on-chip OTP */  
  24.    ADC_CAL     : origin = 0x380080, length = 0x000009     /* ADC_cal function in Reserved memory */  
  25.      
  26.    IQTABLES    : origin = 0x3FE000, length = 0x000b50     /* IQ Math Tables in Boot ROM */  
  27.    IQTABLES2   : origin = 0x3FEB50, length = 0x00008c     /* IQ Math Tables in Boot ROM */   
  28.    FPUTABLES   : origin = 0x3FEBDC, length = 0x0006A0     /* FPU Tables in Boot ROM */  
  29.    ROM         : origin = 0x3FF27C, length = 0x000D44     /* Boot ROM */         
  30.    RESET       : origin = 0x3FFFC0, length = 0x000002     /* part of boot ROM  */  
  31.    VECTORS     : origin = 0x3FFFC2, length = 0x00003E     /* part of boot ROM  */  
  32.   
  33. PAGE 1 :   /* Data Memory */  
  34.            /* Memory (RAM/FLASH/OTP) blocks can be moved to PAGE0 for program allocation */  
  35.            /* Registers remain on PAGE1                                                  */  
  36.      
  37.    BOOT_RSVD   : origin = 0x000000, length = 0x000050     /* Part of M0, BOOT rom will use this for stack */  
  38.    RAMM0       : origin = 0x000050, length = 0x0003B0     /* on-chip RAM block M0 */  
  39.    RAMM1       : origin = 0x000400, length = 0x000400     /* on-chip RAM block M1 */  
  40.    RAML4       : origin = 0x00C000, length = 0x001000     /* on-chip RAM block L1 */  
  41.    RAML5       : origin = 0x00D000, length = 0x001000     /* on-chip RAM block L1 */  
  42.    RAML6       : origin = 0x00E000, length = 0x001000     /* on-chip RAM block L1 */  
  43.    RAML7       : origin = 0x00F000, length = 0x001000     /* on-chip RAM block L1 */  
  44.    ZONE7B      : origin = 0x20FC00, length = 0x000400     /* XINTF zone 7 - data space */  
  45.    FLASHB      : origin = 0x330000, length = 0x008000     /* on-chip FLASH */  
  46. }  
  47.   
  48. /* Allocate sections to memory blocks.
  49.    Note:
  50.          codestart user defined section in DSP28_CodeStartBranch.asm used to redirect code  
  51.                    execution when booting to flash
  52.          ramfuncs  user defined section to store functions that will be copied from Flash into RAM
  53. */   
  54.    
  55. SECTIONS  
  56. {  
  57.    
  58.    /* Allocate program areas: */  
  59.    .cinit              : > FLASHA      PAGE = 0  
  60.    .pinit              : > FLASHA,     PAGE = 0  
  61.    .text               : > FLASHA      PAGE = 0  
  62.    codestart           : > BEGIN       PAGE = 0  
  63.    ramfuncs            : LOAD = FLASHD,   
  64.                          RUN = RAML0,   
  65.                          LOAD_START(_RamfuncsLoadStart),  
  66.                          LOAD_END(_RamfuncsLoadEnd),  
  67.                          RUN_START(_RamfuncsRunStart),  
  68.                          PAGE = 0  
  69.   
  70.    csmpasswds          : > CSM_PWL     PAGE = 0  
  71.    csm_rsvd            : > CSM_RSVD    PAGE = 0  
  72.      
  73.    /* Allocate uninitalized data sections: */  
  74.    .stack              : > RAMM1       PAGE = 1  
  75.    .ebss               : > RAML4       PAGE = 1  
  76.    .esysmem            : > RAMM1       PAGE = 1  
  77.   
  78.    /* Initalized sections go in Flash */  
  79.    /* For SDFlash to program these, they must be allocated to page 0 */  
  80.    .econst             : > FLASHA      PAGE = 0  
  81.    .switch             : > FLASHA      PAGE = 0        
  82.   
  83.    /* Allocate IQ math areas: */  
  84.    IQmath              : > FLASHC      PAGE = 0                  /* Math Code */  
  85.    IQmathTables     : > IQTABLES,  PAGE = 0, TYPE = NOLOAD   
  86.      
  87.    /* Uncomment the section below if calling the IQNexp() or IQexp()
  88.       functions from the IQMath.lib library in order to utilize the  
  89.       relevant IQ Math table in Boot ROM (This saves space and Boot ROM  
  90.       is 1 wait-state). If this section is not uncommented, IQmathTables2
  91.       will be loaded into other memory (SARAM, Flash, etc.) and will take
  92.       up space, but 0 wait-state is possible.
  93.    */  
  94.    /*
  95.    IQmathTables2    : > IQTABLES2, PAGE = 0, TYPE = NOLOAD  
  96.    {
  97.    
  98.               IQmath.lib<IQNexpTable.obj> (IQmathTablesRam)
  99.    
  100.    }
  101.    */  
  102.      
  103.    FPUmathTables    : > FPUTABLES, PAGE = 0, TYPE = NOLOAD   
  104.            
  105.    /* Allocate DMA-accessible RAM sections: */  
  106.    DMARAML4         : > RAML4,     PAGE = 1  
  107.    DMARAML5         : > RAML5,     PAGE = 1  
  108.    DMARAML6         : > RAML6,     PAGE = 1  
  109.    DMARAML7         : > RAML7,     PAGE = 1  
  110.      
  111.    /* Allocate 0x400 of XINTF Zone 7 to storing data */  
  112.    ZONE7DATA        : > ZONE7B,    PAGE = 1  
  113.   
  114.    /* .reset is a standard section used by the compiler.  It contains the */   
  115.    /* the address of the start of _c_int00 for C Code.   /*
  116.    /* When using the boot ROM this section and the CPU vector */  
  117.    /* table is not needed.  Thus the default type is set here to  */  
  118.    /* DSECT  */   
  119.    .reset              : > RESET,      PAGE = 0, TYPE = DSECT  
  120.    vectors             : > VECTORS     PAGE = 0, TYPE = DSECT  
  121.      
  122.    /* Allocate ADC_cal function (pre-programmed by factory into TI reserved memory) */  
  123.    .adc_cal     : load = ADC_CAL,   PAGE = 0, TYPE = NOLOAD  
  124.   
  125. }  
  126.   
  127. /*
  128. //===========================================================================
  129. // End of file.
  130. //===========================================================================
  131. */  


路漫漫其修远兮,吾将上下而求索!(今天,你努力了吗?还记得你的目标吗?)

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复