5.1 有关cmd文件的基础知识

        cmd文件即链接命令文件(Linker Command Files),以后缀.cmd结尾。

        cmd文件由MEMORY(即:内存)和SECTIONS(即:段)两部分组成。MEMERY用于定义每个存储器块的名字、起始地址和长度。SECTIONS主要用于描述哪个段映射到了哪段存储空间。MEMORY中又可分为PAGE0(程序存储空间)和PAGE1(数据存储空间),PAGE(即:帧)。

        段又可分为两大类:已初始化的段和未初始化的段。已初始化的段含有真实的指令和数据,存放于程序存储空间。未初始化的段只是保留变量的地址空间,未初始化的段并不具有真实的内容,在程序运行过程中才向变量内写数据进去,存放于数据存储空间。

5.2 MEMORY和SECTION

        MEMORY伪指令作用:指示存储空间,资源清单标识,具体内容写在后面的大括号{ } 里面。对DSP系统的ROM(如DSP芯片内ROM,FLASH,外挂ROM)和RAM划分为N个不同的区间。这些区间根据存储目的可以分为两大类:程序存储(对应于PAGE 0)和数据存储(对应于PAGE 1)。

        SECTIONS伪指令作用:分配段到存储空间,也就是指定段的实际硬件地址空间。

5.3 段的存储特性

段的存储特性

初始化

存储器类型

分配的

存储空间

内容

说明

.text

已初始化

ROM/RAM(Flash)

PAGE0

所有可以执行的代码和常量

.cinit

ROM/RAM(Flash)

PAGE0

初始化的全局变量和static变量表

.const

ROM/RAM(Flash)

PAGE1

初始化的全局const变量和static const变量和字符串常量

.econst

ROM/RAM(Flash)

PAGE1

长调用的常量

.pinit

ROM/RAM(Flash)

PAGE0

全局对象的构造函数表(C++)

.switch

ROM/RAM(Flash)

PAGE0/PAGE1

switch语句产生的表

.bss

未初始化

RAM

PAGE1

全局变量和static变量

为全局变量和局部变量保留的空间,在程序上电时.cinit空间中的数据复制出来并存储在.bss空间中。

.ebss

RAM

PAGE1

长调用的全局变量和static变量

为使用大寄存器模式时的全局变量和静态变量预留的空间,在程序上电时,cinit空间中的数据复制出来并存储在.ebss中,与.ebss不同的是.bss分配范围被限制在低64K 16位数据区

.stack

RAM

PAGE1

栈空间

为系统堆栈保留的空间,用于和函数传递变量或为局部变量分配空间。

.system

RAM

PAGE1

malloc函数产生的内存

为动态存储分配保留的空间。如果有宏函数,此空间被宏函数占用,如果没有的话,此空间保留为0

.esystem

RAM

PAGE1

far_malloc函数产生的内存

动态存储分配保留的空间。如果有far函数,此空间被相应的占用,如果没有的化,此空间保留为0

CODE_SECTION自定义段

ROM/RAM(Flash)

PAGE0

定义代码段

1. 自定义段必须用在变量定义和使用前,使用#pragma DATA_SECTION(symbol, "section name");和#pragma CODE_SECTION(symbol, "section name");

2.不能在函数体内定义段

DATA_SECTION自定义段

RAM

PAGE1

自定义数据段

5.4 根据程序的cmd文件作分析

        1、MEMORY的page0为程序存储,其中为各个存储器映射的地址与空间大小,page1为数据存储,其中为各个存储器映射的地址与空间大小。具体详情可看DSP数据手册的存储器映射与闪存映射。

        2、SECTION伪指令

        .cinit  :所有可以执行的代码和常量

        .pinit  :全局对象的构造函数表

        .text   :所有可以执行的代码和常量

        Codestart  :  代码开始执行

        Ramconst :  在FLASH_APP加载,

        在RAMGS_Prog运行

        LOAD_START(_RamfuncsLoadStart)令编译器创建了一个变量RamfuncsLoadStart,该变量指向段ramfuncs的装载地址的首地址。

        LOAD_END(_RamfuncsLoadEnd)令编译器创建了一个变量RamfuncsLoadEnd,该变量指向段ramfuncs的装载地址的末地址。

        RUN_START(_RamfuncsRunStart)令编译器创建了一个变量RamfuncsRunStart,该变量指向段ramfuncs的运行地址的首地址。

        .stack:为系统堆栈保留的空间,用于和函数传递变量或为局部变量分配空间。

        .ebss:为使用大寄存器模式时的全局变量和静态变量预留的空间,在程序上电时,cinit空间中的数据复制出来并存储在.ebss中。

        .system :为动态存储分配保留的空间。如果有宏函数,此空间被宏函数占用,如果没有的话,此空间保留为0。

        .switch :switch句产生的表。

        .econst :长调用的常量。

        表中其他为变量的内容放入制定的存储器映射存储空间内。

        . scratchpad  :用于存储临时数据,例如在程序运行过程中产生的中间结果,或者在链接过程中需要的某些信息。

        .bss_cla  :这个段通常用于存储程序中既是全局变量又是代码常量的数据。这些变量在程序的整个生命周期内都是存在的。

        . const_cla    :这个段通常用于存储程序中既是全局常量又是代码常量的数据。这些常量在程序的整个生命周期内都是存在的。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