DSP中CMD文件的编写_dsp中cmd文件的编写

2020-02-27 其他范文 下载本文

DSP中CMD文件的编写由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“dsp中cmd文件的编写”。

DSP中CMD文件的编写

CMD文件(xxxx.cmd)是用来分配DSP工程中rom和ram空间的,告诉链接程序怎样计算地址和分配空间。

CMD文件分为两大部分:MEMORY

SECTIONS。

MEMORY: 伪指令。对DSP系统的ROM(如DSP芯片内的ROM,FLASH,外挂ROM)和RAM划分为N个不同的区间。这些区间根据存储目的可以分为两大类:程序存储(对应于PAGE 0)和数据存储(对应于PAGE 1)。例如: MEMORY {

PAGE 0: VECS

origin = 00000h,length = 00040h

LOW:

origin = 00040h,length = 03FC0h

SARAM:

origin = 04000h,length = 00800h

B0:

origin = 0FF00h,ength = 00100h PAGE 1: B0:

origin = 00200h,length = 00100h

B1 :

origin = 00300h,length = 00100h

B2:

origin = 00060h,length = 00020h

SARAM:

origin = 08000h,length = 00800h }

中的语句:

VECS: origin = 00000h, length = 00040h VECS为区间名,origin指定本区间的起始地址,length指定本区间的长度。

SECTIONS:伪指令。(在程序里添加下面的段名如.test用来指定该段名以下,另一个段名以上的程序(属于PAGE0)或数据(属于PAGE1)放到“>”符号后的空间名字所在的地方。例如: SECTIONS {

.text :

> LOW

PAGE 0

.cinit :

> LOW

PAGE 0

.switch :

> LOW

PAGE 0

.const :

> SARAM

PAGE 1

.data :

> SARAM

PAGE 1

.b :

> SARAM

PAGE 1

.stack :

> SARAM

PAGE 1

.sysmem :

> SARAM

PAGE 1 } SECTIONS中的段名有两个来源:系统自动生成 和 用户自定义。如下为系统自动生成的段名:(通用部分)

.cinit

存放程序中的变量初值和常量

.const

存放程序中的字符常量、浮点常量和用const声明的常量.switch

存放程序中switch语句的跳转地址表

.text

存放程序代码

.b

为程序中的全局和静态变量保留存储空间

.far

为程序中用far声明的全局和静态变量保留空间

.stack

为程序系统堆栈保留存储空间,用于保存返回地址、函数间的参数传递、存

储局部变量和中间结果

.sysmem

用于程序中的malloc、calloc、和realoc 函数动态分配存储空间。以上所列的段名并不完全,它们各自的块连接属性也不尽相同,可以查阅相关资料。

如:.const仅可用于小存储器模型——小存储器模型要求初始化块连接到低64K字的非易失性存储空间中,而F2812在低64K中没有FLASH,因此编译器要采用大存储器模式,相应的要用.econst代替.const。

系统自带的段名:(选择部分)(常见于DSP28x_CodeStartBranch.asm)

.reset

只包含一个32位的中断矢量,指向实时支持库rts2800_ml.lib中的C编译器导引函数,即_c_int00子程序。通常我们不用此块,而是另外创建分支指令指向开始代码。

用法如下: SECTIONS {.reset

:>FLASH,PAGE=0.TYPE=DSECT

}

语句中的“TYPE=DSECT”用来提示编译器编译时将.reset段忽略掉。.codestart

包含一条长跳转指令,指向实时支持库rts2800_ml.lib中的C编译器导引函数,即_c_int00子程序。不同的是:如果系统的程序(.text)放在系统内部RAM中仿真运行,则本块应放入片内RAM中,如地址单元0x3F8000;如果是固化程序进FLASH,则.codestart应定位与FLASH中的其实地址为0x3F7FF6中。(一条长跳转指令占2个字)。

.ramfuncs

此程序块用于对FLASH的控制寄存器进行初始化设置。

FLASH的控制寄存器受代码安全模块CSM保护,因此如果DSP是安全的(烧写后的FLASH往往处于这种状态),则必须从受保护的RAM中执行FLASH寄存器初始化代码。

InitFlash()位于DSP281x_SysCtril.c文件中,为FLASH寄存器初始化用,将次程序放进.ramfuncs块中。

MemCpy()位于DSP281x_MemCopy.c文件中,在对FLASH寄存器初始化时,用于将指定的FLASH中的程序段复制到指定的RAM区中。如例:

extern Uint16 RamfuncsLoadStart;extern Uint16 RamfuncsLoadEnd;extern Uint16 RamfuncsRunStart;„„

Void main(main){

„„

MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);

InitFlash();„„

}

在系统的cmd文件中有:

SECTIONS {

„„

Ramfuncs:

LOAD = FLASHD, PAGE = 0

RUN = RAMM1, PAGE = 0

LOAD_START(_RamfuncsLoadStart),LOAD_END(_RamfuncsLoadEnd),RUN_START(_RamfuncsRunStart),„„

} 上例中SECTIONS段的语法如下: SECTIONS { name : [property,property,……] } name:输出段的名称 property:输出段的属性:

load=allocation(强制地址或存储空间名称)同>allocation:定义输出段将会被装载到哪里。run= allocation(强制地址或存储空间名称)同>allocation:定义输出段将会在哪里运行。另:CMD文件中只出现一个关键字load或run时,表示两者的地址时表示两者的地址时重合的。

用户自定义的块:

利用pragma语法来指定程序中的(用户自编写)函数的存放目的块,这个目的块可以在cmd文件中指定实际物理地址。

pragma:

CODE_SECTION(func,”section name”)

DATA_SECTION(symbol,”section name”)

其中,func和symbol必须在主函数外声明或定义,同时也必须在声明,定义和引用func和symbol之前指定pragma语句。

#pragma可以阻止对未调用的函数的优化。

根据自己的经验,codestart块与reset块并没有什么用处。

F2812的DSP芯片内部有一个BOOTROM,存储着出厂前已经编制好的导引加载程序和标准数学表,同时也包含复位矢量和CPU矢量表(仅用于测试)。当DSP上电后,导引加载程序会自动配置所需要的设置,例如配置好EMIF以存取flash,配置GPIO口为把程序从外部RAM或ROM下载到内部RAM中做准备。

————————类似于PC的加电硬件检测 在运行C程序(main函数)之前,必须创建C运行环境。这个任务由C引导程序(BOOTRAM中固化的导引加载程序)使用名为c_int00()的子程序来执行。此函数位于rts.lib文件中。

在系统开始运行时,c_int00()可以被调用,通常由硬件复位来调用。必须将c_int00()与其他的目标模块连接起来,当使用C连接器并且包含rts28xx.lib作为连接器输入文件时,以上调用自动实现。当连接C程序时,连接器将可执行输出模块中的入口点的值赋给c_int00()函数,这些可执行输出模块不尽相同,但最为人关心的则是由c_int00()来启动main()函数运行自己的C程序。

而在.codestart 和.reset代码块的编写的汇编程序的功能也仅仅是引导BOOTROM中的导引加载程序与c_int00()函数的衔接。

目前所接触的应用于F2812DSP芯片的程序也都是DSP/BIOS型的,不是non_DSP/BIOS类型的。

《DSP中CMD文件的编写.docx》
将本文的Word文档下载,方便收藏和打印
推荐度:
DSP中CMD文件的编写
点击下载文档
相关专题 dsp中cmd文件的编写 文件 DSP cmd dsp中cmd文件的编写 文件 DSP cmd
[其他范文]相关推荐
    [其他范文]热门文章
      下载全文