dsp CMD文件的原理 经典.docx

上传人:b****8 文档编号:10999699 上传时间:2023-02-24 格式:DOCX 页数:24 大小:37.61KB
下载 相关 举报
dsp CMD文件的原理 经典.docx_第1页
第1页 / 共24页
dsp CMD文件的原理 经典.docx_第2页
第2页 / 共24页
dsp CMD文件的原理 经典.docx_第3页
第3页 / 共24页
dsp CMD文件的原理 经典.docx_第4页
第4页 / 共24页
dsp CMD文件的原理 经典.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

dsp CMD文件的原理 经典.docx

《dsp CMD文件的原理 经典.docx》由会员分享,可在线阅读,更多相关《dsp CMD文件的原理 经典.docx(24页珍藏版)》请在冰豆网上搜索。

dsp CMD文件的原理 经典.docx

dspCMD文件的原理经典

CMD文件的原理玄德(网名)于2009年3月 

一、前言 

开发TI公司的DSP芯片,肯定要编写或者修改CMD文件,这是在单片机开发中

没有碰到过的新事物,也是学习DSP的难点。

面对里面种类繁多、名称各异、来历不明、

作用不清、功能千差万别的存储器、区域和变量、寄存器,初学者往往都会一头雾水。

至很多人已经把项目成功地完成了,对CMD文件仍然是一知半解。

 

笔者也经历了极度困惑的过程,曾经大量地看书,下载资料,分析所能搜集到的

CMD源文件。

可惜的是,无论是TI公司的原始文档,还是网上的资料,或者BBS的帖子,

都没有透彻地说明CMD文件的原理和使用,只说“然”,要靠自己去体会“所以然”,去

“悟”。

 

终于有一天,我悟到了,也许只是“一些”。

现在,我把自己的“一些”写下来。

我将细致而通俗地说明CMD文件的原理,给您“鱼”,更给您“渔”,一步步地引导象我

当初一样的初学者。

我将以TI的2407为对象展开说明,对于TI公司其他型号、其他系

列的DSP,道理是完全相同的。

用时下学术界最最最流行的语式,叫做“基于2407”

——这个词起源于英文的“basedon”,或“somethingbased”,被我们大量地引用,以

至于令人反胃了——我们美妙、绚烂的语言,现在只剩下“基于”了。

 

笔者水平有限,但保证会用心去写,您会看到很多别处没有的思路和信息,相信会

基本打通初学者的任督二脉。

本文适用于那些有单片机的开发基础、刚开始学习DSP的

初学者。

如果你还不知道程序空间,数据空间这些名词,可能就比较困难了。

 

二、CMD文件的起源 

在DSP系统中,存在大量的、各式各样的存储器,CMD文件所描述的,就是开发

工程师对物理存储器的管理、分配和使用情况。

 

有必要先复习一下存储器的知识。

目前的物理存储器,种类繁多,原理、功能、参

数、速度各不相同,有PROM、EPROM、EEPROM、FLASH、NANDFLASH、NORFLASH

等(ROM类),还有SRAM、DRAM、SDRAM、DDR、DDR2、FIFO等(RAM类)。

论多么复杂,从断电后保存数据的能力来看,只有两类:

断电后仍然能够保存数据的叫做

非易失性存储器(non-volatile,本文称为ROM类),数据丢失的叫做易失性存储器(本文

称为RAM类);ROM类的芯片都是非易失性的,而RAM类都是易失性的。

即使同为ROM类或同为RAM类存储器,仍然存在速度、读写方法、功耗、成本等诸多方面的差别。

如SRAM的读写速度,从过去的15ns、12ns,提高到现在的8ns、10ns,FLASH的读取

速度从120ns、75ns,到现在的40ns、30ns。

 

有没有人这样想过:

使用存储器的人,希望存在这样的区别吗?

 

或者说,理想的存储器,应当是什么样的?

 

………… 

我们使用存储器时,如果没有人为地改变它,就希望里面的数据永远不要变,即使

断了电也要完好地保存;如果里面的内容是我不需要的或者不能用的,我自然就会给它写

入有用的内容,比如初始化。

理想的存储器就应当永远保存数据,无论掉电与否,而且,

希望读写速度为每秒无穷多字节,是0ns,而不是什么8ns,10ns。

——不是吗?

 

然而,人类实现存储器芯片的技术,还没有达到理想情况,所以才会有这么多类别。

“非易失”和“速度”就是一对典型的矛盾。

非易失的ROM类存储器,可以“永远”地

保存数据,但读写速度却很低,比如30ns;RAM的速度(8ns)一般都比ROM(30ns)

