CMD文件的设定
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/* .reset is a standard section used by the compiler. It contains the */
/* the address of the start of _c_int00 for C Code. /*
/* When using the boot ROM this section and the CPU vector */
静态常量。 .switch 程序编译、链接时,该标号指示部分存放大型的 switch 语句的跳转表。 .text 程序编译、链接时,该标号指示部分存放可执行代码和浮点常数。 .bss 程序编译、链接时,该标号指示部分存放没有初始化的全局变量和静态变量。 .stack 程序编译、链接时,该标号定义为软件堆栈。
PRAMH0 : origin = 0x3F8002, length = 0x000FFE
RESET
: origin = 0x3FFFC0, length = 0x000002
PAGE 1 :
RAMM1 : origin = 0x000400, length = 0x000400
DRAMH0 : origin = 0x3f9000, length = 0x001000
FLASHE
: origin = 0x3E8000, length = 0x004000
FLASHD
: origin = 0x3EC000, length = 0x004000
FLASHC
: origin = 0x3F0000, length = 0x004000
FLASHA
: origin = 0x3F6000, length = 0x001F80
/* XINTF zone 0 */ /* XINTF zone 1 */ /* on-chip RAM block L0 */ /* XINTF zone 2 */ /* XINTF zone 6 */ /* on-chip OTP */
FLASHJ
: origin = 0x3D8000, length = 0x002000
Cmd 文件分为 2 种,一种是分配 RAM 空间,将程序 LOAD 到 RAM 空间运行;另外一 种是分配 FLASH 空间,把程序固化在 FLASH 里运行。
先介绍几个伪指令: .cinit 程序编译、链接时,该标号指示部分存放已明确初始化的全局变量和静态变量。 .const 程序编译、链接时,该标号指示部分存放已明确初始化的字符串常量、全局常量、
/* table is not needed. Thus the default type is set here to */
/* DSECT */
.reset
: > RESET,
PAGE = 0, TYPE = DSECT
vectors
: > VECTORS PAGE = 0, TYPE = DSECT
PAGE = 1
.ebss .esysmem
: > RAML1 : > RAMH0
PAGE = 1 PAGE = 1
/* Initalized sections go in Flash */
/* For SDFlash to program these, they must be allocated to page 0 */
RAML0
: origin = 0x008000, length = 0x001000
ZONE2
: origin = 0x080000, length = 0x080000
ZONE6
: origin = 0x100000, length = 0x080000
OTP
: origin = 0x3D7800, length = 0x000800
PAGE = 1
}
程序代码放在 PRAMH0,总共长度为 0x000FFE 字节;
程序分配到 FLASH 运行:
MEMORY
{
PAGE 0:
ZONE0
: origin = 0x002000, length = 0x002000
ZONE1
: origin = 0x004000, length = 0x002000
RESET
: origin = 0x3FFFC0, length = 0x000002
zone 7 (MP/MCn=1) */
VECTORS : origin = 0x3FFFC2, length = 0x00003E
zone 7 (MP/MCn=1) */
/* on-chip FLASH */ /* on-chip FLASH */ /* on-chip FLASH */ /* on-chip FLASH */ /* on-chip FLASH */ /* on-chip FLASH */ /* on-chip FLASH */ /* on-chip FLASH */ /* on-chip FLASH */
}
SECTIONS
{
codestart
: > BEGIN,
PAGE = 0
ramfuncs
: > PRAMH0
PAGE = 0
.text
: > PRAMH0,
PAGE = 0
.cinit
: > PRAMH0,
PAGE = 0
.pinit
: > PRAMH0,
PAGE = 0
.switch
: > RAMM0,
/* on-chip RAM block M0 */ /* on-chip RAM block M1 */ /* on-chip RAM block L1 */ /* on-chip FLASH */ /* on-chip RAM block H0 */
SECTIONS {
.cinit .pinit .text codestart ramfuncs
CMD 文件的设定
以.CMD 为扩展名的文件,这个文件的作用是用来分配存储空间的。由于 DSP 编译器 的编译结果是未定位的,DSP 也没有操作系统来定位执行代码,DSP 系统的配置需求也不 尽相同,因此我们根据实际的需求,自己定义代码的存储位置。打个通俗的比喻,就是我们 有一个仓库,现在需要把货物存放到仓库里面去,为了便于日后取用货物,我们将货物分门 别类,然后把它们存放到指定的位置去。把哪些货物放到哪个位置的规则,就是我们的 CMD 文件的内容。
SECTIONS 伪指令的作用是:描述输入段怎样被组合到输出段内;在可执行程序内 定义输出段;规定在存储器内何处放置输出段;允许重命名输出段。SECTIONS 伪指令的一 般语法是:
SECTIONS {
Name: [property,property,property,…] Name: [property,property,property,…] Name: [property,property,property,…] } 每一个以 name 开始的段的规格说明定义了一个输出段。在段名之后是特性列表,定义段的 内容以及是他们怎么分配的。段可能具有的特性如下: 1. 装载位置,规定段将被装载到存储器内何处; 2. 运行位置,定义段在存储器内何处运行;
}
Code 放在 FlashA;
我们可以修改 cmd 文件;如我们把 FLASHC-J 当作一个 FLASH,即
FLASHJ
: origin = 0x3D8000, length = 0x018000 /* on-chip FLASHC-J */
当然 CECTIONS 段里要把
IQmath
: > FLASHC
oringin=constant,length=constant;
}
PAGE 标识存储空间。用户可以规定多达 255 数据页。通常 PAGE0 规定为程序存储器,
PAGE1 规定为数据存储器。 Name 命名存储器范围。存储器可以是 1~8 个字符。在不同页上可以有相同的名字,但同
个页上名字必须唯一。
CSM_RSVD : origin = 0x3F7F80, length = 0x000076
BEGIN
: origin = 0x3F7FF6, length = 0x000002
CSM_PWL : origin = 0x3F7FF8, length = 0x000008
ROM
: origin = 0x3FF000, length = 0x000FC0
PAGE = 0
/* Math Code */
FLASHC 改成 FLASHJ
需要注意的地方:在 CMD 文件里注释不能用双斜杠 一定要用/* */
下面我们修改 cmd 文件 将程序放在外部 RAM 里面
MEMORY
{
PAGE 0 :
RAMM0
: origin = 0x000000, length = 0x000400
.econst
: > FLASHA
PAGE = 0
.switch
: > FLASHA
PAGE = 0
/* Allocate IQ math areas: */
IQmath
: > FLASHC
IQmathTables
: > ROM
PAGE = 0
/* Math Code */
PAGE = 0, TYPE = NOLOAD /* Math Tables In ROM */
: > FLASHA
PAGE = 0
: > FLASHA, PAGE = 0
: > FLASHA
PAGE = 0
: > BEGIN
PAGE = 0
: LOAD = FLASHD,
RUN = RAML0,
LOAD_START(_RamfuncsLoadStart),
LOAD_END(_RamfuncsLoadEnd),
}
: origin = 0x000000, length = 0x000400 : origin = 0x000400, length = 0x000400 : origin = 0x009000, length = 0x001000 : origin = 0x3F4000, length = 0x002000 : origin = 0x3F8000, length = 0x002000
/* Boot ROM available if MP/MCn=0 */ /* part of boot ROM (MP/MCn=0) or XINTF
/* part of boot ROM (MP/MCn=0) or XINTF
PAGE 1 : RAMM0 RAMM1 RAML1 FLASHB RAMH0
3. 输入段,定义组成输出段的输入段; 4. 段类型,定义特定段类型的标志; 5. 填充值,定义用来填充未初始化空位的数值;
分配为 RAM 空间:
MEMORY
{
PAGE 0 :
RAMM0
: origin = 0x000000, length = 0x000400
BEGIN
: origin = 0x3F8000, length = 0x000002
RUN_START(_RamfuncsRunStart),
PAGE = 0
csmpasswds csm_rsvd
: > CSM_PWL : > CSM_RSVD
PAGE = 0 PAGE = 0
/* Allocate uninitalized data sections: */
.stack
: > RAMM0
MEMORY 伪指令用来标识实际存在的目标系统中可被使用的存储器范围。每个存储器
范围具有名字、起始地址和长度。MEMORY 伪指令的一般语法为:
MEMORY
{
PAGE 0: name1[(attr)];
oringin=constant,length=constant;
PAGEn: name2[(attr)];
PAGE = 0
.reset
: > RESET,
PAGE = 0, TYPE = DSECT /* not used, */
.stack
: > RAMM1,
PAGE = 1
.ebss
: > DRAMH0,
PAGE = 1
.econst
ຫໍສະໝຸດ Baidu
: > DRAMH0,
PAGE = 1
.esysmem
: > DRAMH0,
FLASHI
: origin = 0x3DA000, length = 0x002000
FLASHH
: origin = 0x3DC000, length = 0x004000
FLASHG
: origin = 0x3E0000, length = 0x004000
FLASHF
: origin = 0x3E4000, length = 0x004000