F2812的CMD文件的编写--经验总结

CMD文件里包含三部分内容:

1)输入/输出定义:

.obj文件:链接器要链接的目标文件;

.lib文件:链接器要链接的库文件;

.map文件:链接器生成的交叉索引文件;

.out文件:链接器生成的可执行代码;

链接器选项

2)MEMORY命令:描述系统实际的硬件资源

3)SECTIONS命令:描述“段”如何定位

F2812的CMD文件只包含后两部分,现对它的编写做一下总结:

(一)用于调试时用,取名为SRAM.CMD

这里有个比较标准的F2812的CMD文件,可以供大家借鉴使用:

MEMORY

{

PAGE 0:

ZONE0 : origin = 0x002000, length = 0x002000

ZONE1 : origin = 0x004000, length = 0x002000

RAML0 : origin = 0x008000, length = 0x001000

ZONE2 : origin = 0x080000, length = 0x080000

ZONE6 : origin = 0x100000, length = 0x080000

OTP : origin = 0x3D7800, length = 0x000800

FLASHJ : origin = 0x3D8000, length = 0x002000

FLASHI : origin = 0x3DA000, length = 0x002000

FLASHH : origin = 0x3DC000, length = 0x004000

FLASHG : origin = 0x3E0000, length = 0x004000

FLASHF : origin = 0x3E4000, length = 0x004000

FLASHE : origin = 0x3E8000, length = 0x004000

FLASHD : origin = 0x3EC000, length = 0x004000

FLASHC : origin = 0x3F0000, length = 0x004000

FLASHA : origin = 0x3F6000, length = 0x002000

BEGIN_H0 : origin = 0x3F8000, length = 0x000002

BEGIN_FLASH : origin = 0x3F7FF6, length = 0x000002

PRAMH0 : origin = 0x3F8002, length = 0x001FFE

ZONE7 : origin = 0x3FC000, length = 0x003FC0

ROM : origin = 0x3FF000, length = 0x000FC0 // boot ROM available if MP/MCn=0

RESET : origin = 0x3FFFC0, length = 0x000002

VECTORS : origin = 0x3FFFC2, length = 0x00003E

PAGE 1 : // Data Memory

RAMM0 : origin = 0x000000, length = 0x000400

RAMM1 : origin = 0x000400, length = 0x000400

DEV_EMU : origin = 0x000880, length = 0x000180

FLASH_REGS : origin = 0x000A80, length = 0x000060

CSM : origin = 0x000AE0, length = 0x000010

XINTF : origin = 0x000B20, length = 0x000020

CPU_TIMER0 : origin = 0x000C00, length = 0x000008

PIE_CTRL : origin = 0x000CE0, length = 0x000020

PIE_VECT : origin = 0x000D00, length = 0x000100

ECAN_A : origin = 0x006000, length = 0x000100

ECAN_AMBOX : origin = 0x006100, length = 0x000100

SYSTEM : origin = 0x007010, length = 0x000020

SPI_A : origin = 0x007040, length = 0x000010

SCI_A : origin = 0x007050, length = 0x000010

XINTRUPT : origin = 0x007070, length = 0x000010

GPIOMUX : origin = 0x0070C0, length = 0x000020

GPIODAT : origin = 0x0070E0, length = 0x000020

ADC : origin = 0x007100, length = 0x000020

EV_A : origin = 0x007400, length = 0x000040

EV_B : origin = 0x007500, length = 0x000040

SCI_B : origin = 0x007750, length = 0x000010

MCBSP_A : origin = 0x007800, length = 0x000040

RAML1 : origin = 0x009000, length = 0x001000

FLASHB : origin = 0x3F4000, length = 0x002000

CSM_PWL : origin = 0x3F7FF8, length = 0x000008

DRAMH0 : origin = 0x3f9000, length = 0x001000

}

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, TYPE = DSECT // we are not using the .reset

// section

//Peripheral Frame 0 Register Structures

DevEmuRegsFile : > DEV_EMU, PAGE = 1

FlashRegsFile : > FLASH_REGS, PAGE = 1

CsmRegsFile : > CSM, PAGE = 1

XintfRegsFile : > XINTF, PAGE = 1

CpuTimer0RegsFile : > CPU_TIMER0, PAGE = 1

