询问编译错误:out of allocation space的错误
- UID
- 129304
- 性别
- 男
|
询问编译错误:out of allocation space的错误
我在编译一个工程的时候,以前一直没问题的,今天增加了几个函数,就出现“out of allocation space in segment ROM_C000 ad address 0xFEFE”的错误。
然后我再删掉几个函数,编译又可以通过,然后在增加几个函数,同样的错误又出现了。而就那函数本事来说,其没有语法错误。所以我估计是代码超长,超过内存分配了,但怎么解决呢?
我的这个工程以前的编译代码大小是15K多,在刚开始新建这个工程时选择的是Small的内存模式,但增加几个函数后就出现上面的错误。而我用的CW软件是网上下载的,编译的Lisense应该是32K的。
希望哪位兄弟能给予解答。 |
|
|
|
|
|
- UID
- 104380
- 性别
- 男
|
问题是0xC000~0xFEFE之间的空间只有16K。看看你的ROM空间的分配。 |
|
|
|
|
|
- UID
- 129304
- 性别
- 男
|
谢谢版主,我已经发现了是那个原因造成的,但是我不知道怎么去修改,也就是不知道怎么改PRM文件才可以满足超过16K的限制。能不能提示一下哪有资料可以查查这方面?
(手册的内存映射那块我刚看过,还是不知道怎么去修改) |
|
|
|
|
|
- UID
- 104380
- 性别
- 男
|
|
|
|
|
|
- UID
- 129304
- 性别
- 男
|
我用的是9S12D64,Prm就是在新建工程时选择Small那种内存模式时自动生成的。如下:
NAMES
END
SEGMENTS
RAM = READ_WRITE 0x0400 TO 0x0FFF;
/* unbanked FLASH ROM */
ROM_C000 = READ_ONLY 0xC000 TO 0xFEFF;
/* banked FLASH ROM */
PAGE_3C = READ_ONLY 0x3C8000 TO 0x3CBFFF;
PAGE_3D = READ_ONLY 0x3D8000 TO 0x3DBFFF;
PAGE_3E = READ_ONLY 0x3E8000 TO 0x3EBFFF;
PAGE_ME = READ_ONLY 0x4000 TO 0xBFFF;
/* PAGE_3F = READ_ONLY 0x3F8000 TO 0x3FBFFF; not used: equivalent to ROM_C000 */
END
PLACEMENT
_PRESTART, /* Used in HIWARE format: jump to _Startup at the code start */
STARTUP, /* startup data structures */
ROM_VAR, /* constant variables */
STRINGS, /* string literals */
VIRTUAL_TABLE_SEGMENT, /* C++ virtual table segment */
DEFAULT_ROM, NON_BANKED , /* runtime routines which must not be banked */
COPY /* copy down information: how to initialize variables */
INTO ROM_C000;
OTHER_ROM INTO PAGE_3C,PAGE_3D,PAGE_3E,PAGE_ME;
DEFAULT_RAM INTO RAM;
END
STACKSIZE 0x100
VECTOR 0 _Startup /* reset vector: this is the default entry point for a C/C++ application. */
VECTOR ADDRESS 0XFFF0 RTI_ISR
VECTOR ADDRESS 0XFFDE TOverflow_ISR
我知道是代码段超过16K,从0xC000 TO 0xFEFF是16K,这个原因所致,但我不知道怎么修改才行,怎么才能充分利用内存。 |
|
|
|
|
|
- UID
- 129304
- 性别
- 男
|
请版主帮忙解答一下,怎么修改才能充分利用Rom空间,而不是限制在 0xC000 TO 0xFEFF这16K里面 |
|
|
|
|
|
- UID
- 104380
- 性别
- 男
|
既然你已经将其他的ROM空间定义为OTHER_ROM,你可以用
#pragma CODE_SEG OTHER_ROM
的格式将非中断入口的函数放在OTHER_ROM里,这样就可以充分利用所有的ROM空间了。 |
|
|
|
|
|
- UID
- 129304
- 性别
- 男
|
问版主一个问题:在Prm文件里定义:
ROM_C000 = READ_ONLY 0xC000 TO 0xFEFF;
PAGE_3C = READ_ONLY 0x3C8000 TO 0x3CBFFF;
PAGE_3D = READ_ONLY 0x3D8000 TO 0x3DBFFF;
PAGE_3E = READ_ONLY 0x3E8000 TO 0x3EBFFF;
但是我看了D64的数据手册,怎么也理会不了 PAGE_3C 和 PAGE_3D 和 PAGE_3E的地址是怎么映射的映射到哪个Rom区,手册上 0x4000 TO 0xFEFF才是ROM区,那PAGE_3C等是怎么映射过去的?我该查哪部分资料呢
谢谢
|
|
|
|
|
|
- UID
- 104380
- 性别
- 男
|
|
|
|
|
|
- UID
- 804264
|
|
|
|
|
|
- UID
- 780603
- 性别
- 男
|
你用数组也解决不了你的根本问题啊,你用PPAGE把ROM空间扩大就可以了。其实,当你建立工程的时候,start12.c文件已经用PPAGE扩了你的空间了,可是,我不知道你为什么还要改你的prm文件,那个OTHER_ROM东西,你加这个有什么用意吗? 你可以这样:
COPY /* copy down information: how to initialize variables */
INTO ROM_C000;
OTHER_ROM INTO PAGE_3C,PAGE_3D,PAGE_3E,PAGE_ME;
上面是你的原prm文件,你改成这样就可以了,如下:
COPY /* copy down information: how to initialize variables */
INTO ROM_C000, PAGE_3C,PAGE_3D,PAGE_3E,PAGE_ME; |
-
1
评分次数
-
|
|
|
|
|