DSP28335—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声明的列表html

 

非初始化的段:.bss,.ebss,.stack,.sysmem,和esysmem.(更好的理解就是,这些段就是存储空间而已)
.bss: 为全局变量和局部变量保留的空间,在程序上电时.cinit空间中的数据复制出来并存储在.bss空间中。
.ebss:为使用大寄存器模式时的全局变量和静态变量预留的空间,在程序上电时,cinit空间中的数据复制出来并存储在.ebss中,与.bss不一样的是.bss分配范围被限制在低64K 16位数据区,而.ebss的分配范围是4M 22位数据区
.stack:为系统堆栈保留的空间,用于和函数传递变量或为局部变量分配空间。
.sysmem:为动态存储分配保留的空间。若是有宏函数,此空间被宏函数占用,若是没有的话,此空间保留为0
.esysmem:为动态存储分配保留的空间。若是有far函数,此空间被相应的占用,若是没有的化,此空间保留为0.


函数

编译器生成的包含代码和数据的多个部分,称为段。这下段分为两个不一样的组:初始化了的和没被初始化的,初始化部分是由全部的代码,常量和初始化表组成的。下表列出了编译产生初始化段spa


初始化段
段名 内容
限制
.cinit 初始化的全局变量和静态变量 代码
.const 显式初始化全局和静态const变量和字符串常量 不超过64K长度
.econst 长调用的常量 数据中的任何地方
.pinit 全局对象的构造函数
代码
.switch switch语句产生的 代码或者数据
.text 可执行代码和常数 代码


没初始化的段是由未初始化的变量,堆栈和malloc产生的内存下表列出了编译产生的没初始化段htm


没初始化段
段名 内容 限制
.bss 全局和静态变量 不超过64K长度
.ebss 长调用的全局或静态变量 数据中的任何地方
.stack 堆栈空间 不超过64K长度
.sysmem malloc函数产生的内存 不超过64K长度
.esysmem far_malloc函数产生的内存 数据中的任何地方

 

一旦编译器生成的这些段链接器会从各个源文件中取出这些段,并结合它们来建立一个输出文件。链接器命令文件(.cmd)就是用来告诉链接器去哪里找这些段的。初始化段必须分配到易失性存储器flash/ ROM当电源被撤除时,程序不会消失。未初始化的段能够被分配到RAM中,由于它们是在代码执行期间被初始化的对象

 

当须要把程序从flash复制到RAM里时,各个段分配参考以下:blog

.cinit内存

Flashci

.cio字符串

RAMcmd

.const

Flash

.econst

Flash

.pinit

Flash

.switch

Flash

.text

Flash

.bss

RAM

.ebss

RAM

.stack

Lower 64Kw RAM

.sysmem

RAM

.esysmem

RAM

.reset

RAM1

 

 转载原址:http://blog.sina.com.cn/s/blog_762cf5f80101aoob.html