原创 【TI博客大赛】CMD文件

2012-10-28 21:42 1788 20 22 分类: MCU/ 嵌入式

CCS中对F2812进行编程时,有个重要的文件,是以.cmd为后缀的,称为链接命令文件(Linker Command File),简称CMD文件。这个CMD文件是跟2812的存储器结构有关的。2812的存储器分为程序存储器和数据存储器,程序存储器中的主要内容是可执行代码、初始化数据、开关量等,数据存储器中存储的是外部变量、静态变量、系统堆栈等。

CCS编译产生若干可重定位的代码和数据块,称为section(段),这些段会通过CMD文件重定位到相应地存储空间中。这些段可分为初始化段和非初始化段。

初始化段包含可执行代码和数据表,编译器产生以下各初始化段:

1.text段:包含所有可执行的代码和常量。

2.cinit段:初始化的变量和常量表,主要用于C程序中;

3.pinit段:初始化的变量和常量表,主要用于C++程序中;

4.const段:包含字符串常以及用const声明的全局变量和静态变量;

5.econst段:同.const段,但用于far const声明的变量或编译器采用大存器模式时;

6.switch段:为开关语句(switch)建立的数据表。

非初始化段是在存储器中保留空间,通常是中RAM中,程序在运行时,可此空间创建和存储变量。编译器会产生的非初始化段如下:

1.bss段:为全局变量和静态变量保留的空间,在程序引导时,引导程序会将ROM中的.cinit段中的数据复制到.bss段中;

2.ebss段:为far声明的或大存储器模式下声明的全局变量和静态变量保留空间。在程序引导过程中,引导程序会将ROM中的.cinit段中的数据复制到.ebss段中;

3.stack段:为C系统堆栈分配的空间,用于函数调用时传递参数以及为局部变量分配空间。

4.sysmem段:为动态存储器分配保留空间,如果没有用到malloc函数,则该段空间大小为0

5.esysmem段:为动态存储器分配保留空间,如果没有用到far malloc函数,则该段空间大小为0.

除了上述C编译器产生的段,在F281x中用户还可以通过#pragma预编译指令产生用户定义的段。#pragma的用法有两种:

1 #pragma CODE_SECTION(symbol, ”section name”

2 #pragma DATA_SECTIOM(symbol, “section name”)

说明:

1symbol既可以是函数名,也可以是全局变量名,section name是用户自定义的段名;

2CODE_SECTION为用户自定义代码段,DATA_SECTION为用户自定义的数据段;

3)使用#pragma预编译指定要注意,一是不能在函数体中声明#pragma,二是必须在symbol被定义之前使用#pragma.

举例1

#pragma CODE_SECTION(sum, “sectionA”)

int sum(int a, int b)

{

    return(a + b);

}

void main(void)

{

……

}

这里编译器就把函数sum的代码编译到段名为sectionA的程序段中。

举例2

#pragma DATA_SECTION(sin[256], “sinesection”)

int sin[256] = {……};

这里编译器把数组sin[256]编译到段名为sinesection的数据段中。

CMD文件中,上述这些段都被分配到如下的页中,其中PAGE 0表示程序存储空间,PAGE 1表示数据存储空间。

被分配的存储空间

.text

PAGE 0

.cinit

PAGE 0

.pinit

PAGE 0

#pragma CODE_SECTION定义的段

PAGE 0

.switch

PAGE 1

.const

PAGE 1

.econst

PAGE 1

.bss

PAGE 1

.ebss

PAGE 1

.stack

PAGE 1

.sysmem

PAGE 1

.esysmem

PAGE 1

#pragma DATA_SECTION定义的段

PAGE 1

CMD文件中主要通过两个伪指令MEMORYSECTIONS,来实现指示存储空间和分配段到相应存储空间两个功能的。

MEMORY语法如下:

MEMORY

{

PAGE 0: name 0 [(attr)]: origin=constant, length=constant

PAGE n: name n [(attr)]: origin=constant, length=constant

}

说明:

1PAGE用来标示存储空间的关键字,n最大为2552812中,如前面所述,PAGE 0表示程序存储空间,PAGE 1表示数据存储空间;

2name表示某一属性和地址范围的存储空间名称,名称可以是1~8个字符,在同一页内,名称不能相同,不同页的名称可以相同;

3attr表示该存储空间的属性,共有四种属性——只读R、只写W、该空间包含可执行代码X、该空间包含被初始化代码I,此选型通常忽略;

4origin是用来定义存储空间起始地址的关键字;

5length是用来定义存储空间起始地址的关键字。

SECTIONS语法如下:

SECTIONS

{

name 0: >存储空间名称, PAGE=页数

name n: >存储空间名称, PAGE=页数

}

说明:

1 name表示编译器输出段的名称;

2) 存储空间名称,是指用MEMORY伪指令指示的存储空间名称;

3 PAGE是对应的页。

 

C程序中,有如下的声明:

#pragma DATA_SECTION(sin[256], “sinetable”)

int sin[256]={………..};

 

CMD文件中:

MEMORY

{

PAGE 0:

SIN: origin=0x0000, length=0x0100 /*起始地址为0x0000,长度为256*/

……

PAGE 1:

……

}

SECTIONS

{

……

sinetable :>SIN, PAGE=0

……

}

 

这样CCS在编译时,就将程序中定义的正弦表sin[256],放到程序存储器地址以0x0000开头的长度为256的存储空间中。

文章评论2条评论)

登录后参与讨论

用户403664 2012-10-30 09:34

请使用高级编辑器的“一键排版”功能~!

飞言走笔 2012-10-28 21:45

把字体改大了一号,就说字数超了…… - -!
相关推荐阅读
飞言走笔 2017-01-06 21:56
2017,新的博客旅程
EDNChina 改版终于成功了!祝贺! 2017年,开始新的旅程~ ...
飞言走笔 2016-06-01 10:17
【博客大赛】《白鹿原》读后
《白鹿原》这本书已经买了很久,多次以来,都是只翻看几页,顶多几章就放下了,觉得这是一个大部头,得有足够的时间才行。前几天陈忠实先生去世的消息传来,让我很震惊和惭愧。 一口气读完这本书,畅快淋漓,又意...
飞言走笔 2016-03-26 16:42
【博客大赛】《毛斯朝》读后
这本书最早是在凤凰卫视曾子墨主持的一期关于沈志华先生的《世纪大讲堂》节目中知晓的。但是一直拖到今天才读完。 说实话,书的主要内容与当前官方的宣传口径有很多不一致的地方,而沈先生作为中国掌握苏联档...
飞言走笔 2016-03-08 13:46
【博客大赛】蓝牙4.0低功耗技术及其认证要求
详见附件 ...
飞言走笔 2016-02-02 14:20
【转】蓝牙4.0协议官方手册(一)——通用属性配置文件
转自:http://blog.csdn.net/jinzhichaoshuiping/article/details/43370009 通用属性配置文件 (GATT)——该说明书定义了通用属性配置...
飞言走笔 2016-01-31 23:24
【博客大赛】脑洞大开、三观重塑——《人类简史》读后
终于读完了《人类简史》,没有把这本书拖到二月份,这也是2016年读完的第一本书。之前也有所耳闻,但是没有太在意,倒是罗胖子的跨年演讲上偶然提到,不知怎么就勾起了阅读此书的欲望。 本文的标题用了“脑洞...
我要评论
2
20
关闭 站长推荐上一条 /2 下一条