DSP

CMD文件详解与DSP存储空间

2019-07-13 09:47发布

class="markdown_views prism-atom-one-light">

CMD文件详解与DSP存储空间


CMD的全称为链接命令配置文件。以ROM/FLASH和RAM两类存储器为对象,用户通过编写CMD文件,来管理和分配系统中的所有物理存储器和地址空间。DSP芯片的片内存储器,只要没有被出厂占用,用户都可以全权支配。用户编写完的程序经过开发环境(编译器)的编译,转换为芯片可以识别的机器码,最后下载到芯片中运行。CMD文件就是在编译源程序、生成机器码的过程中挥作用的,它作为用户的命令或要求,将物理存储器和地址空间分配方式交给编译器去执行。 CMD文件包括两方面的内容:
1)用户声明系统的存储器资源。包括DSP芯片自带、外扩的存储器和空间,都要一一声明:有哪些存储器、位置和大小。
2)用户声明资源分配情况。这是编写CMD文件的重点。

3.1 MEMORY和SECTIONS指令

MEMORY和SECTIONS指令是CMD文件中的核心指令。MEMORY指令用来指示存储空间,SECTIONS指令用来分配“段”到存储空间,即指定“段”的实际硬件空间。 1) MEMORY指令
作用:指示存储空间 MEMORY { PAGE 0name 0[(attr)]:orgin=constant , length=constant; PAGE n : name n[(attr)]:orgin=constant , length=constant; } MEMOR Y、PAGE n、orgin、length,包括冒号、等号、花括号,都是关键字符,必不可少。
PAGE n表示把可用的资源空间再划分成几个大块,最多允许分256块,从PAGE 0到 PAGE 255。通常习惯于把PAGE 0作为程序空间,把 PAGE 1作为数据空间。
name n为存储空间名;orgin用来标明该段的起始地址;length用来指示该段的长度。 MEMORY指令示例:
这里写图片描述
示例中,在程序存储空间PAGE 0中划分了一个名为PROG的区域,起始地址为0x00000C00,所占空间为0x00001000。在数据存储空间划分了两个区域,SCRATCH区起始地址为0x00000060,所占空间为0x00000020;RAM1区起始地址为SCRATCH区结束之后(0x0000080),所占空间为0x00000200。 2) SECTIONS指令
作用:分配段到存储空间,即指定段的实际硬件空间。 SECTIONS { name 0 :> 存储空间名称 , PAGE = 页数; name n :> 存储空间名称 , PAGE = 页数; } SECTIONS、PAGE n、orgin、length,包括“: >”、等号、花括号,都是关键字符,必不可少。 name n为段名; “: >”为内存分配符,等效于load关键字,代表数段的存储位置,有时也会用到run关键字,代表段的运行位置;“存储空间名称”为MEMORY中已经分配好的存储空间名称。 SECTIONS指令示例(部分):
这里写图片描述 示例中,.text段被存储在PAGE 0的PROG区,而被运行在PAGE 1中由地址0x0200开始的区域;.econst段存储在RAM1区域(可以不指定PAGE,实际PAGE由MEMORY决定);.ebss段也存储在RAM1区域。

3.2 程序与数据“段”

程序中存在众多的段,这些段分为两种:已初始化段和未初始化段。
1)已初始化段: 已初始化段一般有:.text、.cinit、.const、.econst、.pinit、.switch、.vectors .text:是编译后生成的二进制指令代码段,即所有可执行的代码和常量。属于“已初始化段”。我们编写的main主函数,子函数或子程序,中断服务程序,都会产生指令代码,也都属于这个段。 .cinit:该段中存放对全局变量和静态变量初始化的常数列表,有固定的格式。例如全局变量声明时的初值等,属于该段。它属于“已初始化段”,必须作为代码,存储在程序空间里,而且必须能够掉电保存。 .const:包含由const关键字修饰的字符串常量和初始化的全局变量和静态变量初始化列表。 .econst:包含由far const关键字修饰的字符串常量和初始化的全局变量和静态变量的初始化列表。 .pinit:全局构造器(C++语言用)程序列表。 .switch:包含switch声明的列表。 .vectors:中断向量段,也就是中断服务程序的入口地址段。很显然,这个段要求物理存储器必须能够掉电保存数据,属于“已初始化段”。 2)未初始化段
未初始化段一般有:.bss、.ebss、.stack、.sysmem、.esysmen .bss:为全局变量和局部变量保留的空间,在程序上电时.cinit空间中的数据复制出来并存储到.bss空间中。 .ebss:为使用大寄存器模式时的全局变量和静态变量预留的空间,在程序上电时,cinit空间中的数据复制出来并存储在.ebss中。 .stack:为系统堆栈保留的空间,主要用于和函数传递变量或为巨变变量分配空间。 .sysmem:为动态存储分配保留的空间,如果有宏函数,此空间被空函数占用,如果没有的话,此空间保留为0。 .esysmen:为动态存储分配保留的空间,如果有far函数,此空间被相应的占用,如果没有的话,此空间保留为0。
阅读过程有疑问
微信扫描二维码
发私信交流
iFTrue
更多内容,可以微信扫下面二维码【iFtrue未来已来】交流
感谢阅读