关于Codewarrior 中的 prm 文件Word文档格式.docx

上传人:b****5 文档编号:18894031 上传时间:2023-01-02 格式:DOCX 页数:17 大小:84.59KB
下载 相关 举报
关于Codewarrior 中的 prm 文件Word文档格式.docx_第1页
第1页 / 共17页
关于Codewarrior 中的 prm 文件Word文档格式.docx_第2页
第2页 / 共17页
关于Codewarrior 中的 prm 文件Word文档格式.docx_第3页
第3页 / 共17页
关于Codewarrior 中的 prm 文件Word文档格式.docx_第4页
第4页 / 共17页
关于Codewarrior 中的 prm 文件Word文档格式.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

关于Codewarrior 中的 prm 文件Word文档格式.docx

《关于Codewarrior 中的 prm 文件Word文档格式.docx》由会员分享,可在线阅读,更多相关《关于Codewarrior 中的 prm 文件Word文档格式.docx(17页珍藏版)》请在冰豆网上搜索。

关于Codewarrior 中的 prm 文件Word文档格式.docx

DATA_NEAR 

IBCC_NEAR 

0x4000 

0x7FFF;

ROM_C000 

DATA_NEAR 

IBCC_NEAR 

0xC000 

0xFEFF;

//OSVECTORS 

0xFF10 

0xFFFF;

EEPROM_00 

DATA_FAR 

IBCC_FAR 

0x000800 

TO 

0x000BFF;

EEPROM_01 

DATA_FAR 

IBCC_FAR 

0x010800 

0x010BFF;

EEPROM_02 

=READ_ONLY 

DATA_FAR 

0x020800 

0x020BFF;

EEPROM_03 

0x030800 

0x030BFF;

EEPROM_04 

0x040800 

0x040BFF;

EEPROM_05 

0x050800 

0x050BFF;

EEPROM_06 

0x060800 

0x060BFF;

EEPROM_07 

0x070800 

0x070BFF;

PAGE_F8 

=READ_ONLY 

0xF88000 

0xF8BFFF;

PAGE_F9 

0xF98000 

0xF9BFFF;

PAGE_FA 

0xFA8000 

0xFABFFF;

PAGE_FB 

0xFB8000 

0xFBBFFF;

PAGE_FC 

0xFC8000 

0xFCBFFF;

PAGE_FE 

0xFE8000 

0xFEBFFF;

PLACEMENT

_PRESTART, 

STARTUP, 

ROM_VAR, 

STRINGS, 

VIRTUAL_TABLE_SEGMENT, 

//.ostext, 

DEFAULT_ROM,NON_BANKED, 

COPY 

INTO 

ROM_C000;

OTHER_ROM 

INTO 

PAGE_FE,PAGE_FC,PAGE_FB,PAGE_FA,PAGE_F9,PAGE_F8;

//.stackstart, 

SSTACK, 

//.stackend, 

PAGED_RAM, 

DEFAULT_RAM 

RAM;

DISTRIBUTE 

DISTRIBUTE_INTO

ROM_4000,PAGE_FE,PAGE_FC,PAGE_FB,PAGE_FA,PAGE_F9,PAGE_F8;

CONST_DISTRIBUTE 

DISTRIBUTE_INTO

DATA_DISTRIBUTE 

//.vectors 

OSVECTORS;

ENTRIES 

//_vectabOsBuildNumber_OsOrtiStackStart_OsOrtiStart

STACKSIZE 

0x100 

VECTOR0_Startup 

//VECTOR0Entry 

//INITEntry 

1.prm文件组成结构

按所含的信息的不同.prm文件有六个组成部分构成,这里仅讨论和内存空间映射关系紧密的三个部分,其他的不做讨论。

·

SEGMENTS…END

定义和划分芯片所有可用的内存资源,包括程序空间和数据空间。

一般我们将程序空间定义成ROM,把数据空间定义成RAM,但这些名字都不是系统保留的关键词,可以由用户随意修改。

用户也可以把内存空间按地址和属性随意分割成大小不同的块,每块可以自由命名。

例如同样是RAM,可以使用不同的属性,使其有复位后变量清零和不清零之分。

