|
作者:EDA Code成员 fly_in_sky
补充说明:作者是我们组员,他没空,所以我发上来,但绝对是原创,这里是原帖http://www.edacode.com/bbs/thread-176-1-1.html,代为申请加精。
PDF文件点击此处下载 ourdev_586516XJQN0H.pdf(文件大小:638K) (原文件名:2812CMD详解.pdf)
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配置
![](http://cache.amobbs.com/bbs_upload782111/files_33/ourdev_586490YJJ5UV.jpg)
(原文件名:1.jpg)
CMD文件里有两个基本的段:初始化段和非初始化段。初始化段包含代码和常数等必须在DSP上电之后有效的数。故初始化块必须保存在如片内FLASH等非遗失性存储器中,非初始化段中含有在程序运行过程中才像变量内写数据进去,所以非初始化段必须链接到易失性存储器中如RAM。
已初始化的段:.text,.cinit,.const,.econst,..pinit和.switch..
.text:所有可以执行的代码和常量
.cinit:全局变量和静态变量的C初始化记录
.const:包含字符串常量和初始化的全局变量和静态变量(由const)的初始化和说明
.econst:包含字符串常量和初始化的全局变量和静态变量(由far const)的初始化和说明
.pinit:全局构造器(C++)程序列表
.switch:包含switch声明的列表
![](http://cache.amobbs.com/bbs_upload782111/files_33/ourdev_586491U5KEZ8.jpg)
(原文件名:2.jpg)
非初始化的段:.bss,.ebss,.stack,.sysmem,和esysmem.(更好的理解就是,这些段就是存储空间而已)
.bss: 为全局变量和局部变量保留的空间,在程序上电时.cinit空间中的数据复制出来并存储在.bss空间中。
.ebss:为使用大寄存器模式时的全局变量和静态变量预留的空间,在程序上电时,cinit空间中的数据复制出来并存储在.ebss中
.stack:为系统堆栈保留的空间,用于和函数传递变量或为局部变量分配空间。
.sysmem:为动态存储分配保留的空间。如果有宏函数,此空间被宏函数占用,如果没有的话,此空间保留为0
.esysmem:为动态存储分配保留的空间。如果有far函数,此空间被相应的占用,如果没有的化,此空间保留为0.
![](http://cache.amobbs.com/bbs_upload782111/files_33/ourdev_586492S55GWZ.jpg)
(原文件名:3.jpg)
F2812_nonBIOS_Flash.cmd --- 用于无BIOS,从片内FLASH引导
![](http://cache.amobbs.com/bbs_upload782111/files_33/ourdev_586493HUAA5I.jpg)
(原文件名:4.jpg)
![](http://cache.amobbs.com/bbs_upload782111/files_33/ourdev_586494VXW6SJ.jpg)
(原文件名:5.jpg)
对于程序在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,外设寄存器产生的数据段映射至对应的存储器空间
![](http://cache.amobbs.com/bbs_upload782111/files_33/ourdev_586495ZBNYCW.jpg)
(原文件名:6.jpg)
![](http://cache.amobbs.com/bbs_upload782111/files_33/ourdev_586496QN540R.jpg)
(原文件名:7.jpg)
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中打开可视化链接器的图形界面,调整每个内存模块的大小,直到认为合适,然后只需要重新连编,程序即可生成新的输出文件,重复上面的步 骤,直到出现满意的结果。 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|