快得多,但却不能掉电保存。

这是很无奈的现实。

假如有那么一天,ROM类的读写速度

和RAM一样快,或者RAM也可以掉电保存数据,就不存在易失和非易失的区别了,那将

是革命性的进步。

那时,智能芯片和智能系统的设计将会有很大的变化,编写CMD文件

就会很简单,甚至不需要了。

 

已经有芯片厂家做了一些这方面的工作,比如把电池和RAM结合起来,就是一个

能掉电保存的RAM。

它既可以作为传统的ROM使用,又可以当RAM使用。

但这显然只

是一个暂时、折中的方法,其原理、成本、体积、容量还不如人意,不能算是“革命性”

的进步。

 

我们平时在用到存储器的时候,要考虑哪些因素呢?

 

首先必须确认,在你的使用场合,是要永久保存数据,还是暂时保存?

这关系到选

择非易失性,还是易失性存储器的大问题,是首要的问题。

在某些场合,如果必须永远地

保存数据,即使希望速度快一些,也只能选择非易失的ROM类存储器,而把速度问题放

在其次,或者另外想办法解决;另外一些场合,却要把速度放在第一位,只要在通电期间

能够始终保存数据,就够了,当然就要选择RAM类的存储器了。

 

这两种情况我们都会遇到:

程序代码一般都要存储在ROM类存储器中,否则,从

设备生产开始,储存、运输,一直到用户手里,要必备不间断电源,还要保证不发生断电

的意外;程序运行的时候,为了提高速度,就必须在RAM中运行,试想想,如果你的MP4

放电影一停一顿的,谁还会用它看电影呢?

所以ROM和RAM都是必不可少的,各有各的用途,而且,出于功能、参数、速度、读写方法、功耗、工艺、成本等方面的考虑,往

往要同时使用不止一种存储器。

 

事实上,TI在设计DSP芯片时,也遇到同样的问题,TI考虑的情况要比我们更多,

更复杂。

要知道,设计芯片的人是最牛X的,开发工程师只是跟在人家后面,在人家规定

的框框里亦步亦趋。

翻开DSP的PDF文档,找到memorymap就会看到,芯片上集成了

形形色色的存储器:

FLASH、ROM、BROM、OTPROM,SRAM、SARAM、DARAM、

FIFO等。

就2407和2812而言,如果是做个流水灯之类的小东东,DSP芯片加晶体加电

源就可以了,片上集成的ROM和RAM,在仿真状态下已经足够用了,烧写并脱离仿真器

运行也足够。

所以,它们的最小系统不需要外扩任何存储器。

但也只能做简单的东东,往

往还需要外扩一些ROM和/或RAM存储器,才能委以大用。

(顺便说一句,DSP的最小

系统,要比8951芯片的最小系统大得多。

) 

千万不要被这些存储器的名称所迷惑!

翻来覆去,其实就是两大类:

非易失和易失。

初学者往往忽略了这一点。

 

两大类!

记住这一点,CMD文件就是以这两类存储器为主轴,然后展开的。

 

DSP芯片的片内存储器,只要没有被TI占用,用户都可以全权支配。

TI设计了“CMD

文件”这种与用户的接口形式,用户通过编写CMD文件,来管理、分配系统中的所有物

理存储器和地址空间。

CMD文件其实就是用户的“声明”,包括两方面的内容:

 

1、用户声明的整个系统里的存储器资源。

无论是DSP芯片自带的,还是用户外扩

的,凡是可以使用的、需要用到的存储器和空间,用户都要一一声明出来:

有哪些存储器,

它们的位置和大小。

如果有些资源根本用不到,可以视为不存在,不必列出来;列出来也

无所谓。

 

2、用户如何分配这些存储器资源,即关于资源分配情况的声明。

用户根据自己的

需要,结合芯片的要求,把各种数据分配到适当种类、适当特点、适当长度的存储器区域,

这是编写CMD文件的重点。

 

用户编写完自己的程序以后,要经过开发环境(编译器)的安排和解释(即编译),

转换为芯片可以识别的机器码,最后下载到芯片中运行。

CMD文件就是在编译源程序、

生成机器码的过程中,发挥作用的,它作为用户的命令或要求,交给开发环境(编译器)

去执行:

就这么分配!

 

下面将从这两个方面入手,详细说明如何编写CMD文件。

 

三、编写CMD文件之——资源清单如上文所述,CMD文件包含两大内容,首先就是存储器的资源清单,或者说,系

统中(电路板上)可用的存储器资源。

 

