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

询问编译错误:out of allocation space的错误

询问编译错误:out of allocation space的错误

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

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

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

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

问题是0xC000~0xFEFE之间的空间只有16K。看看你的ROM空间的分配。
海纳百川  有容乃大
谢谢版主,我已经发现了是那个原因造成的,但是我不知道怎么去修改,也就是不知道怎么改PRM文件才可以满足超过16K的限制。能不能提示一下哪有资料可以查查这方面?
(手册的内存映射那块我刚看过,还是不知道怎么去修改)
你用的是什么芯片?现在的PRM文件是怎样的?
海纳百川  有容乃大
我用的是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,这个原因所致,但我不知道怎么修改才行,怎么才能充分利用内存。
请版主帮忙解答一下,怎么修改才能充分利用Rom空间,而不是限制在 0xC000 TO 0xFEFF这16K里面
既然你已经将其他的ROM空间定义为OTHER_ROM,你可以用

#pragma CODE_SEG OTHER_ROM

的格式将非中断入口的函数放在OTHER_ROM里,这样就可以充分利用所有的ROM空间了。
海纳百川  有容乃大
问版主一个问题:在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等是怎么映射过去的?我该查哪部分资料呢
谢谢
请参看《S12FTS64KV1.pdf》
海纳百川  有容乃大
我用了数组  把它该小了就没有这种提示了
你用数组也解决不了你的根本问题啊,你用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

评分次数

  • yumuzi

返回列表