限制:
此实现的限制因素为使用的TMS320F28xxx控制器内部RAM的大小。这限制了那些工程可以使用这种方法,如果工程太大,以至于没法放进RAM里,这种方法是不能用的。
建议:
有一些项目需要这种功能,但不是所有被初始化段都要复制到RAM或者没有足够的RAM放下所有的段。仅仅需要复制应用代码本身。这种情况下,仅仅需要复制.text段到RAM。这样子,可以把DSP28xxx_SectionCopy_nonBIOS.asm文件和cmd文件中复制其他段的代码删掉,把其他段放在flash中运行。减少flash的占用空间和缩短了运行到main()的时间。
应该确定应用程序可以处理复制代码执行时间的一点滞后。如果应用程序不能处理这段时间,可以使用Running an Application from Internal Flash Memory on the TMS320F28xx DSP (SPRA958)中的方法复制一部分主要的代码到ram。
如果使用DSP的引导,建议使用Running an Application from Internal Flash Memory on the TMS320F28xx DSP (SPRA958)中的方法复制一部分主要的代码到ram。一个使用DSP / BIOS的项目,通常是一个较大的项目,不建议使用此方案。
结语:
这份应用文档展示,在建立C语言环境之前,通过把flash的代码复制到ram,可以使TMS320F28xxx的控制器实现零等待状态运行。这方案给出了代码和存储空间的限制,为设计者提供了实现了这种功能的相关文件。
DSP中CMD文件 DSP的存储器的地址范围,CMD是主要是根据那个来编的。
CMD 它是用来分配rom和ram空间用的,告诉链接程序怎样计算地址和分配空间.
所以不同的芯片就有不同大小的rom和ram.放用户程序的地方也不尽相同.所以要根据芯片进行修改.分两部分.MEMORY和SECTIONS. MEMORY
{ PAGE 0 .......... PAGE 1......... }
SECTIONS {SECTIONS {
.vectors ................. .reset ................. ................ }
MEMORY是用来指定芯片的rom和ram的大小和划分出几个区间. PAGE 0 对应romAGE 1对应ram
PAGE 里包含的区间名字与其后面的参数反映了该区间的起始地址和长度. SECTIONS:(在程序里添加下面的段名如.vectors.用来指定该段名以下,
另一个段名以上的程序(属于PAGE0)或数据(属于PAGE1)放到“>”符号后的空间名字所在的地方。
SECTIONS {
.vectors : { } > VECS PAGE 0 .reset : { } > VECS PAGE 0 ............ ............ .......... } eg: 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 }
由三部分组成:
输入/输出定义:这一部分,可以通过ccs的“Build Option........”菜单设置 。obj 链接的目标文件 。lib 链接的库文件
。map 生成的交叉索引文件 。out 生成的可执行代码
MEMORY命令:描述系统实际的硬件资源 SECTION命令:描述“段”如何定位 例子 .cmd文件 -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 }
存储模型:c程序的代码和数据如何定位 系统定义
.cinit 存放程序中的变量初值和常量
.const 存放程序中的字符常量、浮点常量和用const声明的常量
.switch 存放程序中switch语句的跳转地址表 .text 存放程序代码
.bss 为程序中的全局和静态变量保留存储空间 .far 为程序中用far声明的全局和静态变量保留空间
.stack 为程序系统堆栈保留存储空间,用于保存返回地址、函数间的参数传递、存储局部变量和保存中间结果
.sysmem 用于程序中的malloc 、calloc 、和realoc 函数动态分配存储空间
CMD的专业名称叫链接器配置文件,是存放链接器的配置信息的,我们简称为命令文件,其中比较关键的就是MEMORY和SECTIONS两个伪指令的使用,常常令人困惑,系统出现的问题也经常与它们的不当使用有关。CCS是DSP软件对DOS系统继承的开发环境,CCS的命令文件经过DOS命令文件长时间的引申发展,已经变得非常简洁(不知道TI文档有没有详细CMD配置说明)。我学CMD是从DOS里的东西开始的,所以也从DOS环境下的CMD说起:
1命令文件的组成
命令文件的开头部分是要链接的各个子目标文件的名字,这样链接器就可以根据子目标文件名,将相应的目标文件链接成一个文件;接下来就是链接器的操作指令,这些指令用来配置链接器,接下来就是MEMORY和SECTIONS两个伪指令的相关语句,必须大写。MEMORY,用来配置目标存储器,SECTIONS用来指定段的存放位置。结合下面的典型DOS环境的命令文件link.cmd来做一下说明: file.obj //子目标文件名1 file2.obj //子目标文件名2 file3.obj //子目标文件名3
- o prog.out //连接器操作指令,用来指定输出文件 - m prog.m //用来指定MAP文件 MEMORY { 略 } SECTIONS { 略 }
otherlink.cmd
本命令文件link.cmd要调用的otherlink.cmd等其他命令文件,则文件的名字要放到本命令文件最后一行,因为放开头的话,链接器是不会从被调用的其他命令文件中返回到本命令文件。
2 MEMORY伪指令
MEMORY用来建立目标存储器的模型,SECTIONS指令就可以根据这个模型来安排各个段的位置,MEMORY指令可以定义目标系统的各种类型的存储器及容量。MEMORY的语法如下: MEMORY {
PAGE 0 : name1[(attr)] : origin = constant,length = constant name1n[(attr)] : origin = constant,length = constant PAGE 1 : name2[(attr)] : origin = constant,length = constant name2n[(attr)] : origin = constant,length = constant PAGE n : namen[(attr)] : origin = constant,length = constant namenn[(attr)] : origin = constant,length = constant }