http://blog.csdn.net/u011392772/article/details/49760897
gel 文件中主要包含了 PLL,DDR 等的初始化工作, 具体可以看一下 gel 源码就明白了; CMD 主要是用于定义内存的划分, 及数据, 代码等的存放位置.
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 伪指令是用来描述输入端是如何组合到输出端内的.
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.
对于程序在 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
- }
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 中打开可视化链接器的图形界面, 调整每个内存模块的大小, 直到认为合适, 然后只需要重新连编, 程序即可生成新的输出文件, 重复上面的步骤, 直到出现满意的结果.
CMD 主要是用来分配 rom 和 ram 空间用的, 它告诉链接程序怎样计算地址和分配空间. 所以不同的芯片就有不同大小的 rom 和 ram. 放用户程序的地方也不尽相同. 所以要根据芯片进行修改. 分两部分. MEMORY 和 SECTIONS.
MEMORY 是用来指定芯片的 rom 和 ram 的大小和划分出几个区间.
- MEMORY
- {
- PAGE 0 ... ROM
- PAGE 1.... RAM
- }
- (`PAGE 里包含的区间名字与其后面的参数反映了该区间的起始地址和长度.)
- SECTIONS
- {
.vectors .................
.reset .................
- ................
- }
SECTIONS: 在程序里添加段名. XXXX(如. vectors.)用来指定该段名以下, 另一个段名以上的程序 (属于 PAGE0) 或数据 (属于 PAGE1) 放到 ">" 符号后的空间名字所在的地方. 下面给出一个简单的例子:
- MEMORY
- {
- PAGE 0: VECS: origin = 00000h, length = 00040h
- LOW: origin = 00040h, length = 03FC0h
- SARAM: origin = 04000h, length = 00800h
- B0: origin = 0FF00h, length = 00100h
- PAGE 1: B0: origin = 00200h, length = 00100h
- B1: origin = 00300h, length = 00100h
- B2: origin = 00060h, length = 00020h
- SARAM: origin = 08000h, length = 00800h
- }
- SECTIONS
- {
- .text : {
- }> LOW PAGE 0
- .cinit : {
- }> LOW PAGE 0
- .switch : {
- }> LOW PAGE 0
- .const : {
- }> SARAM PAGE 1
- .data : {
- }> SARAM PAGE 1
- .bss : {
- }> SARAM PAGE 1
- .stack : {
- }> SARAM PAGE 1
- .sysmem : {
- }> SARAM PAGE 1
- }
CMD 文件由三部分组成:(1) 输入输出定义;(2) MEMORY 命令;(3) SECTION 命令.
输入 / 输出定义: 这一部分, 可以通过 ccs 的 "Build Option........" 菜单设置
.obj 链接的目标文件
.lib 链接的库文件
.map 生成的交叉索引文件
.out 生成的可执行代码
MEMORY 命令: 描述系统实际的硬件资源
SECTION 命令: 描述 "段" 如何定位
下面给出一个例子:
- -c
- -o hello.out
- -m hello.map
- -stack 100
- -l rts2xx.lib
- MEMORY
- {
- PAGE 0: VECT:origin=0x8000,length 0x040
- PAGE 0: PROG:origin=0x8040,length 0x6000
- PAGE 1: DATA:origin=0x8000,length 0x400
- }
- SECTIONS
- {
- .vextors>VECT PAGE 0
- .text>PROG PAGE 0
- .bss>DATA PAGE 1
- .const>DATA PAGE 1
- }
存储模型说明:
.cinit 存放程序中的变量初值和常量
.const 存放程序中的字符常量, 浮点常量和用 const 声明的常量
.switch 存放程序中 switch 语句的跳转地址表
.text 存放程序代码
.bss 为程序中的全局和静态变量保留存储空间
.far 为程序中用 far 声明的全局和静态变量保留空间
.stack 为程序系统堆栈保留存储空间, 用于保存返回地址, 函数间的参数传递, 存储局部变量和保存中间结果
.sysmem 用于程序中的 malloc ,calloc , 和 realoc 函数动态分配存储空间. text 可执行代码
来源: http://www.bubuko.com/infodetail-3053219.html