项目使用了飞思卡尔的HCS12XEP100芯片,根据spec说明有64kRAM可以使用。但是在做测试的时候,总共跑起来也就8K就赛满了。再看spec,得知其中默认能使用的只有8K,其余的都是通过RPAGE寄存器来访问的,同时从网上也得知需要配置.prm文件和#pragma一起配合使用。一直搞得很糊涂。后来发现.prm中有这么一段:

/* paged RAM:                       0x1000 TO   0x1FFF; addressed through RPAGE */

      RAM_XGATE_STK = READ_WRITE  0xF81000 TO 0xF810FF; /* The stack is set by the XGATE compiler option -Cstv=8100 */

      RAM_F0        = READ_WRITE  0xF01000 TO 0xF01FFF ALIGN 2[1:1]; /* is also mapped to XGATE:  0x0000..0x0FFF */

      RAM_F1        = READ_WRITE  0xF11000 TO 0xF11FFF ALIGN 2[1:1]; /* is also mapped to XGATE:  0x1000..0x1FFF */

      RAM_F2        = READ_WRITE  0xF21000 TO 0xF21FFF ALIGN 2[1:1]; /* is also mapped to XGATE:  0x2000..0x2FFF */

      RAM_F3        = READ_WRITE  0xF31000 TO 0xF31FFF ALIGN 2[1:1]; /* is also mapped to XGATE:  0x3000..0x3FFF */

      RAM_F4        = READ_WRITE  0xF41000 TO 0xF41FFF ALIGN 2[1:1]; /* is also mapped to XGATE:  0x4000..0x4FFF */

      RAM_F5        = READ_WRITE  0xF51000 TO 0xF51FFF ALIGN 2[1:1]; /* is also mapped to XGATE:  0x5000..0x5FFF */

      RAM_F6        = READ_WRITE  0xF61000 TO 0xF61FFF ALIGN 2[1:1]; /* is also mapped to XGATE:  0x6000..0x6FFF */

      RAM_F7        = READ_WRITE  0xF71000 TO 0xF71FFF ALIGN 2[1:1]; /* is also mapped to XGATE:  0x7000..0x7FFF */

      RAM_F8        = READ_WRITE  0xF81100 TO 0xF81FFF ALIGN 2[1:1]; /* is also mapped to XGATE:  0x8100..0x8FFF */

      RAM_F9        = READ_WRITE  0xF91000 TO 0xF91FFF ALIGN 2[1:1]; /* is also mapped to XGATE:  0x9000..0x9FFF */

      RAM_FA        = READ_WRITE  0xFA1000 TO 0xFA1FFF ALIGN 2[1:1]; /* is also mapped to XGATE:  0xA000..0xAFFF */

      RAM_FB        = READ_WRITE  0xFB1000 TO 0xFB1FFF ALIGN 2[1:1]; /* is also mapped to XGATE:  0xB000..0xBFFF */

      RAM_FC        = READ_WRITE  0xFC1000 TO 0xFC1FFF ALIGN 2[1:1]; /* is also mapped to XGATE:  0xC000..0xCFFF */

      RAM_FD        = READ_WRITE  0xFD1000 TO 0xFD1FFF ALIGN 2[1:1]; /* is also mapped to XGATE:  0xD000..0xDFFF */

/*    RAM_FE        = READ_WRITE  0xFE1000 TO 0xFE1FFF; intentionally not defined: equivalent to RAM: 0x2000..0x2FFF */

/*    RAM_FF        = READ_WRITE  0xFF1000 TO 0xFF1FFF; intentionally not defined: equivalent to RAM: 0x3000..0x3FFF */

每一段刚好4K,也就是说64KRAM除了默认使用的8K之外还有56K,也就是14段,基本与上面的吻合。

 

需要映射的部分RAM就是通过上图中的4K RAM window段和RPAGE寄存器共同作用来寻址的。

但是怎么在代码中使用,也就是我的全局数据段如何才能放到这些段中。经过网上搜索和自己调试发现操作步骤如下:

(1)         .prm中的PLACEMENT字段下将上面 RAM_F1等起个名字,如下所示

PAGED_RAM_TEST        INTO  RAM_F1;

PAGED_RAM_TEST就是我们在代码文件中要用到的名字

(2)         在代码文件中将要放到RAM_F1的数据放到下面语句之下

#pragma DATA_SEG __RPAGE_SEG PAGED_RAM_WAN

根据#pragma的说明,除非遇到其他的类型(例如函数)或者别的用#pragma说明的数据段,否则在此之后的数据都放到#pragma声明的数据段内

(3)         编译工程,查看.map文件,会发现PAGED_RAM_TEST对应段的数据大小