首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

求助,如何在s12xep100中定义大于4k的数组

求助,如何在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,就会出错。
最好将一个大数组分成几个4K的小数组。
海纳百川  有容乃大
可是我需要一个连续的ram缓冲区,这个缓冲区是用来做FLASH的映射的。因为我在上电后需要将一块flash地址空间的数据对拷到这块ram缓冲区中,相当于对这块ram中的数组变量进行初始化,而flash中连续的数据是大于4k的,这样就没有办法完成对拷,ram中的数组也没有办法初始化。版主有没有什么其它的办法?
我们没有办法分配一个大于页面尺寸(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替代了。
这样使用RAM太奢侈了~~~
感谢大家的帮助,
返回列表