HELLO四(二):2812存储器映射及CMD

这个系列为响应HELLODSP的2812学习活动的个人笔记,HELLODSP版权所有。转载请注明 

                                                                                                         ---By eys417


                   
                             2812存储器映射
 
          2812具有32位的数据地址和22位的程序地址,总地址空间可以达到4M 的数据空间和4M的程序空间。32位的数据地址,就是能访问2的32次,是4G, 而22位的程序地址,就是能访问2的22次,是4M。其实,2812可寻址的数据 空间最大是4G,但是实际线性地址能达到的只有4M,原因是2812的存储器分 配采用的是分页机制,分页机制采用的是形如0xXXXXXXX的线性地址,所以数 据空间能寻址的只有4M。
 

 

2812的存储器被划分成了下面的几个部分:
 
1.  程序空间和数据空间。2812所具有的RAM、ROM和FLASH都被统一编址,映射到了程序空间和数据空间,这些空间的作用就是存放指令代码和数据变量。
 
2.  保留区。数据空间里面某些地址被保留了,作为CPU的仿真寄存器使用,这些地址是不向用户开放的。
 
3.  CPU中断向量。在程序空间里也保留了64个地址作为CPU的32个中断向量。通过CPU寄存器 ST1中的VMAP位来将这一段地址映射到程序空间的底部或者顶部。
                                                               映射和空间的统一编址

                                                                              F2812内部的映射空间
低地址空间
 
高地址空间

 

 
2812CMD详解
 
CMD:command命令,顾名思义就是命令文件指定存储区域的分配.2812的 CMD采用的是分页制, 其中PAGE0用于存放程序空间,而PAGE1用于存放数据空间。
1.) #pragma,CODE_SECTION和DATA_SECTION伪指令
#pragma DATA_SECTION(funcA,"dataA");   ------   函数外声明
将funcA数据块定位于用户自定义的段"dataA"中   ------  需要在CMD中指定dataA段的物理地址

2.)MEMORY和SECTIONS是命令文件中最常用的两伪指令。MEMORY伪指令用 来表示实际存在目标系统中的可以使用的存储器范围,在这里每个存储器都有自 己的名字,起始地址和长度。SECTIONS伪指令是用来描述输入端是如何组合到 输出端内的。

以常用的F2812_nonBIOS_RAM.cmd     F2812_nonBIOS_Flash.cmd   和   DSP281x_Headers_nonBIOS.cmd为例
 

F2812_nonBIOS_RAM.cmd  ----- 用于仿真,无BIOS系统,片外SRAM配置

CMD文件里有两个基本的段:初始化段和非初始化段。 初始化段包含代码和常 数等必须在DSP上电之后有效的数。故初始化块必须保存在如片内FLASH等非 遗失性存储器中,非初始化段中含有在程序运行过程中才像变量内写数据进去 ,所以非初始化段必须链接到易失性存储器中如RAM。
 
已初始化的段:.text,.cinit,.const,.econst,..pinit和.switch..
 .text:所有可以执行的代码和常量 
.cinit:全局变量和静态变量的C初始化记录
.const:包含字符串常量和初始化的全局变量和静态变量(由const)的初始化 和说明 
.econst:包含字符串常量和初始化的全局变量和静态变量(由far const)的初 始化和说明 
.pinit:全局构造器(C++)程序列表
 .switch:包含switch声明的列表

 

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

F2812_nonBIOS_Flash.cmd --- 用于无BIOS,从片内FLASH引导

对于程序在FLASH中运行时,需要 注意 的: DSP在150M时钟频率下,FLASH中 只能提供大约120M的时钟频率,所以有时候我们希望在RAM中运行时间敏感或计 算量很大的子程序(比如AD采样)。但是我们所有代码都放在FLASH中,这就必 须在 上电后将FLASH中的这段敏感程序复制到RAM中运行 ,加快速度。这是在 .CMD文件就必须划分一段用来设置RAM的载入和运行地址。 程序代码如下: 
SECTIONS {……… 
   ramfuncs      :   LOAD = FLASHD, 
                              RUN = RAML0, 
                              LOAD_START(_RamfuncsLoadStart),
                              LOAD_END(_RamfuncsLoadEnd),
                              RUN_START(_RamfuncsRunStart),
                              PAGE = 0
  }
 
DSP281x_Headers_nonBIOS.cmd ----- 用于无BIOS,外设寄存器产生的数据段映射至对应的存储器空间

cmd小技巧:

如果.text文件很大将其放在一段放不下,需将其放到两个程序段中
最长的一个length=0x002000,也放不下时.可以这样处理:
PAGE 0 :
            PRAMH0     : origin = 0x3F8002, length = 0x0014FE
            L0RAM      : origin = 0x008000, length = 0x001000
 
SECTIONS
              .text:{*(.text)} >>PRAMH0|L0RAM
这样就可以将.text文件放在两个定义段中。

查看段的分配及使用情况.map的链接器(存储器)分配映射文件,链接器 的map文件描述以下内容: 通过map文件可以查看各段的分配情况,包括段的起始地址, 使用的字节数等配合cmd文件的使用,可确定各个段的使用情况,从而保证程序的正常运行 和最小的空间使用。 

VisualLinker可视化链接器TI公司出品的DSP软件开发环境CCS还提 供了一种可视化生成存储器配置文件的工具:VisualLinker可视化链接器。如果程序原来包 含了一个链接器命令文件(.cmd文件),则当创建可视化链接文件的时候,原来cmd文件中的 内存配置仍然会被使用。如果读者想修改内存配置,双击.rcp文件就会在CCS中打开可视化 链接器的图形界面,调整每个内存模块的大小,直到认为合适,然后只需要重新连编,程 序即可生成新的输出文件,重复上面的步 骤,直到出现满意的结果。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值