5. CMD文件学习
段又可分为两大类:已初始化的段和未初始化的段。未初始化的段只是保留变量的地址空间,未初始化的段并不具有真实的内容,在程序运行过程中才向变量内写数据进去,存放于数据存储空间。1、MEMORY的page0为程序存储,其中为各个存储器映射的地址与空间大小,page1为数据存储,其中为各个存储器映射的地址与空间大小。为使用大寄存器模式时的全局变量和静态变量预留的空间,在程序上电时,cinit空间中的数据复
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 :这个段通常用于存储程序中既是全局常量又是代码常量的数据。这些常量在程序的整个生命周期内都是存在的。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)