TI规定,CMD文件的资源清单用关键字“MEMORY”作为标识,具体内容写在后

面的大括号{}里面。

如下面的形式:

 

MEMORY 

PAGE0:

 

xxx :

org=0x1234, length=0x5678 /*Thisismyhouse.*/ 

PAGE1:

 

aaa :

org=0x1357, length=0x2468 /*Myhomehere.*/ 

其中,MEMORY,PAGEn,org,length,包括冒号、等于号、花括号,都是关键

字符,必不可少。

 

PAGEn表示把可用的资源空间再划分成几个大块,最多允许分256块,从PAGE 

0到PAGE255。

如果把MEMORY比作图书馆,PAGEn就是其中的“社科类”、“工程类”、

“外文类”等。

大家都习惯于把PAGE0作为程序空间,把PAGE1作为数据空间。

如果

你很好奇,也可以试试别的数字。

凡智能芯片,都离不开这两种“空间”,大名鼎鼎的冯·诺

依曼结构和哈佛结构,都是建立在程序空间和数据空间两种结构的基础上,我们面对的

DSP也是如此。

只要学习过单片机,就很容易理解。

如果你构思出第三种结构,恭喜您,

您将与这二位齐名了。

 

CMD文件中还可以写上注释,用“/*”和“*/”包围起来,但不允许用“//”,这一

点和C语言不同。

 

上面的例子,仅仅就是个“例子”,不针对任何特定的芯片。

带注释的语句有两行,

每一行都是一项声明,表示在程序空间或数据空间下,再细分更小的块,好比是“社科类”

又分了几个书架。

比如 

xxx:

org=0x1234,length=0x5678 

表示在程序空间PAGE0里面,划分出一个命名为xxx的小块空间,起始地址从存储单元

0x1234开始,总长度为0x5678个存储单元,地址和长度通常都以十六进制数表示。

所以,

xxx空间的实际地址范围从0x1234开始,到0x1234+0x5678–1=0x68AB结束(起始

地址加长度再减一),这一段连续的存储区域,就属于xxx小块了。

上面的例子中,PAGE 

0和PGAE1各包含了只有一个“小块”,用户可以根据自己的情况,按照同样的格式任意

增加。

在支持多个CMD文件的开发环境里,某个或某几个CMD文件中,“小块”的数量

可以为0,也就是说,关键字PAGE0或PAGE1下面,可以是空白的。

但不允许所有的

CMD文件的同一空间都是空白。

另外,没有资料提到过“小块”数量上限的限制,需要去查阅文档或咨询TI公司。

 

很多关键字,还允许有别的写法,比如“org”可以写为“o”,“length”可以写为

“len”。

这些规定和其他细节,可以去查阅TI的pdf文档,一般叫做“xxxxxAssembly 

LanguageToolsUser'sGuide.pdf”,汇编语言工具指南,xxxxx是芯片的型号或系列。

这个文档不适合初学者。

 

实践证明,至少对于C2000系列的2407和2812而言,存储单元的单位是“字

word”,即16bit。

但TI的文档却说是“字节byte”,应当是TI写错了。

 

要特别注意以下几点:

 

1、必须在DSP芯片的空间分配的架构体系以内,分配所有的存储器。

这里举两个

例子:

 

a、对于2407,程序空间和数据空间都是从地址0x0000到0xFFFF,最大数

值是四个F,共64K字范围。

所以,2407的CMD文件中不能出现五位数的地址,也不允

许任何一个小块空间的地址范围覆盖到64K以外的区域,因为2407根本就无法控制这些

区域,或者说不能访问、无法寻址。

要注意,起始地址和长度不要算错了。

2812也有同样

的问题。

 

b、2407的数据空间里,0x0100~0x01FF和其他几块区域,是TI声明的保留

空间(Reserved或illegal),也是芯片无法访问的,分配资源的时候不能涉及到这些区域。

同样地,2812的程序空间和数据空间,都有大片的保留区域,不能使用。

 

2、每个小块的空间,必须是一片连续的区域。

因为,编译器在使用这块区域的时

候,默认它是连续的,而且每个存储单元都是可用的。

 

3、同一空间下面,任何两个小块之间,不能有任何的相互覆盖和重叠。

 

在外扩存储器时,要保证片外的存储空间之间,特别是片外与片内的存储空间之间,

不要发生冲突。

有些空间,已经被DSP芯片的内部存储器占用了,用户是不可更改的,

或只能通过模式配置,在一定范围内改动,用户自行扩展存储器时,要避开这些地方。

 

4、用户所声明的空间划分情况,必须与用户电路板的实际情况相符合!

 

