DSP

DSP TMS320C6000基础学习—— cmd文件分析

2019-07-13 12:21发布

转载地址:http://blog.csdn.net/xiahouzuoxin/article/details/9498537 DSP中的CMD文件是链接命令文件(Linker Command File),以.cmd为后缀。

在分析cmd文件之前,必需先了解
(1)DSP具体芯片的内存映射(Memory Map)
(2)知道点链接的知识,知道C程序中段的概念
(3)知道RAM,Flash等存储模块的区别


======================================================================
1. coff目标文件
======================================================================
coff是一种流行的二进制可执行文件格式,在CCS v5中扩展名为.out,可以直接
下载到芯片中。可执行文件包括段头、可执行代码、初始化数据、可重定位信息
和符号表字符串表等信息。
编译器处理段的过程为:
(1)把每个源文件都编译成独立目标文件(.obj),每个目标文件都有自己的段
(2)链接器将目标文件中相同段名的部分连接在一起,生成最终的coff可执行文件
CCS v5中的Compile Files完成功能(1),Build完成功能(2)。


======================================================================
2. TMS320C6713内存映射
======================================================================


======================================================================
3. 自定义代码段和数据段
======================================================================
// 将symbol分配到section name指示的数据段
#pragma DATA_SECTION(symbol, "section name");
// 将symbol分配到section name指示的代码段
#pragma CODE_SECTION(symbol, "section name");  
常常结合结构体定义symbol,如下,
volatile struct Symbol symbol;  // Symbol预先定义好的描述特定外设的结构