关于内存划分的具体方法在后面详解。

PLACEMENT…END

将指派源程序中所定义的各种段,如数据段DATA_SEG、CONST_SEG和代码段CODE_SEG被具体放置到哪一个内存块中。

它是将源程序中的定义描述和实际物理内存挂钩的桥梁。

STACKSIZE

定义系统堆栈长度,其后给出的长度字节数可以根据实际应用需要进行修改。

堆栈的实际定位取决于RAM内存的划分和使用情况。

默认的情况下,堆栈放在RAM区域的起始部分。

当然,堆栈的定义不只有这种方式,还可以使用STACKTOP关键字。

后面将详细讨论。

2内存划分的具体方式

由SEGMENTS开始到END为止,中间可以添加任意多行内存划分的定义,每一行用分号结尾。

定义行的语法型式为:

[块名]=[属性1][属性2],…,[属性n][起始地址]TO[结束地址];

其中,

“块名”的定义和C语言变量定义相同,是以英文字母开头的一个字符串,用户可以自己任意定义块名。

“属性”用户是不能自己定义的,因为属性名指定了上面所说的“块名”所对应的不同的内存类型和访问方式,而不同物理内存的类型和访问方式是一定的。

对于“属性1”,Codewarrior5.0中可以有三种不同的类型,对于只读的Flash-ROM区属性一定是READ_ONLY,对于可读写的RAM区属性可以是READ_WRITE,也可以是NO_INIT。

它们两者的关键区别是ANSI-C的初始化代码会把定位在READ_WRITE块中的所有全局和静态变量自动清零,而NO_INIT块中的变量将不会被自动清零。

当然只是复位时不清零,掉电时还是清零的,但是对于单片机系统,变量在复位时不被自动清零这一特性有时是很关键的,在某些应用中有特殊的用途。

对于“属性2…属性n”,根据上面给出的.prm的范例文件可以看出来,可能的形式有“DATA_FAR”、“DATA_NEAR”、“IBCC_FAR”、“IBCC_NEAR”四种类型。

其中,“DATA_FAR”和“DATA_NEAR”相对应,当内存区域包含变量或者是常量时(通常是RAM、Flash和EEPROM),必须指明上面两种属性中的一种,由于涉及到内存的分页,可以这样理解:

“DATA_FAR”属性指定的内存块为可以保存数据的非固定页,而“DATA_NEAR”属性指定的内存块为可以保存数据的固定页;

同理“IBCC_FAR”和“IBCC_NEAR”相对应,当内存区域包含代码时(Flash和EEPROM),必须指明上面两种属性中的一种,“IBCC_FAR”属性指定的内存块为可以保存代码的非固定页,而“IBCC_NEAR”属性指定的内存块为可以保存代码的固定页

讨论到这里,细心的读者已经发现,在上面的.prm文件范例中,RAM的属性有“DATA_FAR”和“DATA_NEAR”两种,Flash的属性中也是四种都有,但是EEPROM中却只有“DATA_FAR”和“IBCC_FAR”两种,这正好验证了上一篇文章(飞思卡尔16位单片机的资源配置)中所提到的,RAM、Flash中都有固定页,但是EEPROM中全部是非固定页。

起始地址和结束地址决定了一内存块的物理位置,对于固定页,用4位16进制数表示,而对于非固定页,则用6位16进制表示,多出来的两位其实是寄存器EPAGE、RPAGE或PPAGE的值,可见,对于分页的资源,是通过寄存器(EPAGE、RPAGE或PPAGE)和16位的地址总线的组合来进行寻址的。

“TO”是系统保留的关键字,必须大写。

下面,根据上面范例提供的内容,举几个例子:

例1 

0x2000TO 

上面这句话的意思是:

分配0x2000-0x3FFF的区域的块名为“RAM”(当然可以定义别的名称),由上一篇文章而知,这一区域的物理内存的性质为RAM,属性应该为“READ_WRITE”,并且这一区域中的两页都为固定页,所以为“DATA_NEAR”。

例2 

将8K字节RAM的后面4K字节定义成非自动清零的数据保留区,则应如下定义:

SEGMENTS

