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的模型都不行,实际烧写后运行正常,哎
|
|
来自: 心不留意外尘 > 《ST driver》