转 网上 相同 的 错误 !!!
近日编译一个程序出现下面的问题(我选择的Memory Model是Small,因为我的RAM空间有限)编译后,会报如下的错:
*** ERROR L107: ADDRESS SPACE OVERFLOW
SPACE: DATA
SEGMENT: _DATA_GROUP_
LENGTH: 005DH
Program Size: data=126.3 xdata=582 code=12091
BL51 BANKED LINKER/LOCATER V4.23
最后才知道,因为data只能是Ram中的前128个,变量超过128个时会出现ADDRESS SPACE OVERFLOW!
把有些变量声明成idata 或xdata就可以
下面是相关网上的东西:
******************************************************************
这个问题本已解决几周了,后来想想,本着相学见长的原则,把我的除错经验写一下,也方便其他初学者。
楼上的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里最好不要留下定义而未使用的变量或函数,编译器无法合理的为之分配空间,而导致空间溢出。