F2812内部的映射空间:
低地址空间 |
|
0x0000 0000 |
M0 矢量RAM (VMAP=0) |
0x0000 0040 |
M0 SARAM (1K*16) |
0x0000 0400 |
M1 SARAM (1K*16) |
0x0000 0800 |
外设帧Frame0 (2K*16) |
0x0000 0D00 |
PIE向量(256*16,VMAP=1) |
0x0000 1000 |
保留空间 |
0x0000 6000 |
外设帧Frame2(4K*16) |
0x0000 7000 |
外设帧Frame1(4K*16) |
0x0000 9000 |
L1 SARAM(4K*16) |
0x0000 A000 |
保留空间 |
高地址空间 |
|
0x003D 7800 |
OTP(1K*16并保留1K) |
0x003D 8000--0x003F7FF7 |
FLASH(128K*16) |
0x003F 7FF8--0x003F7FFF |
128位密钥 |
0x003F 8000 |
H0 SARAM(8K*16) |
0x003F A000 |
保留空间 |
0x003F F000 |
Boot Rom(4K*16 MP/MC=0) |
0x003F FFC0 |
BROM向量(VMAP=1 MP/MC=0 ENPIE=0) |
2812的CMD采用分页制,其中PAGE0用于存放程序空间,而PAGE1用于存放数据空间;
在CMD文件里有两个基本的段:初始化段和非初始化段。初始化段包含代码和常数等必须在DSP上电之后有效的数。故初始化块必须保存在片内FLASH等非易失性存储器,非初始化段中含有在程序运行过程中才像变量内写数据进去,所以非初始化段必须链接到非易失性存储器中如RAM。
已初始化段包括:.text,.cinit,.const,.pinit和.switch
.text:所有可以执行的代码和常量
.cinit:全局变量和静态变量的C初始化记录
.const:包含字符串常量和初始化的全局变量和静态变量(由const)的初始化和说明
.econst:包含字符串常量和初始化的全局变量和静态变量(由far const)的初始化和说明
.pinit:全局构造器(C++)程序列表
.switch:包含转换语气声明的列表
非初始化的段:.bss,.ebss,.stack,.sysmem,.esysmem(即存储空间)
.bss:为全局变量和局部变量保留的空间,在程序上电时,cinit空间中的数据复制出来并存储在.bss空间
.ebss:为使用大寄存器模式时的全局变量和静态变量预留的空间,在程序上电时,cinit空间中的数据复制出来并存储在.ebss中
.stack:为系统堆栈保留的空间,主要用于和函数传递变量或为局部变量分配空间
.sysmem:为动态存储分配保留的空间。若有宏函数,此空间被宏函数占用,如果没有的话,此空间保留为0
.esysmem:为动态存储分配保留的空间。若有far函数,此空间被相应占用,如果没有的话,此空间保留为0
存储类型总结:
已初始化段 |
存储类型 |
页 |
.text |
ROM OR RAM (FLASH) |
0 |
.cinit |
ROM OR RAM (FLASH) |
0 |
.const |
ROM OR RAM (FLASH) |
1 |
.econst |
ROM OR RAM (FLASH) |
1 |
.pinit |
ROM OR RAM (FLASH) |
0 |
.switch |
ROM OR RAM (FLASH) |
0,1 |
未初始化段 |
|
|
.bss |
RAM |
1 |
.ebss |
RAM |
1 |
.stack |
RAM |
1 |
.sysmem |
RAM |
1 |
.esysmem |
RAM |
1 |
#pragma是标准C中保留的预处理命令,程序员可以通过#pragma来定义自己的段,#pragma的语法:
#pragma CODE_SECTION (symbol,"section name”);
#pragma CODE_SECTION (symbol,"section name”);
说明:
1. symbol是符号,可以上函数名也可以是全局变量;section name是用户自己定义的段名。
2. CODE_SECTION用来定义代码段,DATA_SECTION用来定义数据段。
注意:不能在函数体内声明#pragma;必须在符号被定义和使用前使用#pragma
CMD文件支持C语言中的块注释符“/**/”,但不支持行注释符“//”;CMD文件的两大功能是指示存储空间和分配段到存储空间:
1.通过MEMORY伪指令来指示存储空间
MEMORY
{
PAGE0:name0[(attr)] : origin=constant, length=constant
PAGEn:namen[(attr)] : origin=constant, length=constant
}
(1) PAGE 用来标示存储空间的关键字。n最大值为255,一般只有page0和page1,其中page0为程序存储空间,page1为数据存储空间;
(2) name 代表某一属性和地址范围的存储空间名称。名称可以是1~8个字符,在同个页内名称不能相同,不同页内名称能相同。
(3) attr 用来规定存储空间的属性。共4个,分别用4个字母表示:只读R、只写W、改空间可包含可执行代码X、改空间可以被初始化I。实际使用时,简化起见,常忽略此选项,这样存储空间就具有所有的属性。
(4) origin 用来定义存储空间其实地址的关键字。
(5) length 用来定义存储空间长度的关键字。
2.通过SECTIONS伪指令来分配段到存储空间
SECTIONS
{
name : [property, property, property, ...]
name : [property, property, property, ...]
.......
}
(1) name 输出段的名称。
(2) property 输出段的属性。
1)load: 定义输出段将会被装载到哪里的关键字。语法如下:
load = allocation 或 allocation 或 >allocation
2)run : 定义输出段将会在哪里运行的关键字。语法如下:
run = allocation 或 run >allocation
cmd文件规定当只出现一个关键字load或run时,表示load地址和run地址是重叠的。实际应用中,大部分段的load地址和run地址是重叠的,除了.const段。
(3)输入段。{input_sections}
这里对输入段与输出段做一个区分:每一个汇编或C语言文件经过编译会生成若干个段,多个汇编或C语言文件生成的段大都是同名的,常见的如前面已经介绍的段.cinit,.bss等等。这些段都是输入段。这些归属于不同文件的输入段,在CMD文件的指示下,会被连接器连接在一起生成输出段。
阅读(3871) | 评论(0) | 转发(1) |