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

2019-07-29 16:29发布

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内存映射
======================================================================
1.jpg
======================================================================
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外设,做如下定义,
<span style="line-height: 1.5;">struct Timer0 {  </span>
    ...  
}  
#pragma DATA_SECTION(C6713_Timer0, "C6713_Timer0_cmd");  
volatile struct Timer0 C6713_Timer0;  

"C6713_Timer0_cmd"将在cmd文件中分配空间。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
4条回答
tianli1980
2019-07-29 17:15
======================================================================
4. cmd文件
======================================================================
cmd文件主要用于完成链接的功能,因此可以在cmd文件中使用链接命令,比如:

-stack 0x200    设置栈大小为0x200字节
-heap 0x200     设置堆大小为0x200字节
-l rst67xx.lib  链接rst67xx.lib库

除了链接命令外,cmd 文件还包括MEMORY和SECTOINS两部分,分别用于存储区的划分和段的分配。
MEMORY划分的格式为:
L2SRAM    : o = 00000000h l = 00030000h  /* L2 SRAM 192K */  
o表示起始地址,l表示存储区长度(以字节为单位)
MEMORY  
{  
    L2SRAM    : o = 00000000h l = 00030000h  /* L2 SRAM 192K */  
    L2CACHE   : o = 00030000h l = 00010000h  /* L2 Cache 64 K */  

    /* Peripheral */  
    CPU_TIMER0 : o = 01940000h l = 00040000 /* Timer0 */  

    EXTERNAL  : o = 80000000h l = 80010000h  
}  

SECTIONS  
{  
    /* Allocate program areas */  
    .text     > L2SRAM        /* code segment */  
    .cinit    > L2SRAM        /* init segment */  

    /* Allocate data areas */  
    .stack    > L2SRAM  
    .far      > L2SRAM  
    .switch   > L2SRAM        /* C switch table */  
    .tables   > L2SRAM  
    .data     > L2SRAM        /* data segment */  
    .bss      > L2SRAM        /* data that haven't init */  
    .sysmem   > L2SRAM  
    .const    > L2SRAM        /* string, const ... */  
    .cio      > L2SRAM  

    .buffers  > EXTERNAL  

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

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


一个简单的例子(TMS320C6713为例,不同芯片不同),外设只添加了Timer0:

一周热门 更多>