比如,对于C6713中的Timer0外设,做如下定义,
[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. struct Timer0 {  
  2.     ...  
  3. }  
  4. #pragma DATA_SECTION(C6713_Timer0, "C6713_Timer0_cmd");  
  5. volatile struct Timer0 C6713_Timer0;  

"C6713_Timer0_cmd"将在cmd文件中分配空间。
======================================================================
4. cmd文件
====================================================================== cmd文件主要用于完成链接的功能,因此可以在cmd文件中使用链接命令,比如:
-stack 0x200    设置栈大小为0x200字节 -heap 0x200     设置堆大小为0x200字节 -l rst67xx.lib  链接rst67xx.lib库
除了链接命令外,cmd 文件还包括MEMORY和SECTOINS两部分,分别用于存储区的划分和段的分配。 MEMORY划分的格式为: [cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. L2SRAM    : o = 00000000h l = 00030000h  /* L2 SRAM 192K */  
o表示起始地址,l表示存储区长度(以字节为单位)
一个简单的例子(TMS320C6713为例,不同芯片不同),外设只添加了Timer0:
[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. MEMORY  
  2. {  
  3.     L2SRAM    : o = 00000000h l = 00030000h  /* L2 SRAM 192K */  
  4.     L2CACHE   : o = 00030000h l = 00010000h  /* L2 Cache 64 K */  
  5.   
  6.   
  7.     /* Peripheral */  
  8.     CPU_TIMER0 : o = 01940000h l = 00040000 /* Timer0 */  
  9.   
  10.   
  11.     EXTERNAL  : o = 80000000h l = 80010000h  
  12. }  
  13.   
  14.   
  15. SECTIONS  
  16. {  
  17.     /* Allocate program areas */  
  18.     .text     > L2SRAM        /* code segment */  
  19.     .cinit    > L2SRAM        /* init segment */  
  20.   
  21.   
  22.     /* Allocate data areas */  
  23.     .stack    > L2SRAM  
  24.     .far      > L2SRAM  
  25.     .switch   > L2SRAM        /* C switch table */  
  26.     .tables   > L2SRAM  
  27.     .data     > L2SRAM        /* data segment */  
  28.     .bss      > L2SRAM        /* data that haven't init */  
  29.     .sysmem   > L2SRAM  
  30.     .const    > L2SRAM        /* string, const ... */  
  31.     .cio      > L2SRAM  
  32.   
  33.   
  34.     .buffers  > EXTERNAL  
  35.   
  36.   
  37.     C6713_Timer0_cmd > CPU_TIMER0  /* Timer 0 */  
  38. }  

cmd文件包括2部分 —— MEMORY与SECTIONS
MEMORY完成地址空间的划分;
SECTIONS完成地址空间的分配到具体用途(除了程序中通用段之外还可以有自定义段)。


NOTES: 平时开发时都是将程序下载到RAM空间,当要发布时需要下载到Flash空间,
此处为SRAM的cmd文件,Flash的cmd文件有所不同。


下面是TI公司DSK的cmd,可以直接参考, [cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. /****************************************************************************/  
  2. /*  C6713.cmd                                                               */  
  3. /*  Copyright (c) 2010 Texas Instruments Incorporated                       */  
  4. /*                                                                          */  
  5. /*    Description: This file is a sample linker command file that can be    */  
  6. /*                 used for linking programs built with the C compiler and  */  
  7. /*                 running the resulting .out file on an TMS320C6713        */  
  8. /*                 device.  Use it as a guideline.  You will want to        */  
  9. /*                 change the memory layout to match your specific C6xxx    */  
  10. /*                 target system.  You may want to change the allocation    */  
  11. /*                 scheme according to the size of your program.            */  
  12. /*                                                                          */  
  13. /****************************************************************************/  
  14.   
  15. -stack 0x2000  
  16. -heap 0x8000  
  17.   
  18. MEMORY  
  19. {  
  20.     IRAM        o = 0x00000000  l = 0x00030000  /* 192kB - Internal RAM */  
  21.     L2RAM       o = 0x00030000  l = 0x00010000  /* 64kB - Internal RAM/CACHE */  
  22.     EMIFCE0     o = 0x80000000  l = 0x10000000  /* SDRAM in 6713 DSK */  
  23.     EMIFCE1     o = 0x90000000  l = 0x10000000  /* Flash/CPLD in 6713 DSK */  
  24.     EMIFCE2     o = 0xA0000000  l = 0x10000000  /* Daughterboard in 6713 DSK */  
  25.     EMIFCE3     o = 0xB0000000  l = 0x10000000  /* Daughterboard in 6713 DSK */  
  26. }  
  27.   
  28. SECTIONS  
  29. {  
  30.     .text          >  IRAM  
  31.     .stack         >  IRAM  
  32.     .bss           >  IRAM  
  33.     .cio           >  IRAM  
  34.     .const         >  IRAM  
  35.     .data          >  IRAM  
  36.     .switch        >  IRAM  
  37.     .sysmem        >  IRAM  
  38.     .far           >  IRAM  
  39.   .args          >  IRAM  
  40.     .ppinfo        >  IRAM  
  41.     .ppdata        >  IRAM  
  42.   
  43.   /* COFF sections */  
  44.     .pinit         >  IRAM  
  45.     .cinit         >  IRAM  
  46.   
  47.   /* EABI sections */  
  48.   .binit         >  IRAM  
  49.     .init_array    >  IRAM  
  50.   .neardata      >  IRAM  
  51.     .fardata       >  IRAM  
  52.     .rodata        >  IRAM  
  53.     .c6xabi.exidx  >  IRAM  
  54.     .c6xabi.extab  >  IRAM  
  55. }  


下面再给出一个TMS320F2818的完整cmd文件例子,与6713有所不同,比如16进制格式
表示,MEMORY和SECTIONS书写等。
[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. MEMORY  
  2. {  
  3. PAGE 0 :   
  4.    PRAMH0     : origin = 0x3f8000, length = 0x001000         
  5.            
  6. PAGE 1 :   
  7.    /* SARAM                     */       
  8.    RAMM0    : origin = 0x000000, length = 0x000400  
  9.    RAMM1    : origin = 0x000400, length = 0x000400  
  10.   
  11.   
  12.    /* Peripheral Frame 0:   */  
  13.    DEV_EMU    : origin = 0x000880, length = 0x000180  
  14.    FLASH_REGS : origin = 0x000A80, length = 0x000060  
  15.    CSM        : origin = 0x000AE0, length = 0x000010  
  16.    XINTF      : origin = 0x000B20, length = 0x000020  
  17.    CPU_TIMER0 : origin = 0x000C00, length = 0x000008  
  18.    CPU_TIMER1 : origin = 0x000C08, length = 0x000008           
  19.    CPU_TIMER2 : origin = 0x000C10, length = 0x000008           
  20.    PIE_CTRL   : origin = 0x000CE0, length = 0x000020  
  21.    PIE_VECT   : origin = 0x000D00, length = 0x000100  
  22.   
  23.   
  24.    /* Peripheral Frame 1:   */  
  25.    ECAN_A     : origin = 0x006000, length = 0x000100  
  26.    ECAN_AMBOX : origin = 0x006100, length = 0x000100  
  27.   
  28.   
  29.    /* Peripheral Frame 2:   */  
  30.    SYSTEM     : origin = 0x007010, length = 0x000020  
  31.    SPI_A      : origin = 0x007040, length = 0x000010  
  32.    SCI_A      : origin = 0x007050, length = 0x000010  
  33.    XINTRUPT   : origin = 0x007070, length = 0x000010  
  34.    GPIOMUX    : origin = 0x0070C0, length = 0x000020  
  35.    GPIODAT    : origin = 0x0070E0, length = 0x000020  
  36.    ADC        : origin = 0x007100, length = 0x000020  
  37.    EV_A       : origin = 0x007400, length = 0x000040  
  38.    EV_B       : origin = 0x007500, length = 0x000040  
  39.    SPI_B      : origin = 0x007740, length = 0x000010  
  40.    SCI_B      : origin = 0x007750, length = 0x000010  
  41.    MCBSP_A    : origin = 0x007800, length = 0x000040  
  42.   
  43.   
  44.    /* CSM Password Locations */  
  45.    CSM_PWL    : origin = 0x3F7FF8, length = 0x000008  
  46.   
  47.   
  48.    /* SARAM                    */       
  49.    DRAMH0     : origin = 0x3f9000, length = 0x001000           
  50. }  
  51.    
  52. SECTIONS  
  53. {  
  54.    /* Allocate program areas: */  
  55.    .reset           : > PRAMH0,      PAGE = 0  
  56.    .text            : > PRAMH0,      PAGE = 0  
  57.    .cinit           : > PRAMH0,      PAGE = 0  
  58.   
  59.   
  60.    /* Allocate data areas: */  
  61.    .stack           : > RAMM1,       PAGE = 1  
  62.    .bss             : > DRAMH0,      PAGE = 1  
  63.    .ebss            : > DRAMH0,      PAGE = 1  
  64.    .const           : > DRAMH0,      PAGE = 1  
  65.    .econst          : > DRAMH0,      PAGE = 1        
  66.    .sysmem          : > DRAMH0,      PAGE = 1  
  67.      
  68.    /* Allocate Peripheral Frame 0 Register Structures:   */  
  69.    DevEmuRegsFile    : > DEV_EMU,    PAGE = 1  
  70.    FlashRegsFile     : > FLASH_REGS, PAGE = 1  
  71.    CsmRegsFile       : > CSM,        PAGE = 1  
  72.    XintfRegsFile     : > XINTF,      PAGE = 1  
  73.    CpuTimer0RegsFile : > CPU_TIMER0, PAGE = 1