打印

DSP的CMD文件写法综述

[复制链接]
528|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Jasmines|  楼主 | 2017-10-13 10:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
DSP的CMD文件写法综述


  CMD的专业名称叫链接器配置文件,是存放链接器的配置信息的,我们简称为命令文件,其中比较关键的就是MEMORY和SECTIONS两个伪指令 的使用,常常令人困惑,系统出现的问题也经常与它们的不当使用有关。CCS是DSP软件对DOS系统继承的开发环境,CCS的命令文件经过DOS命令文件 长时间的引申发展,已经变得非常简洁;

一、CMD命令文件常用的伪指令

1、.cint:存放已明确初始化的全局变量和静态变量

2、.const:存放已明确初始化的字符串常量、全局变量和静态常量

3、.switch:存放对于大型switch语句的跳转表

4、.text:存放可执行代码和浮点数常量

5、.bss:存放没有初始化的全局变量和静态变量

6、.stack:定义软件堆栈

二、CMD命令文件内容

CMD是用来分配程序存储器空间rom和数据存储器空间ram的,告诉链接程序怎样计算地址和分配空间。不同的芯片有不同大小的rom和ram,放用户程序的地方也不尽相同,所以要根据DSP的存储器的地址范围来编写。

分两部分:MEMORY和SECTIONS.

1、MEMORY是用来指定芯片的rom和ram的大小和划分出几个区间。
  • MEMORY
  • {

复制代码
PAGE 0 对应rom,PAGE 1对应ram。PAGE里包含的区间名字与其后面的参数反映了该区间的起始地址和长度。name存储器名称,同一页上的存储器名称不能相同,不同页上的可以相同。 attr存储区的属性,未规定的可以有R(只读)、W(只写)、X(存储器可以包含可执行代码)、I(存储器可以被初始化)。

2、Section块用来控制段的构成与地址分配。
对于不同的系统配置,Section的分配方式也不相同,链接器通过Section来控制地址的分配,所以Section的分配成了配置.cmd文件的重要环节。
  • SECTIONS
  • {
  • .vectors : { } > VECS PAGE 0
  • .reset : { } > VECS PAGE 0
  • ..........
  • }

复制代码
它分成两个基本的部分:

(1)被初始化的Section(包含数据表和可执行代码)

   .text:它包含所有的可执行代码和常数,必须放在程序页
   .cinit:它包含初始化的变量和常量表,要求放在程序页
   .pinit:它包括全局构造器(C++)初始化的变量表,要求放在程序页
   .const:它包括字符串、声明、以及被明确初始化过的全局和静态变量,要求放在低地址数据页。
   .econst:是在使用大存储器模式时使用的,包括字符串、声明、以及被明确初始化过的全局变量和静态变量,可以在数据页的任何地方。
   .switch:它包括为转换声明设置的表格,可以放在程序页,也可以放在低地址的数据页。

(2)未被初始化的Section(为程序运行中创建和存放的变量在存储器中保留空间)

   .bss:它为全局变量和静态变量保留空间.在程序开始运行时,C导入路径把数据从.cinit节复制出去然后存在.bss节中.要求放在低地址的数据页.
   .ebbs:它是在远访问(C)和大存储器模式下使用,它为全局变量和静态变量保留空间.在程序开始运行时,C导入路径把数据从.cinit段复制出去然后存在.ebss节中。可以存放在数据页的任何地方。
   .stack:为C系统堆栈保留空间,这部分存储器为用来将声明传给函数及为局部变量留出空间。要求放在低地址的数据页。
   .system:动态存储器分配保留空间,这个空间用于malloc函数,如果不使用malloc函数,这个段的大小就是0。要求放在低地址的数据页。
   .esystem:动态存储器分配保留空间,这个空间用于外部malloc函数,如果不使用外部malloc函数,这个段的大小就是0。可也放在数据页的任何地方 


eg:命令文件示例

  • MEMORY
  • {
  • PAGE 0: VECS: origin = 00000h, length = 00040h     //程序复位
  •           PVECS: origin = 00040h, length = 00070h    //外围模块中断向量
  •           PROG: origin = 000b0h, length = 07F50h    //片上Flash
  • PAGE 1: B0: origin = 00200h, length = 00100h        //DRAM B0块
  •          B1: origin = 00300h, length = 00100h       //DRAM B1块
  •          B2: origin = 00060h, length = 00020h       //DRAM B2块
  •          SARAM: origin = 00800h, length = 00800h    //SRAM块

  •               EXT:origin = 08000h, length = 08000h      //外部存储器
  • }
  • SECTIONS
  • {
  • .reset   : { } > VECS PAGE 0     //复位中断向量
  • .vectors : { } > VECS PAGE 0 //中断向量表

  •       .pvecs   : { } > PVECS PAGE 0     //外围模块中断向量表
  • .text     : { } > PROG PAGE 0     //代码
  • .cinit : { } > PROG PAGE 0   
  • .bss     : { } > SARAM PAGE 1     //块B2
  • .const : { } > SARAM PAGE 1     //块B2
  • .stack : { } > B1     PAGE 1      //堆栈,40个单元
  • }

复制代码

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

745

主题

1077

帖子

10

粉丝