Board logo

标题: 询问编译错误:out of allocation space的错误 [打印本页]

作者: nishui    时间: 2006-1-4 12:14     标题: 询问编译错误:out of allocation space的错误

我在编译一个工程的时候,以前一直没问题的,今天增加了几个函数,就出现“out of allocation space in segment ROM_C000 ad address 0xFEFE”的错误。

然后我再删掉几个函数,编译又可以通过,然后在增加几个函数,同样的错误又出现了。而就那函数本事来说,其没有语法错误。所以我估计是代码超长,超过内存分配了,但怎么解决呢?

我的这个工程以前的编译代码大小是15K多,在刚开始新建这个工程时选择的是Small的内存模式,但增加几个函数后就出现上面的错误。而我用的CW软件是网上下载的,编译的Lisense应该是32K的。

希望哪位兄弟能给予解答。


作者: strongchen    时间: 2006-1-4 13:54

问题是0xC000~0xFEFE之间的空间只有16K。看看你的ROM空间的分配。
作者: nishui    时间: 2006-1-4 14:46

谢谢版主,我已经发现了是那个原因造成的,但是我不知道怎么去修改,也就是不知道怎么改PRM文件才可以满足超过16K的限制。能不能提示一下哪有资料可以查查这方面?
(手册的内存映射那块我刚看过,还是不知道怎么去修改)
作者: strongchen    时间: 2006-1-4 15:42

你用的是什么芯片?现在的PRM文件是怎样的?
作者: nishui    时间: 2006-1-4 15:51

我用的是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,这个原因所致,但我不知道怎么修改才行,怎么才能充分利用内存。
作者: nishui    时间: 2006-1-5 08:35

请版主帮忙解答一下,怎么修改才能充分利用Rom空间,而不是限制在 0xC000 TO 0xFEFF这16K里面
作者: strongchen    时间: 2006-1-5 11:22

既然你已经将其他的ROM空间定义为OTHER_ROM,你可以用

#pragma CODE_SEG OTHER_ROM

的格式将非中断入口的函数放在OTHER_ROM里,这样就可以充分利用所有的ROM空间了。
作者: nishui    时间: 2006-1-5 12:06

问版主一个问题:在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等是怎么映射过去的?我该查哪部分资料呢
谢谢

作者: strongchen    时间: 2006-1-5 16:22

请参看《S12FTS64KV1.pdf》




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