PieCtrlRegsFile : > PIE_CTRL, PAGE = 1

PieVectTable : > PIE_VECT, PAGE = 1

//Peripheral Frame 1 Register Structures

SysCtrlRegsFile : > SYSTEM, PAGE = 1

SpiaRegsFile : > SPI_A, PAGE = 1

SciaRegsFile : > SCI_A, PAGE = 1

XIntruptRegsFile : > XINTRUPT, PAGE = 1

GpioMuxRegsFile : > GPIOMUX, PAGE = 1

GpioDataRegsFile : > GPIODAT PAGE = 1

AdcRegsFile : > ADC, PAGE = 1

EvaRegsFile : > EV_A, PAGE = 1

EvbRegsFile : > EV_B, PAGE = 1

ScibRegsFile : > SCI_B, PAGE = 1

McbspaRegsFile : > MCBSP_A, PAGE = 1

//Peripheral Frame 2 Register Structures

ECanaRegsFile : > ECAN_A, PAGE = 1

ECanaMboxesFile : > ECAN_AMBOX PAGE = 1

//Code Security Password Locations

CsmPwlFile : > CSM_PWL, PAGE = 1

}

(二)用于烧写到FLASH中时用,取名为FLASH.CMD

FLASH.CMD与SRAM.CMD基本一样,只是有两处改动:一是MEMORY中将你的程序代码部分映射到FLASH空间里;二是在SECTIONS中添加一个用户定义的起始段,起始段的代码如下:

//User Defined Sections, Used by file DSP28_CodeStartBranch.asm

codestart : > BEGIN, PAGE = 0

其中DSP28_CodeStartBranch.asm中的关键代码为:

.ref _c_int00

.sect “codestart”

Code_start:

LB _c_int00

.end

(三)SECTIONS中段的含义与用户自定义段的方法

1、各个段的含义

以下是TI公司的技术文档中对一些段的说明,现截个图给大家参考:

除此外还有一些段的含义如下(这仅是我见过的,有漏下的还请提示,大家一起学习):

.reset 复位中断向量表

.vectors中断向量表

.data 已初始化数据,常数数据(比如对变量的初始化数据)

.pvecs 外围模块中断向量表

.ref 引用外部定义的变量或函数名

.global 引用全局变量或函数

.space 定义要保留的空间

.def 定义变量,与#define功能相同

.end 段的结束标识

.sect 用户自定义的已初始化段

.asect 比.sect多了绝对地址定位功能,一般不用

.usect 用户自定义的未初始化段

已初始化的段:.text, .cinit, .const, .econst, .pinit, .switch

.text:所有可以执行的代码和常量

.cinit:全局变量和静态变量的C初始化记录

.const:包含字符串常量和初始化的全局变量和静态变量(const)的初始化和说明

.econst:包含字符串常量和初始化的全局变量和静态变量(far const)的初始化和说明

.pinit:全局构造器(C++)程序列表

.switch:包含转换语气声明的列表

非初始化的段:.bss, .ebss, .stack, .sysmem, .esysmem(更好的理解就是,这些段就是存储空间而已)

..bss:为全局变量和局部变量保留的空间,在程序上电时,cinit空间中的数据复制出来并存储在.bss空间中

.ebss:为使用大寄存器模式时的全局变量和静态变量预留的空间,在程序上电时,cinit空间中的数据复制出来并存储在.ebss

.stack:为系统堆栈保留的空间,主要用于和函数传递变量或为局部变量分配空间

.sysmem:为动态存储分配保留的空间。如果有宏函数,此空间被宏函数占用,如果没有宏函数,此空间保留为0

.esysmem:为动态存储分配保留的空间,如果有far函数,此空间被相应的占用,如果没有,此空间保留为0

2、自定义段的方法:

我知道的有两种:

(1)用汇编代码,如上述中的codestart段。

格式为:

.sect “段名”

(段的内容)

.end

(2)用C语言中的#pragma,如上述中的CsmPwlFile段。

格式为:

#pragma DATA_SECTION(函数名或变量名,"段名");

#pragma CODE_SECTION(函数名或变量名,"段名");

http://www.61ic.com/Services/Course/C2000/201009/27623.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值