分享

keil上ADDRESS SPACE OVERFLOW了

 心不留意外尘 2016-05-30
http://www./thread-455621-1-1.html
2013
如何解决keil 编译错误:address space overflow


A1:
是的,变量太多了。。。

如果51的话,把一些变量改成idata试试,尤其是大的数组。 因为256B的RAM中,有128在idata,有些STC的型号全部RAM都在idata定义的区域。




A2:

如果没有外部ram就只能用small

small,临时变量分配在data或idata区
compact,临时变量分配在pdata区
large,临时变量分配在xdata区

如果没有外部ram就只能用small...


缘由: 
一段读卡器的程序,生成的hex文件有点大,看到其中的有些处理其实不需要,
就想去掉
    switch(g_cCommand)
              {
                     case 0x0101:
                        ComSetBound();               break;
              /*下面的处理不需要,注释
                     case 0x0104:
                        ComGetHardModel();           break;
               */
                     case 0x0108:
                 ..................
              }
结果link出现这样的错误:    
*** ERROR L107: ADDRESS SPACE OVERFLOW
    SPACE:   DATA    
    SEGMENT: ?DT?PCDHALT?ISO14443A
    LENGTH:  0044H
Program Size: data=261.5 xdata=0 code=10089
Target not created

而不改动那段代码,则complied,link成功:
Program Size: data=193.5 xdata=0 code=10099
creating hex file from "T5310"...

问题:
1,为什么注释掉那一段case就出这种错误呢?
2,为什么注释掉那一段case显示的data使用量这么大呢?

回复:因为有函数没有调用,所以软件没办法分析调用关系

因而也就没办法使用内存覆盖技术来分配临时变量,从而内存不足.

如果你不要那个函数的话,连那个函数也注释掉。

-------
晚上调程序的时候,KEIL编译出现了ADDRESS SPACE OBERFLOW的问题,已经碰到两次了,上次没在意,以为程序太长,地址空间溢出了。
*** ERROR L107: ADDRESS SPACE OVERFLOW
    SPACE:   DATA    
    SEGMENT: _DATA_GROUP_
    LENGTH:  005DH
刚才百度了一下,看到一个网友在博客里面的文章,成功解决,原来不是data空间溢出的问题,而是我有些子程序定义了没调用,导致keil无法合理分配空间,从而溢出。



为了让这篇文章继续发挥光和热,原文转载如下:(非常十分以及及其感谢网友zoedigi!)
  
楼上的ddxixi的意见有误。首先,我说了我不能任意使用外部存贮空间,所以决不能让编译器将一些临时变量放入idata or xdata。
其次,data 空间可以达到256,见顶楼的第三例,data空间使用了197.4而决无错误。这是因为目前市面上大多数的MCU都提供了256的data空间。
那么我的错误出现在哪里呢?
这就是Keil的问题了。当编译失败时,它不能给出完整正确的报告。所以它给出的:
Program Size: data=126.3 xdata=582 code=12091
就是不可信的。实际上我的data空间已经远不止126.3了。
最后找到,我在多处定义了一个char buf[33];的字符串,而没有使用它。
结论就出来了:
1、Keil的错误报告不完整。
2、在Keil里最好不要留下定义而未使用的变量或函数,编译器无法合理的为之分配空间,而导致空间溢出。


A4
因为是在写以后要用的库函数,有很多没有用到的函数。
现在找到一个解决办法,提示有哪个函数是UNCALLED的就在主函数里CALL之而不是在库文件里一个个注释掉,看起来体积更大了,实际上反而能编译成功。
以后写具体程序时再进行裁剪




A5
原理上貌似也不难理解。因为计算机上的C编译器也默认不会删除没有被调用过的函数。当然视具体设置而定了,在某些设置下未被调用的函数可能像KEIL里一样引起警告。

印象中有时即使开启针对体积的优化那些死函数也不会被删除。好像是为保证语义正确什么的,一些看起来很明显的优化编译器即使开启优化选项也不会做,因为优化后可能导致难以发现的隐藏bug。这样说来keil因为uncalled函数警告也没有什么,重点在于它不能有效处理这些未调用的函数(也许还是自己keil设置的问题~~~)
本人所做电路一概没有套件!!!
 
A6 发表于 2013-9-29 21:35:04 |只看该作者

发现了更好的解决办法,在project—option for target \'target 1\'里面的target标签页里memory model里选择large **** xdata,这样子编译时能通过,但是仿真用AT89C51和AT89C52的模型都不行,实际烧写后运行正常,哎

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多