相同类别的数据为一个“段”
编译使.c文件生成.obj文件,而各个obj文件是由多个“段”构成的
链接就是使各.obj中的相同的“段”链接在一起,比如DSP28_ADC.obj文件含A、B、C段和DSP28_EV.obj含A、B段
那么链接的作用就是使ADC得A段和EV的A段链接在一起,使ADC得B段和EV的B段链接在一起。再加上ADC的C段——共同组成.out文件(可执行文件)
cmd文件就是给各个“段”分配存储空间
C语言的段: 已初始化段:存放在程序存储空间,含有真实的数据内容
未初始话段:存放在数据存储空间
已初始化段: .text : 汇编指令代码
.cinit : 存放对全局和静态变量初始化
.const : const声明字符串常常是全局、静态
.econst : far const.............
未初始化段: .bss :为全局变量和局部变量保留的空间。在程序商店的时候,.cinit会被复制出来复制到.bss的空间中区
.ebss :为使用大寄存器的全局变量和局部变量保留的空间程序上电的时候,程序商店的时候.cinit会被复制到.bss中区,选择库文件也选择后缀为-ML的文件
.stack :函数的传递变量和局部变量分配空间
上述是系统定义好的段
用户自定义的段:
#pragma CODE_SECTION(symbol "section name");
为代码定义段的 symbol 是函数名或者全局变量名,section name为段名,可以自定义
#pragma DATA_SECTION(symbol "section name");
为数据定义段的
在符号被定义和使用前用上述伪指令定义段
不能再函数体内用伪指令定义段
EX: #pragma DATA_SECTION(s,"newsect")
unsigned int s[100];
void main()
{
}
CMD文件的编写:
指示存储空间:需要用到哪些存储空间
分配段到存储空间:将段分配到存储空间去
上述也是编写cmd文件的两个步骤
如果要编写注视,支持/**/,不支持//
第一步:
用MEMORY伪指令来指示存储空间
MEMORY
{
PAGE0 : name0 [(attr)] : origin = constant,length = constant
name存储器名,可以自定义,1-8个字符
attr:R、W、X、I
origin存储器的起始地址
length存储空间的大小
PAGEN : name0 [(attr)] : origin = constant,length = constant
理论上N可以到255,但是2812只能用到PAGE0和PAGE1
PAGE0 用来存放程序的
PAGE1 用来存放数据的
在同一页里边儿不能有相同的存储器名,而不同页可以。
}
第二步:通过SECTIONS伪指令来将段分配到存储空间
SECTIONS
{
name : [property,property]
name是段名
property————load: load = allocation
输出段将被装载到哪里去
allocation可以是个绝对地址,但更为通常的是存储空间的名称
上述语句等效于load > allocation
: run 指示段是从什么位置开始运行的
只出现run或者load的其中一个关键字时,说明二者的地址是一样的(此时,可以用..>..表示)
: PAGE = 0 段分配到程序空间
PAGE = 1段分配到数据空间
name : [property,property]
...
}
SRAM.cmd是用来将程序分配到RAM空间,只适合程序在RAM中运行的情况,file->load pagrama来讲程序下载到RAM中
FLASH.cmd 用来将程序分配到FLASH中去,需要下载到FLASH中去而生成.out文件的时候 要用到它。需要用到TOOLS->的F2812 Chip Flash Progammer来讲程序下载到FLASH空间里去