Board logo

标题: 求助,如何在s12xep100中定义大于4k的数组 [打印本页]

作者: hgh169    时间: 2010-2-24 15:23     标题: 求助,如何在s12xep100中定义大于4k的数组

我用此方法定义一个变量数组
#pragma DATA_SEG __GPAGE_SEG PAGED_RAM
unsigned int variable1[50][50];
#pragma DATA_SEG DEFAULT

PRM文件:
PAGED_RAM         INTO  /* when using banked addressing for variable    data, make sure to specify
                                 the option -D__FAR_DATA on the compiler command line */
                              RAM_F0, RAM_F1, RAM_F2, RAM_F3, RAM_F4, RAM_F5, RAM_F6, RAM_F7,
                              RAM_F8, RAM_F9, RAM_FA, RAM_FB, RAM_FC, RAM_FD;  
编译后报错:
Link Error   : L1102: Out of allocation space in segment RAM_F0 at address 0xF01000


Link Error   : Link failed
按照an3784上的介绍,使用全局地址应该可以得到最大64k的连续存储空间,但是一旦定义的数组超过4k,就会出错。
作者: strongchen    时间: 2010-2-25 09:42

最好将一个大数组分成几个4K的小数组。
作者: hgh169    时间: 2010-2-25 23:50

可是我需要一个连续的ram缓冲区,这个缓冲区是用来做FLASH的映射的。因为我在上电后需要将一块flash地址空间的数据对拷到这块ram缓冲区中,相当于对这块ram中的数组变量进行初始化,而flash中连续的数据是大于4k的,这样就没有办法完成对拷,ram中的数组也没有办法初始化。版主有没有什么其它的办法?
作者: GaoTristone    时间: 2010-2-27 23:21

我们没有办法分配一个大于页面尺寸(RAM的页面尺寸为4K)的数据,所以link出错。

根据您的意图:想分别一个50x50的unsigned int 2维数组在RAM_F0和RAM_F1组成的尺寸为8K的RAM中。解决办法是使用全局页面寄存器GPAGE进行访问。具体作法是:

1) 首先在prm文件的SEGMENTS声明中,用一个尺寸为8K的全局RAM块(我们这里取名为RAM_F0ANDF1)代替RAM_F0和RAM_F1:
SEGMENTS
.......
//      RAM_F0        = READ_WRITE  DATA_FAR           0xF01000 TO 0xF01FFF;
//      RAM_F1        = READ_WRITE  DATA_FAR           0xF11000 TO 0xF11FFF;
        RAM_F0ANDF1 = READ_WRITE 0x0F0000'G TO 0x0F3FFF'G;
.......
END

2) 然后在prm文件的PLACEMENT声明中,声明一个新的段(我们这里取名为RAM_8KBLK),并将该段放入RAM_F0ANDF1:
PLACEMENT
.......
      RAM_8KBLK         INTO  RAM_F0ANDF1;
.......
END

3) 再在C文件中使用:
#pragma DATA_SEG  __GPAGE_SEG  RAM_8KBLK
unsigned int variable1[50][50];
#pragma DATA_SEG DEFAULT

这样,就可以了。

注意:
在prm文件中要将所有的“RAM_F0”和“RAM_F1”都注释掉,因为这两个页面已经被RAM_F0ANDF1替代了。
作者: zephanshaka    时间: 2010-3-8 23:13

这样使用RAM太奢侈了~~~
作者: hgh169    时间: 2010-3-13 08:19

感谢大家的帮助,




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0