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

本文详细介绍了DSP中的CMD文件,包括其基本概念、如何通过CMD文件进行内存映射及段分配,以及不同DSP芯片的CMD文件实例。

转载地址:http://blog.youkuaiyun.com/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外设,做如下定义,
  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划分的格式为:

  1. L2SRAM    : o = 00000000h l = 00030000h  /* L2 SRAM 192K */  
o表示起始地址,l表示存储区长度(以字节为单位)


一个简单的例子(TMS320C6713为例,不同芯片不同),外设只添加了Timer0:
  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,可以直接参考,

  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书写等。
  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        
  74.    CpuTimer1RegsFile : > CPU_TIMER1, PAGE = 1        
  75.    CpuTimer2RegsFile : > CPU_TIMER2, PAGE = 1        
  76.    PieCtrlRegsFile   : > PIE_CTRL,   PAGE = 1        
  77.    PieVectTable      : > PIE_VECT,   PAGE = 1  
  78.   
  79.   
  80.    /* Allocate Peripheral Frame 2 Register Structures:   */  
  81.    ECanaRegsFile     : > ECAN_A,      PAGE = 1     
  82.    ECanaMboxesFile   : > ECAN_AMBOX   PAGE = 1  
  83.   
  84.   
  85.    /* Allocate Peripheral Frame 1 Register Structures:   */  
  86.    SysCtrlRegsFile   : > SYSTEM,     PAGE = 1  
  87.    SpiaRegsFile      : > SPI_A,      PAGE = 1  
  88.    SciaRegsFile      : > SCI_A,      PAGE = 1  
  89.    XIntruptRegsFile  : > XINTRUPT,   PAGE = 1  
  90.    GpioMuxRegsFile   : > GPIOMUX,    PAGE = 1  
  91.    GpioDataRegsFile  : > GPIODAT     PAGE = 1  
  92.    AdcRegsFile       : > ADC,        PAGE = 1  
  93.    EvaRegsFile       : > EV_A,       PAGE = 1  
  94.    EvbRegsFile       : > EV_B,       PAGE = 1  
  95.    ScibRegsFile      : > SCI_B,      PAGE = 1  
  96.    McbspaRegsFile    : > MCBSP_A,    PAGE = 1  
  97.   
  98.   
  99.    /* CSM Password Locations */  
  100.    CsmPwlFile      : > CSM_PWL,     PAGE = 1  
  101. }  

Add:
.vectors 中断向量表所在的段;
.text     程序代码所在的段;
.satext   非标准段,放置线性汇编程序代码;
.bss      非初始化变量段
.cinit    程序初始化段,经常放置一些没有用const说明的带初值变量的初始化值。
.const    使用const声明的变量和数组
.far      不可使用DP指针而必须使用全地址访问的变量所在的段,与far关键字和编译选项有关
.stack    系统栈使用的段
.cio      printf等输入输出函数使用的缓冲区所在的段
.switch   程序中switch语句的跳转地址表
.system   系统堆,内存的动态开辟即使用这个段


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值