Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3199
  • 博文数量: 1
  • 博客积分: 11
  • 博客等级: 民兵
  • 技术积分: 10
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-05 20:31
文章分类
文章存档

2017年(1)

我的朋友
最近访客

分类:

2017-01-09 20:42:26

原文地址:2812CMD文件理解 作者:red_eyed_hare

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文件的指示下,会被连接器连接在一起生成输出段。
阅读(628) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:没有了

给主人留下些什么吧!~~