DSP

DSP的CMD文件解读

2019-07-13 11:05发布

 我们以问答的方式来分析一下CMD文件作用以及如何设置
1、为什么DSP里面有CMD文件,而普通的单片机却没有呢?
通常DSP内部集成了存储器或外部扩展存储器。存储器统一映射到程序空间或者数据空间。DSP中,存储器映射空间除SRAM和flash外还有保留空间(可用于扩展外部存储器与外设),比较杂乱。DSP的编译器自身不能定位执行代码位置,因此设计人员需要自己去定义代码存放和加载位置。单片机就比较简单了,编译器自身会定位代码地址,所以一般无需去定位地址。

2、CMD由几部分组成,各有什么功能?
CMD由MEMORY和SECTIONS两部分组成。MEMERY用于定义每个存储器块的名字、起始地址和长度。SECTIONS主要用于描述哪个段映射到了哪段存储空间(包括所在段的页类型,其中PAGE0规定为程序存储区,PAGE1为数据存储区)。

3、CMD文件中有哪些段?各自作用?
CMD文件里有两个基本的段:初始化段和非初始化段。初始化段包含代码和常数等必须在DSP上电之后有效的数。故初始化块必须保存在如片内FLASH等非易失性存储器中,非初始化段中含有在程序运行过程中才像变量内写数据进去,所以非初始化段必须链接到易失性存储器中如RAM。
已初始化的段:.text,.cinit,.const,.econst,.pinit和.switch..
.text:所有可以执行的代码和常量
.cinit:全局变量和静态变量的C初始化记录,包含未用const声明的外部(extern)或静态(static)数据表
.const:包含字符串常量和初始化的全局变量和静态变量(由const)的初始化和说明

.econst:包含字符串常量和初始化的全局变量和静态变量(由far const)的初始化和说明,与.const不同的是.const分配范围被限制在低64K 16位数据区,而.econst的分配范围是4M 22位数据区
.pinit:全局构造器(C++)程序列表
.switch:包含switch声明的列表
非初始化的段:.bss,.ebss,.stack,.sysmem,和esysmem.(更好的理解就是,这些段就是存储空间而已)
.bss: 为全局变量和局部变量保留的空间,在程序上电时.cinit空间中的数据复制出来并存储在.bss空间中。
.ebss:为使用大寄存器模式时的全局变量和静态变量预留的空间,在程序上电时,cinit空间中的数据复制出来并存储在.ebss中,与.bss不同的是.bss分配范围被限制在低64K 16位数据区,而.ebss的分配范围是4M 22位数据区
.stack:为系统堆栈保留的空间,用于和函数传递变量或为局部变量分配空间。
.sysmem:为动态存储分配保留的空间。如果有malloc函数,此空间被宏函数占用,如果没有的用到,将不产生该段
.esysmem:为动态存储分配保留的空间。如果有far malloc函数,此空间被相应的占用,如果没有的用到,将不产生该段

4、修改CMD文件时应该注意什么?
不同DSP的存储空间映射地址差异很大。我们看一下2407、28035、2812的存储器空间地址
12.JPG (94.32 KB, 下载次数: 1) 下载附件  保存到相册 2015-4-26 00:13 上传     13.JPG (91.28 KB, 下载次数: 0) 下载附件  保存到相册 2015-4-26 00:13 上传     14.JPG (119.6 KB, 下载次数: 0) 下载附件  保存到相册 2015-4-26 00:13 上传

故修改CMD文件中MEMORY时注意,需比照相应DSP的存储器地址,来修改段。各个段的地址不能跨界;数据段空间不要映射到程序段地址。保留空间如用于外扩外设或存储器方可使用,如外部未使用保留空间,则不能使用保留空间
SECTION中,通常,.text、.cint、.switch等初始化段连接至ROM或RAM空间,且必须位于程序存储器空间(PAGE0)。.const块可以链接至ROM或RAM空间,且必须是数据存储器空间(PAGE1)。而.bass、.ebass、.sysmem、.eysmem等未初始化段必须连接至RAM空间,且必须位于数据存储器空间(PAGE1)。