dsp cmd配置
- 格式:doc
- 大小:71.50 KB
- 文档页数:12
DSP的CMD文件详解CMD是用来分配ROM和RAM空间用的,告诉链接程序怎样计算地址和分配空间。
所以不同的芯片就有不同大小的ROM和RAM,存放用户程序的地方也不尽相同。
所以要根据芯片进行修改,分为 MEMORY 和SECTIONS两个部分。
MEMORY{PAGE 0 ..........PAGE 1.........}SECTIONS{.vectors ..................reset .................................}MEMORY是用来指定芯片的ROM和RAM的大小和划分出几个区间。
PAGE 0对应ROM, PAGE 1对应RAM。
PAGE 里包含的区间名字与其后面的参数反映了该区间的起始地址和长度。
SECTIONS:(在程序里添加下面的段名,如.vectors。
用来指定该段名以下,另一个段名以上的程序(属于PAGE0)或数据(属于PAGE1)放到“>”符号后的空间名字所在的地方。
){.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 }{.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的“BuildOption........”菜单设置: .obj(链接的目标文件)、.lib(链接的库文件)、.map(生成的交叉索引文件)、.out(生成的可执行代码)。
DSP关于CMD文件报告姓名:班级:通信二班学号:一、简介:本报告基于“《DSP原理及应用》实验指导书”第29页的CMD文件,简要介绍其中涉及的CMD文件的知识、该CMD文件各个语句的含义,并给出了注释。
二、原理:1.链接命令文件以后缀.cmd结尾,简称CMD文件。
CMD文件的作用就像货物摆放记录一样,为程序代码和数据分配存储空间。
CMD文件的两大主要功能是通过MEMORY伪指令来指示存储空间和通过SECTION伪指令来分配段到存储空间。
其中PAGE0表示程序空间,PAGE1表示数据空间。
要读懂CMD文件要结合附录中的图1来看。
2.本程序中通过MEMORY伪指令分配了四个属性为只读的程序空间:PROG,BOOT,RESET,VECTORS;四个属性为既可读又可写的数据空间:M0RAM,M1RAM,L0L1RAM,H0RAM。
3..reset :> RESET, PAGE =0语句中,.reset是段名,“:>”是load,装载载的意思,RESET是空间名称,PAGE=0表示该空间是程序空间。
整句话的意思是将段.reset所对应的的程序装载到名为RESET的程序空间中。
SECTIONS中的语句都可套用这种格式理解。
三、CMD文件注释:-l rts2800_ml.lib-stack 400h-heap 400hMEMORY//MEMORY伪指令来指示存储空间{PAGE 0 : PROG(R) : origin = 0x3E8000, length = 0x10000/*空间名为PROG的只读程序空间,起始地址为0x3E8000,终止地址是0x3F8000,空间长度是0x10000,位于图1的片内flash处*/PAGE 0 : BOOT(R) : origin = 0x3FF000, length = 0xFC0 /*空间名为BOOT的只读程序空间,起始地址为0x3FF000,终止地址是0x3FFFC0,空间长度是0xFC0,位于图1的Boot Rom处*/PAGE 0 : RESET(R) : origin = 0x3FFFC0, length = 0x2 /*空间名为RESET的只读程序空间,起始地址为0x3FFFC0,终止地址是0x3FFFC2,空间长度是0x2,,位于图1的Boot Rom处*/PAGE 0 : VECTORS(R) : origin = 0x3FFFC2, length = 0x3E/*空间名为VECTORS的只读程序空间,起始地址为0x3FFFC2,终止地址是0x400000,空间长度是0x3E,位于图1的Boot Rom处*/PAGE 1 : M0RAM(RW) : origin = 0x000000, length = 0x400/*空间名为M0RAM的既可读又可写数据空间,起始地址为0x000000,终止地址是0x000400,空间长度是0x400,共1K,位于图1的M0 SRAM处*/PAGE 1 : M1RAM(RW) : origin = 0x000400, length = 0x400/*空间名为M1RAM的既可读又可写数据空间,起始地址为0x000400,终止地址是0x000800,空间长度是0x400,共1K,位于图1的M1 SRAM处*/PAGE 1 : L0L1RAM(RW) : origin = 0x008000, length = 0x2000/*空间名为L0L1RAM的既可读又可写数据空间,起始地址为0x008000,终止地址是0x00A000,空间长度是0x2000,共8K,位于图1的L0 SRAM和L1 SRAM处*/PAGE 1 : H0RAM(RW) : origin = 0x3F8000, length = 0x2000/*空间名为H0RAM的既可读又可写数据空间,起始地址为0x3F8000,终止地址是0x3FA000,空间长度是0x2000,共8K,位于图1的H0 SRAM处*/}SECTIONS//SECTIONS伪指令来将段分配到存储空间中去{/* 22-bit program sections */.reset : > RESET, PAGE = 0/*将复位指令存放于程序空间的RESET空间中*/vectors : > VECTORS, PAGE = 0/*将向量存放于程序空间的VECTORS空间中*/.pinit : > PROG, PAGE = 0 /*将生成的全局构造器(C++)程序列表存放于程序空间的PROG空间中*/.cinit : > PROG, PAGE = 0/*将对全局和静态变量初始化的常数存放于程序空间的PROG空间中*/.text : > PROG, PAGE = 0/*编译C语言中的语句时,生成的汇编指令存放于程序空间的PROG空间中*//* 16-Bit data sections */.const : > L0L1RAM, PAGE = 1/*将初始化和说明的字符串常量和静态变量(由const 声明)存放于数据空间的L0L1RAM数据空间中*/.bss : > L0L1RAM, PAGE = 1/*为全局变量和局部变量保留的空间,即在程序上电时,cinit空间中的数据复制出来并储存在L0L1RAM数据空间中*/.stack : > M1RAM, PAGE = 1/*为系统堆栈保留的空间,即当用到函数传递和局部变量时,数据会存放在M1RAM数据空间中*/.sysmem : > M0RAM, PAGE = 1 /*如果有宏函数,则与宏函数有关的动态数据会存放到M0RAM数据空间中*//* 32-bit data sections */.ebss : > H0RAM, PAGE = 1/*为使用大寄存器模式时的全局变量和静态变量预留的空间,即在程序上电时,.cinit空间中的数据会复制出来并存储在H0RAM数据空间中*/.econst : > H0RAM, PAGE = 1/*将初始化和说明的字符串常量和静态变量(由far const 声明)存放于数据空间的H0RAM数据空间中*/.esysmem : > H0RAM, PAGE = 1/*如果有far函数,则与far函数有关的动态数据会存放到H0RAM数据空间中*/}结束语:在初次接触CMD文件的时候,我感到很迷茫。
首先CCS是针对TI公司DSP芯片程序开发用的,DSP会涉及到很多存储器,而CMD 文件正是用于描述工程对DSp存储器的管理、分配和使用的情况(度娘中搜到的!)。
对于存储器,分为易失性存储器和非易失性存储器,当然易失性和读写速度是一对矛盾,然而对于不同场合我们选择不同的存储器,例如程序代码需要保存在非易失性存储器中,而易失性存储器需要放置一些正在运行的程序,因为运行的程序需要很快的读写速度。
然后我们所说的CMD文件就是围绕着这个问题展开的,CMD文件就是面向用户进行存储器控制的声明,好吧目前为止也只是抽象的。
这些声明有两方面的内容:
1、声明整个存储器资源
2、如何分配这些资源
Cmd文件是在编译源程序生成机器码的过程中产生作用的,其实就是告诉编译器,存储器这么些,就是这么分配的!
Cmd编写之资源清单
这是第一条内容的编写规则。
MEMORY是关键字,就像图书馆名字,PAGE n是图书的分类,习惯上PAGE 0为程序空间,PAGE 1为数据空间,接下来就是更小的分类,如历史类分为清史、汉室、近代史等等。
后面的org和length就是开始地址和长度了
Cmd编写之资源分配
DSP有程序空间存储和数据空间存储之分,首先以setion为开头,声明段的名字如,.boot .text .data并指向上述的xxx或者aaa。
DSP2812学习笔记-CMD⽂件编写⾸先我们要知道什么是CMD⽂件,它是⽤来⼲什么的,然后再来看看它有些什么,怎么去编写⼀个CMD⽂件。
CMD即command命令,命令⽂件指定存储区域的分配。
由于 DSP281X 系列的独特性(⽚内存在 SRAM 和 FLASH)所以必须创建⼀个⽤户链接命令⽂件,以便在运⾏程序时,每个块都能对号⼊座。
2812中CMD 采⽤的是分页制,其中PAGE0⽤于存放程序空间,⽽PAGE1⽤于存放数据空间。
我们结合SRAM.cmd(附件1)⽂件来介绍下CMD⽂件的编写。
CMD的伪指令:MEMORY 和 SECTIONS 是命令⽂件中最常⽤的两伪指令。
MEMORY伪指令⽤来表⽰实际存在⽬标系统中的可以使⽤的存储器范围,在这⾥每个存储器都有⾃⼰的名字,起始地址和长度。
SECTIONS伪指令是⽤来描述输⼊端是如何组合到输出端内的。
CMD ⽂件⾥有两个基本的段:初始化段和⾮初始化段。
初始化段包含代码和常数等必须在 DSP 上电之后有效的数。
故初始化块必须保存在如⽚内 FLASH 等⾮遗失性存储器中。
在SRAM.cmd⽂件中已初始化的段:.text,.cinit,.const,.econst,..pinit 和.switch..每个⼩段⾥⾯存储的量说明如下:.text:所有可以执⾏的代码和常量.cinit:全局变量和静态变量的 C 初始化记录.const:包含字符串常量和初始化的全局变量和静态变量(由 const)的初始化和说明.econst:包含字符串常量和初始化的全局变量和静态变量(由 far const)的初始化和说明.pinit:全局构造器( C++)程序列表.switch:包含转换语⽓声明的列表⾮初始化段中含有在程序运⾏过程中才像变量内写数据进去,所以⾮初始化段必须链接到易失性存储器中如 RAM。
⾮初始化的段:.bss,.ebss,.stack,.sysmem,和 esysmem.(更好的理解就是,这些段就是存储空间⽽已)每个⼩段⾥⾯存储的量说明如下:.bss: 为全局变量和局部变量保留的空间,在程序上电时,cinit 空间中的数据复制出来并存储在.bss 空间中。
DSP入门之--CM D文件配置详解1 C MD文件的分配方法TI公司新的汇编器和链接器创建的目标文件采用一种COFF(通用目标文件格式),该目标文件格式更利于模块化编程,为管理代码段和目标系统存储器提供了强有力和灵活的编程方法。
用户可以通过编写链接命令文件(.cmd文件)将链接信息放在一个文件中,以便在多次使用同样的链接信息时调用。
在命令文件中使用两个十分有用的伪指令ME MORY和SECTIONS,来指定实际应用中的存储器结构和进行地址的映射。
Memo ry用来指定目标存储器结构,Memo ry下可以通过PAGE选项配置地址空间,链接器把每一页都当作一个独立的存储空间。
通常情况下,PA GE0代表程序存储器用来存放程序,PA GE1代表数据存储器,用来存放数据。
由编译器生成的可重定位的代码和数据块叫做“SECTIONS”(段),SECTIONS用来控制段的构成与地址分配。
对于不同的系统配置,“SECTION”的分配方式也不相同,链接器通过“SECTIONS”来控制地址的分配,所以“SECTIONS”的分配就成了配置.cmd文件的重要环节。
以下是对“SE CTIONS”的定义及分配的详细介绍。
(1)被初始化的“SECTI ONS”(包括数据表和可执行代码).te xt它包括所有的可执行代码和常数,必须放在程序页;.cinit 它包括初始化的变量和常量表,要求放在程序页;.pinit它包括全局构造器(C++)初始化的变量和常量表,要求放在程序页;.const它包括字符串、声明、以及被明确初始化过的全局和静态变量,要求放在低地址的数据页;.econst它是在使用大存储器模式时使用的,包括字符串、声明、以及被明确初始化过的全局变量和静态变量,可以放在数据页的任何地方。
.switch它包括为转换声明设置的表格,可以放在程序页也可以放在低地址的数据页。
(2)未被初始化的“SECTIONS”(为程序运行中创建和存放的变量在存储器中保留空间).bss它为全局变量和静态变量保留空间。
DSP的.CMD文件配置2010-03-08 19:12DSP芯片以其极高的精度,性能及运算速度等无与伦比的优点使它得到了十分广泛的应用,TMS320F2812是TI公司生产的到目前为止用于数字控制领域的最好的DSP芯片,在对它的仿真开发过程中,编译器生成的代码和数据要由链接器分配到合适的存储空间,通常链接器的命令文件.cmd文件是由用户自己编写的,编写不当,就会使仿真开发不能进行,TI公司虽然在《TMS320C28x Optimizing C/C++ Compiler User’s Guide 6》和《TMS320C28x Assembly Language Tools User’s Guide 6》做了介绍,但内容却比较散乱而且要求读者对整个开发系统要有较全面的认识,这对于初学者来说是比较困难的。
下面以TMS320F2812芯片为例,结合具体的仿真调试实例加以说明使大家能够既快速又准确的掌握.cmd 文件的分配方法。
1存储空间的配置TMS320F2812的DSP存储器分为三个独立选择的空间-程序空间、数据空间和I/O 空间,其中程序存储器存放待执行的指令和执行中所用的系数(常数),可使用片内或片外的RAM、ROM或EPROM等来构成;数据存储器存放指令执行中产生的数据,可使用片内或片外的RAM和ROM来构成;I/O存储器存放与映象外围接口相关的数据,也可以作为附加的数据存储空间使用。
表1是TMS320F2812的存储空间分布。
2CMD文件的分配方法TI公司新的汇编器和链接器创建的目标文件采用一种COFF(通用目标文件格式),该目标文件格式更利于模块化编程,为管理代码段和目标系统存储器提供了强有力和灵活的编程方法。
用户可以通过编写链接命令文件(.cmd文件)将链接信息放在一个文件中,以便在多次使用同样的链接信息时调用。
在命令文件中使用两个十分有用的伪指令MEMORY和SECTIONS,来指定实际应用中的存储器结构和进行地址的映射。
DSP的CMD文件详解路帅,郭勇(中国航空工业集团公司西安航空计算技术研究所,陕西西安710065)摘要:随着微电子技术的不断发展,DSP芯片的性能价格比不断提高,可以预见DSP芯片将渗透到各个领域,得到更加广泛的应用。
在DSP应用开发中,开发人员容易对CMD文件理解不到位,CMD文件包含系统的存储器资源声明和资源分配情况声明两部分,文章对其写法和需要注意的地方进行了详细说明。
关键词:链接配置文件;存储器资源;用户声明资源中图分类号:TP311文献标识码:A文章编号:1673-1131(2019)01-0105-020引言数字信号处理器(Digital Signal Processor,DSP)以高速数字信号处理为目标进行芯片设计,采用改进的哈佛结构,内部具有硬件乘法器,应用流水线技术,具有良好的并行性和专门用于数字信号处理的指令等特点[1]。
DSP芯片以其强大的运算能力在通信、电子、图像处理等各个领域得到了广泛的应用[2]。
随着DSP系统的越来越复杂,在开发中我们往往要对CMD文件进行一些相应的改变,错误的配置会使最终应用开发出现意想不到的问题,本文就对CMD文件内容进行了介绍,并介绍了相应语法和一些需要注意的地方,值得开发人员借鉴。
1CMD文件整体介绍CMD文件是链接器配置文件(Linker Command File),后缀名是.cmd。
CMD主要作用是存放链接器的配置信息。
编写CMD文件就是开发物理存储器的管理、分配和使用情况。
CMD文件主要包含两方面的内容:(1)系统的存储器资源声明。
依次声明DSP芯片自带存储器、外扩的存储器空间。
(2)存储器资源分配情况声明。
以下以2812为例详细详解CMD文件,目的使大家可以读懂CMD,修改CMD并按照自己的想法进行设计。
2用户声明系统的存储器资源TI的DSP系列的CMD文件使用“MEMORY”关键词标识系统的存储器资源清单,紧随其后的大括号包含了具体的声明内容。
关于TMS320F28XX启动代码使用方法共18页链接WARNNING选项-w选项最好选上,有助于编译器在用户没有显式指定某一SECTION的链接方式时报warnning。
The -w option can be selected in Code Composer Studio on the Project → Build_Options menu, Linker tab, select the Advanced category, and then check the -w option box.内存大小端模式It is important that the large memory model be used with the C-compiler (as opposed to the small memory model). Small memory model requires certain initialized sections to be linked to non-volatile memory in the lower 64Kw of addressable space. However, no flash memory is present in this region on any current F28xx devices, and this will likely be true for future F28xx devices aswell. Therefore, large memory model should be used. In Code Composer Studio, the large memory model is on the Project → Build_Options menu. Select the Compiler tab, choose the Advanced category, and check the -ml option box. For non-DSP/BIOS projects, one should include the large memory model Ccompiler runtime support library, rts2800_ml.lib, into their code project (as opposed to rts2800.lib, which is for the small memory model). For DSP/BIOS projects, DSP/BIOS will take care of including the required library. The user should not include the rts2800_ml.lib (or rts2800.lib) library into a DSP/BIOS project.Non-DSP/BIOSProjects链接位置图表 1 LINKDSP/BIOS Projects链接位置图表 2 LINKTable 2 Notes:1.The .trcdata section must be copied by the user from its load address (specifiedon theLoad_Address tab) to its run address (specified on the BIOS_Data tab) at runtime. See Section4.3 for details on performing this copy.2.The PIEVECT RAM is a specific block of RAM associated with the PeripheralInterruptExpansion (PIE) peripheral. On current F28xx devices, the PIE RAM is a 256x16 block startingat address 0x000D00 in data space. For other devices, confirm the address in the devicedatasheet. The memory section manager in the DSP/BIOS configuration tool should alreadyhave a pre-defined memory named PIEVECT. The .hwi_vec section must be copied by the userfrom its load address (specified on the memory section manager Load_Address Tab) to its runaddress (specified on the memory section manager BIOS_Code Tab) at runtime. See Section4.2 for details on performing this copy.3.The specific flash memory selected as the load address for this section shouldbe the sameflash memory selected previously as the run address for the section (e.g., on the BIOS_Data,BIOS_Code, or Compiler_Sections tab).拷贝中断向量(non-DSP/BIOS only)调用InitPieVectTable函数完成中断向量拷贝,函数原型位于DSP280x_PieVect.c。
关于TMS320F28XX启动代码使用方法共18页链接WARNNING选项-w选项最好选上,有助于编译器在用户没有显式指定某一SECTION的链接方式时报warnning。
The -w option can be selected in Code Composer Studio on the Project → Build_Options menu, Linker tab, select the Advanced category, and then check the -w option box.内存大小端模式It is important that the large memory model be used with the C-compiler (as opposed to the small memory model). Small memory model requires certain initialized sections to be linked to non-volatile memory in the lower 64Kw of addressable space. However, no flash memory is present in this region on any current F28xx devices, and this will likely be true for future F28xx devices aswell. Therefore, large memory model should be used. In Code Composer Studio, the large memory model is on the Project → Build_Options menu. Select the Compiler tab, choose the Advanced category, and check the -ml option box. For non-DSP/BIOS projects, one should include the large memory model Ccompiler runtime support library, rts2800_ml.lib, into their code project (as opposed to rts2800.lib, which is for the small memory model). For DSP/BIOS projects, DSP/BIOS will take care of including the required library. The user should not include the rts2800_ml.lib (or rts2800.lib) library into a DSP/BIOS project.Non-DSP/BIOSProjects链接位置图表 1 LINKDSP/BIOS Projects链接位置图表 2 LINKTable 2 Notes:1.The .trcdata section must be copied by the user from its load address (specifiedon theLoad_Address tab) to its run address (specified on the BIOS_Data tab) at runtime. See Section4.3 for details on performing this copy.2.The PIEVECT RAM is a specific block of RAM associated with the PeripheralInterruptExpansion (PIE) peripheral. On current F28xx devices, the PIE RAM is a 256x16 block startingat address 0x000D00 in data space. For other devices, confirm the address in the devicedatasheet. The memory section manager in the DSP/BIOS configuration tool should alreadyhave a pre-defined memory named PIEVECT. The .hwi_vec section must be copied by the userfrom its load address (specified on the memory section manager Load_Address Tab) to its runaddress (specified on the memory section manager BIOS_Code Tab) at runtime. See Section4.2 for details on performing this copy.3.The specific flash memory selected as the load address for this section shouldbe the sameflash memory selected previously as the run address for the section (e.g., on the BIOS_Data,BIOS_Code, or Compiler_Sections tab).拷贝中断向量(non-DSP/BIOS only)调用InitPieVectTable函数完成中断向量拷贝,函数原型位于DSP280x_PieVect.c。
CMD文件的原理一、前言开发TI 公司的DSP 芯片,肯定要编写或者修改CMD 文件,这是在单片机开发中没有碰到过的新事物,也是学习DSP的难点。
面对里面种类繁多、名称各异、来历不明、作用不清、功能千差万别的存储器、区域和变量、寄存器,初学者往往都会一头雾水。
甚至很多人已经把项目成功地完成了,对CMD文件仍然是一知半解。
笔者也经历了极度困惑的过程,曾经大量地看书,下载资料,分析所能搜集到的CMD源文件。
可惜的是,无论是TI 公司的原始文档,还是网上的资料,或者BBS的帖子,都没有透彻地说明CMD 文件的原理和使用,只说―然‖ ,要靠自己去体会―所以然‖ ,去―悟‖ 。
终于有一天,我悟到了,也许只是―一些‖ 。
现在,我把自己的―一些‖写下来。
我将细致而通俗地说明CMD 文件的原理,给您―鱼‖ ,更给您―渔‖ ,一步步地引导象我当初一样的初学者。
我将以TI 的2407 为对象展开说明,对于TI 公司其他型号、其他系列的DSP,道理是完全相同的。
用时下学术界最最最流行的语式,叫做―基于2407‖——这个词起源于英文的―based on‖ ,或―something based‖ ,被我们大量地引用,以至于令人反胃了——我们美妙、绚烂的语言,现在只剩下―基于‖了。
笔者水平有限,但保证会用心去写,您会看到很多别处没有的思路和信息,相信会基本打通初学者的任督二脉。
本文适用于那些有单片机的开发基础、刚开始学习DSP 的初学者。
如果你还不知道程序空间,数据空间这些名词,可能就比较困难了。
二、CMD文件的起源在DSP系统中,存在大量的、各式各样的存储器,CMD文件所描述的,就是开发工程师对物理存储器的管理、分配和使用情况。
有必要先复习一下存储器的知识。
目前的物理存储器,种类繁多,原理、功能、参数、速度各不相同,有PROM、EPROM、EEPROM、FLASH、NAND FLASH、NOR FLASH等(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文档,找到memory map就会看到,芯片上集成了形形色色的存储器:FLASH、ROM、BROM、OTP ROM,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{PAGE 0:xxx : org = 0x1234 , length = 0x5678 /*This is my house.*/PAGE 1:aaa : org = 0x1357 , length = 0x2468 /*My home here.*/}其中,MEMORY,PAGE n,org,length,包括冒号、等于号、花括号,都是关键字符,必不可少。
PAGE n表示把可用的资源空间再划分成几个大块,最多允许分256块,从PAGE0到PAGE 255。
如果把MEMORY比作图书馆,PAGE n就是其中的―社科类‖ 、―工程类‖ 、―外文类‖等。
大家都习惯于把PAGE 0作为程序空间,把PAGE 1作为数据空间。
如果你很好奇,也可以试试别的数字。
凡智能芯片,都离不开这两种―空间‖ ,大名鼎鼎的冯·诺依曼结构和哈佛结构,都是建立在程序空间和数据空间两种结构的基础上,我们面对的DSP也是如此。
只要学习过单片机,就很容易理解。
如果你构思出第三种结构,恭喜您,您将与这二位齐名了。
CMD文件中还可以写上注释,用―/*‖和―*/‖包围起来,但不允许用―//‖ ,这一点和C语言不同。
上面的例子,仅仅就是个―例子‖ ,不针对任何特定的芯片。
带注释的语句有两行,每一行都是一项声明,表示在程序空间或数据空间下,再细分更小的块,好比是―社科类‖又分了几个书架。
比如xxx : org = 0x1234 , length = 0x5678表示在程序空间PAGE 0里面,划分出一个命名为xxx的小块空间,起始地址从存储单元0x1234 开始,总长度为0x5678 个存储单元,地址和长度通常都以十六进制数表示。
所以,xxx空间的实际地址范围从0x1234开始,到0x1234 + 0x5678 – 1 = 0x68AB 结束(起始地址加长度再减一),这一段连续的存储区域,就属于xxx小块了。
上面的例子中,PAGE 0 和PGAE 1各包含了只有一个―小块‖ ,用户可以根据自己的情况,按照同样的格式任意增加。
在支持多个CMD文件的开发环境里,某个或某几个CMD文件中,―小块‖的数量可以为0,也就是说,关键字PAGE 0或PAGE 1下面,可以是空白的。
但不允许所有的CMD 文件的同一空间都是空白。
另外,没有资料提到过―小块‖数量上限的限制,需要去查阅文档或咨询TI 公司。
很多关键字,还允许有别的写法,比如―org‖可以写为―o‖ ,―length‖可以写为―len‖ 。
这些规定和其他细节,可以去查阅TI 的pdf 文档,一般叫做―xxxxx AssemblyLanguage Tools User's Guide.pdf‖ ,汇编语言工具指南,xxxxx是芯片的型号或系列。
但这个文档不适合初学者。
实践证明,至少对于C2000 系列的2407 和2812 而言,存储单元的单位是―字word‖ ,即16bit。
但TI 的文档却说是―字节byte‖ ,应当是TI 写错了。