……

RAM 

=READ_WRITE 

0x2000TO 

0x2FFF;

RAM_NO_INIT 

=NO_INIT 

0x3000TO 

0x3FFF;

……

注意,各部分RAM的分配地址不应该存在重叠的部分,否则会发生错误。

例3 

DATA_FARIBCC_FAR 

0x000800TO0x000BFF;

XS128单片机中的EEPROM由Data-Flash模拟,所以属性为READ_ONLY。

EEPROM全部为非固定页,所以用“DATA_FAR”、“IBCC_FAR”。

后面的起始地址和结束地址分别为6位的16进制数,前两位的“00”实质指的是EEPROM分页寄存器EPAGE的值为0x00。

用SEGMENTS只是从单片机的物理内存这一角度对其进行空间划分。

源程序本身并不知道物理内存被分割和属性定义的这些细节。

它们两者之间必须通过下面的PLACEMENT建立联系。

3程序段和数据段的放置

PLACEMENT-END内所描述的信息是告诉连接器源程序中所定义的各类段应该被具体放置到哪一个内存块中去。

其语法型式为:

[段名1],[段名2],...,[段名n] 

INTO[内存块名1],[内存块名2],…,[内存块名n];

DISTRIBUTE_INTO[内存块名1],[内存块名2],…,[内存块名n];

其中

段名就是在源程序中用“#pragma”声明的数据段、常数段或代码段的名字。

如果用缺省名“DEFAULT”,则默认的数据段名为DEFAULT_RAM,代码段和常数段名为DEFAULT_ROM。

若程序中定义的段名没有在PLACEMENT中提及,则将被视同为DEFAULT。

几个相同性质但不同名字的段可以被放置到同一个内存块中,相互之间用逗号分隔。

INTO是系统保留的关键词,在这里为“放入”的意思。

DISTRIBUTE_INTO也是系统的保留关键字。

Codewarrior具有内存自动优化的功能,但是在“Smallmemory”模式中,这种功能不会被启用,只有当16-bit的地址空间不能存放下所有的变量和代码时,才会启用这种功能。

在SEGMENTS-END区域中,当在内存模块的属性中加上“DATA_FAR”、“DATA_NEAR”、“IBCC_FAR”、“IBCC_NEAR”四种属性中的任何一种时,那么在PLACEMENT-END区域中,就需要指定段名“DISTRIBUTE”,“CONST_DISTRIBUTE”,“DATA_DISTRIBUTE”(系统默认的,非关键字,用户可以自行更改)所分配的内存空间,这就需要使用“DISTRIBUTE_INTO”关键字。

关于内存自动优化功能,可以参考freescale的官方技术手册“TN262.pdf”。

内存块名就是前面介绍的用SEGMENTS划分好的不同的内存块名字。

利用这样直观的定位描述文本可以方便灵活的将数据或代码定位到芯片内存任意可能的位置,实现某些特殊目的的应用。

下面的例子,说明了各种段名、PLACEMENT和SEGMENTS之间的对应关系。

例4定义非自动清零的数据段

=READ_WRITE 

0x2000TO 

0x2FFF;

=NO_INIT 

0x3000TO 

DATA_PERSISTENT 

RAM_NO_INIT;

//源程序编写:

#pragma 

DATA_SEG 

DATA_PERSISTENT//定义复位时非自定清零数据段

bytesysState;

DEFAULT

4堆栈的设置

关于堆栈的设置,Codewarrior提供了两种方式:

“STACKSIZE”命令方式和“STACKTOP”命令方式。

这两种方式在同一个.prm文件中,不能同时存在。

当用户只关心堆栈的大小而不关心堆栈的存放位置时,推荐使用STACKSIZE方式。

系统默认的方式为使用STACKSIZE方式。

STACKSIZE命令方式:

当使用STACKSIZE命令方式时,如果在PLACEMENT-END部分声明了“SSTACK 

INTORAM”,这样的话,堆栈区就被放在RAM区域的起始部分,下面的例子说明了这种方式:

例5

READ_WRITE 

0x2000 

SSTACK, 

RAM;

STACKSIZE 

0x100

