飞思卡尔单片机编程 联系客服

发布时间 : 星期六 文章飞思卡尔单片机编程更新完毕开始阅读13bd750b763231126edb1173

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

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

RAM = READ_WRITE DATA_NEAR 0x2000 TO 0x2FFF;

RAM_NO_INIT = NO_INIT DATA_NEAR 0x3000 TO 0x3FFF; …… END

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

例3 EEPROM_00 = READ_ONLY DATA_FAR IBCC_FAR 0x000800 TO 0x000BFF;

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]; 和

[段名1], [段名2],... , [段名n] DISTRIBUTE_INTO [内存块名1],[内存块名2],… ,[内存块名n]; 其中

· 段名就是在源程序中用“#pragma”声明的数据段、常数段或代码段的名字。如果用缺省名“DEFAULT”,则默认的数据段名为

DEFAULT_RAM,代码段和常数段名为DEFAULT_ROM。若程序中定义的段名没有在PLACEMENT中提及,则将被视同为DEFAULT。几个相同性质但不同名字的段可以被放置到同一个内存块中,相互之间用逗号分隔。

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

· DISTRIBUTE_INTO 也是系统的保留关键字。Codewarrior 具有内存自动优化的功能,但是在“Small memory”模式中,这种功能不会被启用,只有当16-bit的地址空间不能存放下所有的变量和代码时,才会启用这种功能。

在SEGMENTS-END区域中,当在内存模块的属性中加上

“DATA_FAR”、“DATA_NEAR”、“IBCC_FAR”、“IBCC_NEAR”四种属性中的任何一种时,那么在PLACEMENT-END区域中,就需要指定段名“DISTRIBUTE”, “CONST_DISTRIBUTE”,

“DATA_DISTRIBUTE”(系统默认的,非关键字,用户可以自行更改)所分配的内存空间,这就需要使用“DISTRIBUTE_INTO”关键字。

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

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

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

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