对于用户自制的电路板,这是很容易出错的地方,通常会出现两种错误:

 

a、在设计硬件电路的时候,通常用CPLD作为片外存储器的选通信号,用

verilog或者VHDL进行编程;也有用74或4000系列芯片来搭建的,已经很少了。

如果

CPLD逻辑出错,或者逻辑并没有真正写入CPLD芯片里面,即使CMD文件是正确的,

即使编译已经通过,在仿真下载或者烧写的时候,PC机都会报错而无法继续操作。

 

b、电路板有虚焊的地方,主要发生在DSP芯片的管脚、电平转换芯片的管脚,及片外存储器的管脚上。

这种情况,效果等同于上面所说的CPLD逻辑错误。

更要命的是,

补焊一次、两次甚至几次,虚焊仍然存在,这最容易把人搞糊涂了。

笔者就经常遇到这样

的事情。

 

出现这些硬件错误时,初学者往往不能正确地对故障作出定位,一会儿认为CMD

文件有问题,一会儿觉得硬件电路有问题,反复地折腾,最后陷入迷茫。

这时,一定要保

持清醒的头脑:

先检查原理设计;再检查硬件电路板,保证逻辑正确,焊接可靠;最后再

去检查CMD文件。

 

5、一般地,初学者会找一些现成的CMD文件来用,一点改动都不敢。

其实,胆

子可以大一些,改一改,试一试,没什么大不了的。

想学会游泳,必须要下水。

DSP芯片

上的存储器,只要没有被TI用作专门的用途,用户都可以全权支配。

空间的划分,是由用

户决定的,可以根据需要,甚至个人的喜好来划分,名称也可以随意起,和C语言的变量

名一样。

 

这里应当举一个CMD文件资源声明的例子,但为时过早。

资源声明常常与资源分

配是密切相关的,笔者把例子放在下一节,与资源分配一起详细说明,效果会好一些。

 

四、编写CMD文件之——资源分配 

系统资源已经声明完了,现在就要说明,用户是如何分配这些存储器资源的,即向

编译器声明资源的分配情况。

 

要合理地分配存储器资源,首先要搞清一个问题:

资源要分配给谁?

有哪些东东需

要占用存储器?

 

我们来看下面这段不严格的C程序:

 

main() 

unsigned int i; 

i++; 

这“段”程序只是笔者建立的一个模型,用它来代表几乎所有的程序:

哪怕变量(包

括数组)有一千个、一万个,都用一个“i”来代表;哪怕程序主体包含了各种搬移、运算、

逻辑等动作,哪怕有一万行那么长,都用一句“i++”来表示。

 

让我们站在TI公司和编译器的角度,来考虑下面的问题:

程序经过编译以后,会

产生哪些对存储器资源有要求的“状况”?

 

有单片机开发经验的人都知道,至少要产生两种情况:

 

1、指令码,即二进制形式的指令,需要占用芯片的“程序空间”。

这些数据,完全等价于或等同于用户编写的程序,只是转换成了另一种形式而已。

这种“数据”有两个特

点:

a、只要用户程序编写完成,这些“数据”就已经是可知的、可预期的,是由用户编

写的程序代码和编译器共同决定的。

b、在系统运行过程中,这些数据的内容不会发生任

何变化,只会被读取,不会被修改。

 

2、在运行过程中,动态变化的“量”,需要占用“数据空间”。

上面例子程序中的

变量i,就属于这种情况。

这些数据,在设计师编写程序的时候,有时会预先写入具体的

数值,即初始化,有时甚至根本不需要进行初始化。

在运行过程中,既要被读取,又会被

改写,经常在变化。

设计师自己也很难确切知道,在某一时刻,这些数据的具体的数值是

什么,最多只知道它们的位数、最大和最小值的范围。

 

那么,什么样的物理存储器适合于数据空间使用,什么样的存储器适合于程序空间

使用呢?

 

对于数据空间,其最基本、最首要的要求是速度快,并不要求掉电保存数据的能力,

显然应当由RAM类存储器来承担,所以,RAM一般都必不可少。

但是,并不是说数据空

间只能连接RAM芯片,只要你能够接受比较慢的速度,并且安排好芯片的控制时序,你

完全可以在数据空间扩展ROM类存储器。

 

程序空间的代码数据,一般都要求掉电保存,只能由ROM来承担,所以ROM必

不可少。

那么,ROM的读取速度慢的问题,怎么解决呢?

对于有些低速的智能芯片,ROM