上面的例子将堆栈区域存放的地址为0x20FF-0x2000,初始的堆栈指针指向栈顶地址0x20FF。

相反,如果在PLACEMENT-END部分没有声明“SSTACK 

RAM”,则堆栈被分配在RAM区域中已分配空间的后面。

请参见例6。

例6

PAGED_RAM, 

在这个例子中,如果RAM区域中已经分配的变量占用了4个字节(从0x2000到0x2003),则堆栈放在这四个字节的后面,从0x2103到0x2004,初始的堆栈指针指向0x2103。

STACKYOP命令方式:

当使用STACKTOP命令方式时,如果在PLACEMENT-END部分声明了“SSTACK 

INTORAM”,同样,堆栈区就被放在RAM区域的起始部分,初始的栈顶则由STACKTOP指定。

若没有相应的声明,则初始的栈顶由STACKTOP指定,而堆栈的大小则根据处理器的不同由编译器自行设定,其大小足够装下处理器的PC寄存器的值。

飞思卡尔HCS12(x)memorymap解说之二

【整理者】

【提供者】whut_wj 

【详细说明】飞思卡尔HCS12(x)memorymap解说之二

接着上次的说吧。

首先问一个问题:

中断函数为什么要加:

#pragmaCODE_SEG__NEAR_SEGNON_BANKED这个声明?

这个声明是干什么用的?

这要还是要从FLASH分页和非分页的区别说起。

下面详细说一说,FLASH里非分页和分页的使用。

要明白一点,分页是不可见的,要用的时候PPAGE参与寻

址。

1FLASH里非分页工作机制

FLASH一共为128K,一页是16K,那么应该有8页才是,但是实际只有6个分页。

有2个非分页放在4000-7FFF

,和C000-FFFF两个逻辑地址窗里。

那么,当程序的寻址在64K之内(2^16=64K,16位机的寻址能力是64K)时,

就不用分页了,直接使用那两个非分页的数据。

实际上,3E页3F页是可见的,其实他们就是那2个非分页的映

射。

因此,使用非分页FLASH,就不须设置PPAGE寄存器,直接使用逻辑地址即可。

见图1。

这点我们可以从以下看出:

/*non-pagedFLASHs*/

ROM_4000 

0x4000TO 

0x7FFF;

ROM_C000 

0xC000TO 

0xFEFF;

NON_BANKED, 

ROM_C000/*,ROM_4000*/;

很直观地看出,把这两个可以直接使用逻辑地址的页面设为NON_BANKED,那么中断函数放在NON_BANKED里

,就可以把函数放在64K的寻址程序段中。

这么一来,进中断就方便多了,效率也高很多。

这就是对本文开篇

的解释。

大家记住这一点,在XS128里也有类似的一招。

FLASH里分页工作机制

好了,上面是3E页3F页是可见的分页区,还有3D3C3B3A3938不可见的分页区。

当你的程序要寻址

64K以外的空间,即不是是可见的3E页3F页时,就要涉及分页了。

PPAGE是MMC模块的东西,我搞了个图片大家看看,如图2。

每一页在DG128中的逻辑地址都是由PPAGE中的

页号和重叠窗口内地址组成的24位绝对地址。

通过设置寄存器PPAGE,可以使用全部的FLASH空间。

例如:

程序

要将数据存入$3D页,设置PPAGE的值为$3D,那么逻辑地址范围说是$3D8000-$3DBFFF。

有一点要注意:

为了分页描述的完整性,可以如下理解:

对于3E页3F页有两个逻辑地址映射到物理地址。

拿3E页来说,有$004000-$007FFF和$3E8000-$3EBFFF。

对于程序是如何寻址,这个是内核的东西,大家可以看看CPU这个文档。

通过分析,相信大家知道地址这个东西是非常有用的吧。

下次说说XS128,XS128的RAMFLASHEEPROM都可

以分页。

更高级,更主动,编程弹性更大。

353091_1265180117Zk7v.jpg(116.3KB)

2010-2-2611:

54

图1

例3EEPROM_00=READ_ONLYDATA_FARIBCC

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

当前位置:首页 > 初中教育 > 初中作文

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

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