DSP的CMD文件详解(整理版)
- 格式:doc
- 大小:42.00 KB
- 文档页数:18
一、有关段(sections)的知识汇编器和链接器产生的可被DSP装置执行的目标程序,这些目标文件格式被称为通用目标文件格式(COFF)。
COFF使得模块化编程更容易,它鼓励用户在写汇编语言程序时根据代码块和数据块的方式来思考如何编写程序,这些“模块(block)”就是“段(sections)”。
目标文件的最小单位称为段,段是占据一个连续空间的代码块或数据块,与其他段一起在存储器映射图内。
目标文件的各个段是分开的,有特色的。
一个COFF目标文件总是包含3个默认段:(1).text段,通常包含可执行代码;(2).data段,通常含有初始化数据;(3).bss段,通常为未初始化变量预留的空间。
自定义的段:(1)由汇编伪指令.sect创建的段(2)由汇编伪指令.usect创建的段其中,.text、.data、由.sect创建的段属于初始化段(含有数据和代码);.bss、由.usect创建的段属于未初始化段(为未初始化的数据在存储器映像图内预留空间)。
注:不能用不同的伪指令定义相同的段。
二、由汇编器产生的COFF格式的OBJ文件中的段作为构造块,当有多个文件进行链接时,链接器会将输入段结合在一起产生可执行的COFF输出模块,然后链接器为各输出段选择存储器地址,这就是CMD文件。
CMD文件是用来分配ROM和RAM的,告诉链接程序怎么计算地址和分配空间。
它包括三个部分:(1)输入、输出定义:.obj文件——链接器要链接的目标文件;.lib文件——链接器要链接的库文件;.map文件——链接器生成的交叉索引文件;.out文件——链接器生成的可执行代码。
这部分可通过CCS中的Build Option菜单进行设置。
(2)MEMORY命令:描述系统实际的硬件资源,即指定芯片的ROM和RAM的大小和并划分出的几个区间。
默认的,PAGE0对应ROM(程序存储区),PAGE1对应RAM(数据存储区),例定义一个VECS存储区域,具有R和W属性,填充常数ffffh:MEMORY{PAGE 0:VECS(RW):origin=0000h,length=00ffh,f=ffffh;}注:1)PAGE就是对一个存储空间进行标记,最多可以有255个PAGE,每个PAGE代表一个完全独立的地址空间,不同的PAGE上的存储器区间可以取相同的名字;2)Attr:可选项,规定存储器属性:①R,可以对存储器执行读操作;②W,可以对存储器执行写操作;③X,命名的存储器能包含可执行的代码;④I,可以对存储器进行初始化;3)origin:起始地址,可写成org或o;length:长度,可写成len或l。
CCS中CMD文件的作用cmd 文件用于DSP 代码的定位。
由于DSP 的编译器的编译结果是未定位的,DSP没有操作系统来定位执行代码,每个客户设计的DSP 系统的配置也不尽相同,因此需要用户自己定义代码的安装位置。
安装位置是指,编译完成的代码是存放在dsp的那个位置,程序空间RAM或者数据空间RAM,起始地址以及长度。
以C5000 为例,基本格式为:-o sample.out //生成.OUT文件-m sample.map //生成MAP文件,MAP文件中包含程序的section信息,用于自举表信息的编写和烧写flash-stack 100 //开辟堆栈sample.obj meminit.obj-l rts.lib //链接rts.lib库MEMORY{PAGE 0: VECT: origin = 0xff80, length 0x80 //page0一般是程序空间,PAGE 0: PROG: origin = 0x2000, length 0x400PAGE 1: DATA: origin = 0x800, length 0x400 //page1一般是数据空间}SECTIONS{.vectors : {} >VECTPAGE 0 //.vectors段是中断向量表,存放在程序空间VECT部分//.text : {} >PROG PAGE 0 // .text 是程序段,放在程序空间PROG部分.data : {} >PROG PAGE 0 //.data是数据段,放在程序空间PROG部分,紧接.text 之后.cinit : {} >PROG PAGE 0 //.cinit 段包含了变量初始化记录.bss : {} >DATA PAGE 1 //.bss段是未初始化段,放在数据空间DATA部分}连接器会自动创建以下的段:The C54x compiler creates the following sections:初始化段包含数据和可执行代码。
最近有很多新手问关于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对应ramPAGE 里包含的区间名字与其后面的参数反映了该区间的起始地址和长度.SECTIONS:(在程序里添加下面的段名如.vectors.用来指定该段名以下,另一个段名以上的程序(属于PAGE0)或数据(属于PAGE1)放到“>”符号后的空间名字所在的地方。
SECTIONS{.vectors : { } > VECS PAGE 0 /* Interrupt vector table */.reset : { } > VECS PAGE 0 /* Reset code */..................................}eg:MEMORY{PAGE 0: VECS: origin = 00000h, length = 00040hLOW: origin = 00040h, length = 03FC0hSARAM: origin = 04000h, length = 00800hB0: origin = 0FF00h, length = 00100hPAGE 1: B0: origin = 00200h, length = 00100hB1: origin = 00300h, length = 00100hB2: origin = 00060h, length = 00020hSARAM: 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}最近在搞CMD看到你的帖子.不由有些感想我想这些东西不是你写的吧.是从那里摘抄的吧希望你的就自己做的东西.把CMD这部分好好写写.不要这样写我想.你既然知道CMD.想必水平也不是很低.但是看到你写的东西真的不是很...做为一个斑竹.或是一个爱好者最少要写一个有自己见解的东西我最近也在学习DSP.所以对CMD这部分比较感兴趣.这是我的问题.希望大家能看看.如果我解决了。
CMD 命令文件解析CMD 文件的专业名称叫做链接器配置文件,用以存放链接器的配置信息,简称命令文件。
其中比较关键的就是MEMORY、SECTIONS两个伪指令的使用。
MEMORY和SECTIONS 的相关语句必须使用大写字符。
MEMORY是用以配置目标存储器的,而SECTIONS是用以指定段的存放位置的。
1 存储空间的配置DSP存储器分为三个独立选择的空间:程序空间、数据空间和I/O空间,其中程序存储器存放待执行的指令和执行中所用的系数(常数),可使用片内或片外的RAM、ROM、EPROM 等构成;数据存储器存放指令执行中产生的数据,可使用片内或片外的RAM和ROM来构成。
I/O存储器存放与映像外围接口相关的数据,也可以作为附加的数据存储空间来使用。
下表是TMS320F28335的存储空间分布:TMS320F28335的存储空间分布:2 BootRomBootRom 是位于存储器地址0x3F E000 ~ 0x3F FFFF处的8K * 16位存储区域。
并利用M0区域的0x0002 ~ 0x004E作为其Boot程序的堆栈和ebss区。
其内存映射如下:3 Cmd 文件的分配方法TI公司新的汇编器和链接器创建的目标文件采用一种COFF(通用目标文件格式),该目标文件格式更利于模块化编程,为管理代码段和目标系统存储器提供了强有力和灵活的编程方法。
用户可以通过编写链接命令文件(cmd文件)将链接信息放在一个文件中,以便在多次使用同样的链接信息时调用。
在命令文件中使用两个十分有用的伪指令MEMORY 和SECTIONS,来指定实际应用中的存储器结构和进行地址的映射。
M EMORY用来指定目标存储器结构,MEMORY下可以通过PAGE选项配置地址空间。
链接器把每一页都当作一个独立的存储空间,通常情况下,PAGE0 代表程序存储器用来存放程序,PAGE1 代表数据存储器,用来存放数据。
由编译器生成的可重定位的代码和数据块叫做“SECTIONS”(段),SECTIONS 用来控制段的构成与地址分配。
DSP2812的标准CMD文件MEMORY{PAGE0:/*Program Memory*/ZONE0:origin=0x002000,length=0x002000/*XINTF zone0*/ZONE1:origin=0x004000,length=0x002000/*XINTF zone1*/RAML0:origin=0x008000,length=0x001000/*on-chip RAM block L0*/ZONE2:origin=0x080000,length=0x080000/*XINTF zone2*/ZONE6:origin=0x100000,length=0x080000/*XINTF zone6*/OTP:origin=0x3D7800,length=0x000800/*on-chip OTP*/FLASHJ:origin=0x3D8000,length=0x002000/*on-chip FLASH*/FLASHI:origin=0x3DA000,length=0x002000/*on-chip FLASH*/FLASHH:origin=0x3DC000,length=0x004000/*on-chip FLASH*/FLASHG:origin=0x3E0000,length=0x004000/*on-chip FLASH*/FLASHF:origin=0x3E4000,length=0x004000/*on-chip FLASH*/FLASHE:origin=0x3E8000,length=0x004000/*on-chip FLASH*/FLASHD:origin=0x3EC000,length=0x004000/*on-chip FLASH*/FLASHC:origin=0x3F0000,length=0x004000/*on-chip FLASH*/FLASHA:origin=0x3F6000,length=0x002000/*on-chip FLASH*/BEGIN:origin=0x3F8000,length=0x000002/*Part of ed for"boot to H0"bootloader mode.*/PRAMH0:origin=0x3F8002,length=0x001FFE/*0xFF E/*portion of H0we've mapped to PAGE0*//*ZONE7:origin=0x3FC000,length=0x003FC0/ *XINTF zone7available if MP/MCn=1*/ROM:origin=0x3FF000,length=0x000FC0/*boot ROM available if MP/MCn=0*/RESET:origin=0x3FFFC0,length=0x000002/*part of boot ROM(MP/MCn=0)or XINTF zone7(MP/MCn=1)* /VECTORS:origin=0x3FFFC2,length=0x00003E/ *part of boot ROM(MP/MCn=0)or XINTF zone7(MP/MCn=1)*/PAGE1:/*Data Memory*/RAMM0:origin=0x000000,length=0x000400/*on-chip RAM block M0*/RAMM1:origin=0x000400,length=0x000400/*on-chip RAM block M1*/DEV_EMU:origin=0x000880,length=0x000180/ *device emulation registers*/FLASH_REGS:origin=0x000A80,length=0x000060/*F LASH registers*/CSM:origin=0x000AE0,length=0x000010/*code security module registers*/XINTF:origin=0x000B20,length=0x000020/*external interface registers*/CPU_TIMER0:origin=0x000C00,length=0x000008/*C PU Timer0registers(CPU Timer1and Timer2are reserved for BIOS)*/ PIE_CTRL:origin=0x000CE0,length=0x000020/* PIE control registers*/PIE_VECT:origin=0x000D00,length=0x000100/* PIE vector table*/ECAN_A:origin=0x006000,length=0x000100/*eCAN registers*/ECAN_AMBOX:origin=0x006100,length=0x000100/*e CAN mailboxes*/SYSTEM:origin=0x007010,length=0x000020/*System control registers*/SPI_A:origin=0x007040,length=0x000010/*SPI registers*/SCI_A:origin=0x007050,length=0x000010/*SCI-A registers*/XINTRUPT:origin=0x007070,length=0x000010/* external interrupt registers*/GPIOMUX:origin=0x0070C0,length=0x000020/ *GPIO mux registers*/GPIODAT:origin=0x0070E0,length=0x000020/ *GPIO data registers*/ADC:origin=0x007100,length=0x000020/*ADC registers*/EV_A:origin=0x007400,length=0x000040/*Event Manager A registers*/EV_B:origin=0x007500,length=0x000040/*Event Manager B registers*/SCI_B:origin=0x007750,length=0x000010/*SCI-B registers*/MCBSP_A:origin=0x007800,length=0x000040/ *McBSP registers*/RAML1:origin=0x009000,length=0x001000/*on-chip RAM block L1*/FLASHB:origin=0x3F4000,length=0x002000/*on-chip FLASH*/CSM_PWL:origin=0x3F7FF8,length=0x000008/ *CSM password locations in FLASHA*/DRAMH0:origin=0x3f9000,length=0x001000/*portion of H0we've mapped to PAGE1*/}SECTIONS{/***Compiler Required Sections***/.text:>PRAMH0,PAGE=0.cinit:>PRAMH0,PAGE=0.stack:>RAMM1,PAGE=1.bss:>RAMM0,PAGE=1.ebss:>RAMM0,PAGE=1.const:>RAMM0,PAGE=1.econst:>RAMM0,PAGE=1.sysmem:>RAMM1,PAGE=1.reset:>RESET,PAGE=0,TY PE=DSECT/*we are not using the.reset section*//***User Defined Sections***/codestart:>BEGIN,PAGE=0/*Used by file DSP28_CodeStartBranch. asm*//***Peripheral Frame0Register Structures***/DevEmuRegsFile:>DEV_EMU,PAGE=1FlashRegsFile:>FLASH_REGS,PAGE=1CsmRegsFile:>CSM,PAGE=1XintfRegsFile:>XINTF,PAGE=1CpuTimer0RegsFile:>CPU_TIMER0,PAGE=1PieCtrlRegsFile:>PIE_CTRL,PAGE=1PieVectTable:>PIE_VECT,PAGE=1/***Peripheral Frame1Register Structures***/SysCtrlRegsFile:>SYSTEM,PAGE=1SpiaRegsFile:>SPI_A,PAGE=1SciaRegsFile:>SCI_A,PAGE=1XIntruptRegsFile:>XINTRUPT,PAGE=1GpioMuxRegsFile:>GPIOMUX,PAGE=1GpioDataRegsFile:>GPIODAT PAGE=1AdcRegsFile:>ADC,PAGE=1 EvaRegsFile:>EV_A,PAGE=1 EvbRegsFile:>EV_B,PAGE=1 ScibRegsFile:>SCI_B,PAGE=1McbspaRegsFile:>MCBSP_A,PAGE=1/***Peripheral Frame2Register Structures***/ECanaRegsFile:>ECAN_A,PAGE=1ECanaMboxesFile:>ECAN_AMBOX PAGE=1/***Code Security Password Locations***/CsmPwlFile:>CSM_PWL,PAGE=1}。
[原]TMS320F28335项目开发记录6_28335之cmd文件详解2014-11-3阅读970 评论01.CMD文件的作用CMD文件的作用就像仓库的货物摆放记录一样,为程序代码和数据分配指定的空间。
2.C语言生成的段C语言生成的段大致分为两大类:初始化和未初始化,已初始化的段含有真正的指令和数据,未初始化段只是保留变量的地址空间。
已初始化段通常放在程序空间,未初始化段通常放在数据空间。
已初始化段:.text——C语言编译生成的汇编指令代码存放于此.cinit——存放初始化的全局和静态变量.const——字符串常量和const定义的全局和静态变量.econst——字符串常量和far const定义的全局和静态变量.print——全局构造器(C++)程序列表.switch——存放switch语句产生的常数表格以.const段为例:const int a = 10; //注意必须是全局的如果声明为局部const初始化变量,不会放在.const段,局部变量都是运行时放在.bss段中char * p = "ABC";数组和结构体的初始值——是局部变量时,产生的是.const,如果是全局变量,产生的是.cinit未初始化段:.bss——为全局变量和局部变量保留的空间,程序上电时,.cinit空间中的数据复制出来并存放在.bss空间中.ebss——为使用大寄存器模式时预留的全局和局部变量空间,程序上电时,.cinit空间中的数据复制出来并存放在.bss空间中.stack——堆栈空间,主要用于函数传递变量或为局部变量分配空间.system——为动态存储分配保留的空间(malloc),如果有宏函数,此空间被占用.esystem——为动态存储分配保留的空间(far malloc),如果有far函数,此空间会被占用3.自定义段上面的都是官方预先定义好的,我们可以定义自己的段么?可以,使用如下语句:#pragma CODE_SECTION(symbol, "section name");#pragma DATA_SECTION(symbol, "section name");symbol——符号,可以是函数名/变量名section name——自定义的段名CODE_SECTION用来定义代码段DATA_SECTION用来定义数据段注意:不能再函数体内声明#pragma;必须在符号被定义和使用之前声明#pragma例子:#pragma DATA_SECTION(data, "data_name");char data[100];4.CMD文件在DSP28335工程文件里(不用BIOS产生CMD文件),手写CMD文件一般有两个,RAM里调试时用的两个CMD文件分别为DSP2833x_Headers_nonBIOS.cmd 和28335_RAM_lnk.cmd,烧写到flash里时用的两个CMD文件分别为DSP2833x_Headers_nonBIOS.cmd和F28335.cmd,其中DSP2833x_Headers_nonBIOS.cmd文件可以在所有工程文件中通用,主要作用是把外设寄存器产生的数据段映射到对应的存储空间,可以跟DSP2833x_GlobalVariableDefs.c文件对照一下看看。
CMD文件的原理玄德(网名)于2009年3月一、前言开发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 类)。
28335的cmd文件编写流程1.引言在使用28335芯片进行开发时,编写cm d文件是非常重要的一步。
c m d文件主要用于在芯片上运行指令,对芯片进行初始化、配置以及与外部环境的交互等操作。
本文将介绍28335的cm d文件编写流程,帮助读者快速上手。
2. cm d文件基本结构一个典型的28335的c md文件由以下几个部分组成:引用头文件-:在编写c md文件的开头部分,需要引用头文件来定义28335芯片的相关寄存器和功能。
常见的头文件有`D SP2833x_De vi ce.h`,它包含了芯片的所有寄存器的地址和配置信息。
宏定义-:在编写cm d文件时,通常会定义一些常量和宏来简化代码编写和调试过程。
在这一部分,你可以定义G PI O口的引脚号、定时器配置、外设模块的配置等。
配置初始化-:接下来是对芯片进行初始化和配置的部分。
你可以设置芯片的时钟、GP IO口的方向和初始化状态、中断和D MA的配置等。
主程序-:在主程序中,你可以编写具体的指令来实现芯片需要执行的功能。
这里可以包括G PI O口的控制、定时器的操作、A DC的采样和计算等。
3.编写流程下面是一般的28335的cm d文件编写流程:1.创建一个新的cm d文件,并引用头文件`DS P2833x_D ev ic e.h`。
2.在文件的开头部分,通过`#de fi ne`指令定义需要使用的寄存器地址和相应的宏。
3.在`ma in`函数中,进行芯片的初始化和配置。
4.根据需求,编写各种功能函数,并在主程序中调用。
5.在主程序中,编写具体的指令来实现芯片需要的功能。
6.在`ma in`函数的末尾,添加死循环`f o r(;;)`,保证程序的持续运行。
4.示例下面是一个简单的示例,展示了如何编写一个闪烁L ED灯的c md文件:#i nc lu de"D SP2833x_De vi ce.h"#d ef in eL ED_G PI OGP I O0//定义LE D控制的GP IO口#d ef in eL ED_P IN0//定义L ED控制的引脚号v o id LE D_In it(){G p io Ct rl Re gs.G PAM U X1.b it.G PI O0=0;//将GP IO0设置为通用G P IO口G p io Ct rl Re gs.G PAD I R.bi t.GP IO0=1;//将G PI O0设置为输出模式}v o id LE D_On(){G p io Da ta Re gs.G PAS E T.bi t.GP IO0=1;//将G PI O0引脚置1,点亮L E D灯}v o id LE D_Of f(){G p io Da ta Re gs.G PAC L EA R.bi t.GP IO0=1;//将G PI O0引脚置0,熄灭L ED灯}v o id De la y(ui nt32_t de la y){w h il e(de la y--){}//程序延时函数,延时一定时间}i n tm ai n(vo id){//初始化系统和GP IOI n it Sy sC tr l();L E D_In it();f o r(;;){L E D_On();//点亮LE D灯D e la y(1000);//延时1秒钟L E D_Of f();//熄灭L E D灯D e la y(1000);//延时1秒钟}}上述示例中,我们通过`LE D_In it()`函数对LE D的GP I O口进行初始化设置,然后在主程序中反复调用`L ED_O n()`和`L ED_O ff()`函数,实现了LE D灯的闪烁效果。
关于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文件和Gel文件的编写一、实验目的1. 掌握Gel文件的编写,2. 熟悉Code Composer Studio的使用二、实验设备1. 集成开发环境CCS2. 实验代码ccs_gel.s54、ccs_gel.cmd和ccs_gel.gel三、实验内容1. 建立项目并添加相应文件,连接编译(步骤同实验二一样),双击打开CMD文件,对照教材理解CMD文件的编写结构,改变其中的内容,增加自定义段,保存并重新编译,比对前后两次编译得到的Map文件的异同。
图1、Cmd文件编译前map文件图2、修改cmd文件后的map文件从上两图可知,配置文件Cmd内容的不同,map文件也有所不同。
2. 了解GEL文件的功能。
Gel文件不是DSP开发必须的文件,而是给CCS使用的文件,它帮助设置CCS的仿真环境,而且可以完成一些常用的调试操作,如硬件设置等。
Gel文件的编写是采用类似C语言的编程语言,观察当前的Gel文件的编写。
GEL文件部分内容3. 使用者如果希望修改其功能,可以直接编写gel文件,保存并重新装载。
Menuitem是一级子菜单,hotmenu是二级子菜单,其中的处理可以直接填写或调用其他的函数。
修改Gel文件,添加menuitem和hotmenu。
menuitem "C54x Experiment";hotmenu C5402_Textout(){GEL_TextOut(“Hello,GEL is a solid tool !\n”);}hotmenu C5402_DSK_Test() /*此功能实现需要用到DSK板,可暂不添加,如做测试,需将此中文注释去掉*/{*(int *)0x0@io = 0xff07; /* turn on LED */}测试其功能。
4. 查询help了解所有Gel的函数功能,并修改文件实现一个其它的Gel函数。
四、实验结果和提示1. 当设备被选用后,与其关联的gel文件将被使用,其中的StartUp函数将被调用。
目录TMS320F2812引脚详细分析 (1)HELLO一:如何开始DSP的学习 (9)HELLO二:完整工程的构成 (11)HELLO三:CCS的操作 (15)HELLO四(一):2812片内资源 (25)HELLO四(二):2812存储器映射及CMD (29)HELLO五(一):2812中断系统概述 (37)HELLO五(二):2812中断系统程序 (42)HELLO六:2812的时钟系统 (46)HELLO七:2812的IO口控制--LED点亮程序 (51)HELLO八(一) 2812EV模块---通用定时器 (52)2812---通用定时器1初始化程序(启动ADC) (59)HELLO八(二) 2812EV模块---PWM (62)DSP---PWM波形源码 (68)HELLO九:2812--SCI模块 (74)SCI查询方式 (83)TMS320F2812引脚详细分析推荐XINTF信号XA[0]~XA[18] --- 19位地址总线XD[0]~XD[15] --- 16位数据总线XMP/MC` --- 1 -- 微处理器模式 --- XINCNF7有效0 -- 微计算机模式 --- XINCNF7无效XHOLD` --- 外部DMA保持请求信号。
XHOLD为低电平时请求XINTF释放外部总线,并把所有的总线与选通端置为高阻态。
当对总线的操作完成且没有即将对XINTF进行访问时,XINTF释放总线。
此信号是异步输入并与XT IMCLK同步XHOLDA` --- 外部DMA保持确认信号。
当XINTF响应XHOLD的请求时XHOLDA呈低电平,所有的XINTF总线和选通端呈高阻态。
XHOLD和XHOLDA信号同时发出。
当XHOLDA有效(低)时外部器件只能使用外部总线XZCS0AND1` --- XINTF区域O和区域1的片选,当访XINTF区域0或1时有效(低)XZCS2` --- XINTF区域2的片选,当访XINTF区域2时有效(低)XZCS6AND7` --- XINTF区域6和区域7的片选,当访XINTF区域6或7时有效(低)XWE` --- 写有效。
DSP指令大全(最全)附录6 TMS320C54x 指令系统一览表(按指令功能排列) 一、算术运算指令二、逻辑运算指令三、程序控制指令6.注:?条件―真‖,§条件―假‖,※延迟指令。
四、加载和存储指令4.6.7.五.伪指令2.初始化常数(数据和存储器)的伪指令3.调整段程序计数器伪指令(SPC).align 把SPC调整到页边界.even 把SPC调整到偶数字边界4.控制输出列表格式化伪指令5.条件汇编伪指令.break [well-defined expression] 如果条件真结束.loop汇编,.break结构是可选项.else 如果.if条件为假,汇编代码块.else结构是可选项.elseif well-defined expression——如果if条件为假且.elseif 条件为真,汇编代码块.else结构是可选项.endif 结束.if代码块.endloop 结束.1oop代码块.if well-defined expression 如果条件为真则汇编代码块.loop [well-defined expression] 开始代码块的重复汇编6. 汇编符号.asg [”] character string [”],substitution symbol——把字符串赋予替代的符号..endstruct 结束结构定义.equ 使值和符号相等.eval well-defined expression,substitution symbol 根据数字替代符号完成运算.newblock 取消局部标号.set 使数值和符号相等.struct 开始结构定义.tag 把结构属性赋予标号7.宏指令宏定义:Macname .macro[参数1],[…],[参数n]宏调用:[标号][:] macname [参数1],[…],[参数n]8.编译软件指令①汇编器:asm500.exeasm500[input file[object file [listing file] [-options]]-c—使汇编语言文件中大小没有区别。
实验三:汇编语言程序和 CMD(链接控制)文件认识一、实验目的:(1)学习用汇编语言编制程序。
(2)了解汇编语言程序下CCS使用它们时在设置上与C语言程序时的区别。
(3)学习编制命令文件控制代码的连接。
(4)学会建立和改变map文件,以及利用它观察DSP内存使用情况的方法。
(5)熟悉使用软件仿真方式调试程序。
二、实验仪器:安装 CCS3.1(CodeComposerStudioV3.1)的 PC 机。
三、实验内容:编译和修改源文件或命令文件,查看它们之间的联系。
四、实验步骤:(一).汇编语言程序连接器的设置1. 建立Lab02-UseCMD文件夹,设置保存路径在D:\中。
复制UseCMD.asm 和UseCMD.cmd到该文件夹中。
2. 启动CCS3.1并设置好仿真模式,按第1步的路径新建工程,并将这两个文件添加到工程中。
编译工程3.进入Build设置界面,点击Links,进入连接参数设置,Autoinit Mode下拉选择框中选择No Autoinitialization (非自动初始化)选项,在Code Entry Point (-e)框中填入汇编语言程序指定的入口点标号start。
设置完后的截图如下:(二).命令文件1.实验步骤如实验指导书。
2.运行结果如下:3.观察map文件如下:4.观察cmd文件如下:5.修改内存分配:修改 cmd 文件中的PRAM : o=100h,l=1f00h 改为 PRAM : o=200h,l=1e00h 重新编译工程,观察 map 文件中有何变化如下:五、实验心得:通过实验可以发现,修改 cmd 文件可以安排程序和数据在 DSP 内存资源中的分配和位置;map 文件中描述了程序和数据所占用的实际尺寸和地址。
实验程序中计算变量的取值之和,由于取值较小,所以结果仍为 16 位数,程序中仅考虑保存acc 的低 16位作为结果。
但如果计算中有进位等问题就需要考虑保存acc 的高16 位结果了。
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(生成的可执行代码)。
②MEMORY命令:描述系统实际的硬件资源③SECTION命令:描述“段”如何定位例子:.cmd文件-c-o-m-stack 100-lMEMORY{PAGE 0: VECT:origin=0x8000,length 0x040PAGE 0: PROG:origin=0x8040,length 0x6000PAGE 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环境的命令文件来做一下说明:ext: {所有.text输入段名} load=加载地址 run =运行地址.data: {所有.data输入段名} load=加载地址 run =运行地址.bss: {所有.bss输入段名} load=加载地址 run =运行地址.other: {所有.other输入段名} load=加载地址 run =运行地址}SECTIONS必须用大写字母,其后的大括号里是输出段的说明性语句,每一个输出段的说明都是从段名开始,段名之后是如何对输入段进行组织和给段分配存储器的参数说明:以.text段的属性语句为例,“{所有.text输入段名}”这段内容用来说明连接器输出段的.text段由哪些子目标文件的段组成,举例如下SECTIONS{.text:{ (.text) file2(.text) file3(.text,cinit)}略}指明输出段.text要链接的.text和 file2的.text 还有file3的.text和.cinit。
在CCS的SECTIONS里通常只写一个中间没有内容的“{ }”就表示所有的目标文件的相应段。
接下来说明“load=加载地址 run =运行地址”链接器为每个输出段都在目标存储器里分配两个地址:一个是加载地址,一个是运行地址。
通常情况下两个地址是相同的,可以认为输出段只有一个地址,这时就可以不加“run =运行地址”这条语句了;但有时需要将两个地址分开,比如将程序加载到FLASH,然后放到RAM中高速运行,这就用到了运行地址和加载地址的分别配置了,如下例所示:.const :{略} load = PROG run = 0x0800,常量加载在程序存储区,配置为在RAM里调用。
“load=加载地址”的几种写法需要说明一下,首先“load”关键字可以省略,“=”可以写成“>”, “加载地址”可以是:地址值、存储区间的名字、PAGE关键词等,所以大家见到“.text:{ } > 0x0080”这样的语句可千万不要奇怪。
“run =运行地址”中的“ = ”可以用“>”,其它的简化写法就没有了。
大家不要乱用。
4 、CCS中的案例在CCS中的命令文件好像简化了不少,少了很多东西,语句也精简了好多,首先不用指定输入链接器的目标文件,CCS会自动默认处理,其次链接器的配置命令也和DOS的环境不同,需要了解的请找TI文档吧!下面是刘和平书中的例子,大家来看看是不是可以很精确的理解了呢!-stack 40MEMORY{PAGE 0 : VECS : origin = 0h , length = 40hPVECS : origin = 40h , length = 70h PROG : origin = 0b0h , length = 7F50h PAGE 1 : MMRS : origin = 0h , length = 05Fh B2 : origin = 0060h , length = 020h B0 : origin = 0200h , length = 100h B1 : origin = 0300h , length = 100h SARAM : origin = 0800h , length = 0800hEXT : origin = 8000h , length = 8000h}SECTIONS{.reset : { } > VECS PAGE 0.vectors : { } > VECS PAGE 0.pvecs : { } > PVECS PAGE 0.text : { } > PROG PAGE 0.cinit : { } > PROG PAGE 0.bss : { } > SARAM PAGE 1.const : { } > SARAM PAGE 1.stack : { } > B1 PAGE 1}第二章 CMD文件的编写1、 COFF格式1> 通用目标文件格式(Common Object File Format)是一种流行的二进制可执行文件格式,二进制可执行文件包括库文件(lib),目标文件(obj)最终可执行文件(out)。
,现今PC机上的Windows95和以后的操作系统的二进制文件格式(PE)就是在COFF格式基础上的进一步扩充。
2> COFF格式:详细的COFF文件格式包括段头,可执行代码和初始化数据,可重定位信息,行号入口,符号表,字符串表等,这些属于编写操作系统和编译器人员关心范畴。
而对于C只需要了解定义段和给段分配空间就可以了。
3> 采用COFF更有利于模块化编程,程序员可以自由决定愿意把哪些代码归属到哪些段,然后加以不同的处理。
2、Section目标文件中最小单位称为块。
一个块就是最终在存储器映象中占据连续空间的一段代码或数据。
1> COFF目标文件包含三个默认的块:.text可执行代码.data已初始化数据.bss为未初始化数据保留的空间2> 汇编器对块的处理未初始化块:.bss 变量存放空间.usect 用户自定义的未初始化段初始化块:.text 汇编指令代码.data 常数数据(比如对变量的初始化数据).sect 用户自定义的已初始化段.asect 通.sect,多了绝对地址定位功能,一般不用3>C语言的段未初始化块(data):.bss 存放全局和静态变量.ebss 长调用的.bss(超过了64K地址限制).stack 存放C语言的栈.sysmem 存放C语言的堆.esysmem 长调用的.sysmem(超过了64K地址限制)初始化块:.text 可执行代码和常数(program).switch switch语句产生的常数表格(program/低64K数据空间).pinit Tables for global constructors (C++)(program).cinit 用来存放对全局和静态变量的初始化常数值(program).const 全局和静态的const变量初始化值和字符串常数,(data).econst 长.const(可定位到任何地方)(data)3> 自定义段(C语言)#pragma DATA_SECTION(函数名或全局变量名,"用户自定义在数据空间的段名");#pragma CODE_SECTION(函数名或全局变量名,"用户自定义在程序空间的段名"),不能在函数体内声明,必须在定义和使用前声明,#pragma可以阻止对未调用的函数的优化3、连接命令文件(CMD)1> MEMORY指定存储空间MEMORY{PAGE 0:name 0 [attr] : origin = constant, length = constant PAGE n:name n [attr] : origin = constant, length = constant }PAGE n:标示存储空间,n SECTIONS分配段SECTIONS{name : [property,property,……]}name:输出段的名称property:输出段的属性:load=allocation(强制地址或存储空间名称)同>allocation:定义输出段将会被装载到哪里。