的速度慢一点,是完全可以接受的,可以直接从ROM中读取代码指令,然后译码、执行;

我们熟悉的MCS51、PIC系列单片机,都是这么做的(以下信息笔者不能保证正确性:

2407脱离仿真器运行时,似乎也是直接从ROM中读取程序代码)。

另外有一些低端的智

能芯片,生产商通过特殊的技术手段,在一定范围内等效地提高内部程序ROM的读取速

度,比如NXP公司的ARM芯片LPC213x,虽然ARM内核的数据接口只有32位,但

LPC213x的片内FLASH程序存储器,与内核之间的接口居然是128位宽度,通过所谓“加

速器”相连接。

对于高速的智能芯片,从ROM直接读取代码并执行,已经不能满足速度

的要求了,通常的解决方法是,把程序代码储存在ROM中,在每次上电运行时,通过“引

导程序”把用户代码读出并保存在RAM中,然后从RAM中运行,这样做既解决了ROM

速度慢的问题,又解决了RAM掉电丢失数据的问题。

 

实际操作中,并不是只有指令码和变量i这么简单,除这两项以外,还会出现很多

小“状况”;而且,当芯片型号不同,甚至用户源程序不同时,出现的细节也是变化的。

恰就是这些变化,导致CMD文件变得复杂。

 

但是,任何大“状况”、小“状况”,都归属于对程序空间和数据空间的操作,不存在第三种空间。

(有些DSP的所谓“IO空间”,实质上是数据空间的一个变种,但又脱离

了数据空间,不属于CMD文件考虑的范围。

) 

编写CMD文件,就是要搞清楚以下情况,并对编译器做出声明:

 

1、你的系统都有哪些存储器资源?

 

2、哪些存储器安排在程序空间,哪些在数据空间?

 

3、你的系统会产生哪些大“状况”和小“状况”?

 

4、哪些状况属于程序空间,哪些属于数据空间?

 

5、程序空间的“状况”如何安排在程序空间的资源里,数据空间的“状况”如何

安排在数据空间的资源里?

 

笔者想从事情的起源入手,逐步引导初学者自己去发现“资源要分配给谁?

有哪些

东东需要占用存储器?

”这个问题的答案,所以使用了一些不正规的术语,比如“状况”

这个词。

 

让我们从一个实际使用过的2407芯片的CMD文件来展开说明,其他DSP芯片的

CMD文件与此大同小异:

 

/**********************************************************************************************/ 

-stack200h                 /*#1 */ 

/**********************************************************************************************/ 

MEMORY                 /*#2 */ 

PAGE0:

 

VECS :

origin=0000h,length=0040h /*中断向量  */ /*#3 */ 

PROG :

origin=0100h,length=7F00h /*片上FLASH */ /*#4 */ 

PAGE1:

 

B2  :

origin=0060h,length=0020h /*DARAMB2块*/ /*#5 */ 

B0B1 :

origin=0200h,length=0200h /*DARAMB0块*/ /*#6 */ 

SARAM:

origin=0800h,length=0800h /*SARAM块 */ /*#7 */ 

ExtSRAM:

origin=8000h,length=8000h /*外部存储器 */ /*#8 */ 

/**********************************************************************************************/ 

SECTIONS                 /*#9 */ 

.vectors:

 >VECS PAGE0  /*中断向量表 */ /*#10*/ 

.text :

 >PROG PAGE0  /*代码   */ /*#11*/ 

.cinit :

 >PROG PAGE0         /*#12*/ 

.bss :

 >SARAMPAGE1         /*#13*/ 

.stack :

 >B0B1 PAGE1         /*#14*/ 

.extdata:

 >ExtSRAMPAGE1         /*#15*/} 

/**********************************************************************************************/ 

下图是2407芯片的空间分配情况(MemoryMap),是从2407的数据手册直接复

制过来的:

 

#2行至#8行,MEMORY {……}部分,就是上一节我们已经说明的,系统可用

资源的声明,包括程序空间PAGE0和数据空间PAGE1两部分。

 

程序空间PAGE0,又分为VECS区域和PROG区域。

 

#4行所声明的PROG区域,是为用户指令码分配的存储空间,这部分空间一般都很大(比如0x7E00h)。

 

相当于PROG用户指令码区域,#3行声明的VECS区域是一个特殊的“小状况”,

TI在设计2407的硬件电路时,用这块区域来保存各种中断服务程序的入口地址,即中断

向量,与硬件电路挂钩,不能与一般的程序代码相混杂,所以要单独声明。

按照芯片手册

的说法,0x0000至0x003F共0x40个存储器单元

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 经济学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1