软件:Keil C51 C51V961版本
电脑:Win10
报错提示:
compiling System.c... linking... *** ERROR L107: ADDRESS SPACE OVERFLOW SPACE: DATA SEGMENT: ?DT?LCD LENGTH: 0034H Program Size: data=174.0 xdata=17 code=1205 Target not created. Build Time Elapsed: 00:00:03
解决办法:
将以下代码放在.c
文件中。
xdata unsigned char LCD_SEG[SEGSIZE] _at_ 0x500; // LCD显示地址 指定位置为0x500//时间/频率/电压显示 // 0 1 2 3 4 5 6 7 8 9
static volatile unsigned char Disp_Code[]={0xf5,0x05,0xd3,0x97,0x27,0xb6,0xf6,0x15,0xf7,0xb7,// 不带小数点显示
0xfd,0x0d,0xdb,0x9f,0x2f,0xbe,0xfe,0x1d,0xff,0xbf // 带小数点显示
};//显示数字译码//功率显示 // 0 1 2 3 4 5 6 7 8 9
static volatile unsigned char DispPower_Code[]={0xfd,0x85,0xdb,0x9f,0xa7,0xbe,0xfe,0x95,0xff,0xbf};// 数字译码 "POWER" ":" "."这几个符号常亮
原因分析:报错之前是因为将此段代码放在.h
文件中。
追问:为什么这段代码放在.C
文件就不会报错,放在.H
文件就会报错ERROR L107: ADDRESS SPACE OVERFLOW
???
问题分析
错误 L107: ADDRESS SPACE OVERFLOW
通常表明数据段 (DATA
空间) 溢出。当这段代码放在 .c
文件中时,编译器只会在该文件中分配内存空间。而当这段代码放在 .h
文件中,并在多个 .c
文件中包含时,会导致每个包含该头文件的 .c
文件都试图分配这些变量的内存,造成重复分配和内存溢出。
解决方法
要解决这个问题,需要确保这些变量只被定义一次,并且所有包含该头文件的 .c
文件都能访问它们。
1. 使用 extern
关键字
可以在头文件中声明这些变量,而在一个 .c
文件中定义它们。这会确保这些变量只在一个地方被定义,并且可以在多个文件中使用。
在头文件中声明:
// dispower.h
#ifndef DISPOWER_H
#define DISPOWER_Hextern xdata unsigned char LCD_SEG[SEGSIZE]; // LCD显示地址 指定位置为0x500
extern const unsigned char Disp_Code[]; // 显示数字译码
extern const unsigned char DispPower_Code[]; // 功率显示数字译码#endif // DISPOWER_H
在一个 .c
文件中定义:
// dispower.c
#include "dispower.h"xdata unsigned char LCD_SEG[SEGSIZE] _at_ 0x500; // LCD显示地址 指定位置为0x500const unsigned char Disp_Code[] = {0xf5, 0x05, 0xd3, 0x97, 0x27, 0xb6, 0xf6, 0x15, 0xf7, 0xb7, // 不带小数点显示0xfd, 0x0d, 0xdb, 0x9f, 0x2f, 0xbe, 0xfe, 0x1d, 0xff, 0xbf // 带小数点显示
}; // 显示数字译码const unsigned char DispPower_Code[] = {0xfd, 0x85, 0xdb, 0x9f, 0xa7, 0xbe, 0xfe, 0x95, 0xff, 0xbf // 数字译码 "POWER" ":" "."这几个符号常亮
}; // 功率显示
为什么 const
关键字?
将 Disp_Code
和 DispPower_Code
声明为 const
可以将它们放入只读内存(通常是代码空间),这不仅节省了 DATA
或 XDATA
空间,还避免了误修改。这也是一种优化策略。
通过这种方式,可以确保这些变量只被定义一次,并且可以在其他文件中访问,从而避免 ADDRESS SPACE OVERFLOW
错误。