http://www.crystalradio.cn/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的模型都不行,实际烧写后运行正常,哎
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。