Keil的ERROR L107:ADDRESS SPACE OVERFLOW问题

发布者:ByteChaser最新更新时间:2015-12-28 来源: eefocus关键字:Keil  ERROR 手机看文章 扫描二维码
随时随地手机看文章
ERROR L107: ADDRESS SPACE OVERFLOW问题原因分析及解决
 
用KEIL选用small模式编译一个程式时老时出错,信息如下。 
 
*** ERROR L107: ADDRESS SPACE OVERFLOW 
... ... 
Program Size: data=217.6 xdata=0 code=5314 
Target not created 
 
芯片我选的是AT89C52,RAM有256呀,怎么会OVERFLOW呢? 
但是如果编译模式选用Compact或large时就一切正常。 
... ... 
Program Size: data=110.6 xdata=111 code=5914 
"test" - 0 Error(s), 22 Warning(s). 
 
请大侠们指教! 
 
--------------------------------------------------------------- 
 
排开Keil编译器有问题,可以肯定是你的内存空间溢出了 
 
Keil 中关于 107 错误的描述是这样的: 
 
========================================= 
Error L107 (ADDRESS SPACE OVERFLOW) 
 
Summary    *** Error L107 
     ADDRESS SPACE OVERFLOW 
     SPACE: space-name 
     SEGMENT: segment-name 
Description    The specified segment cannot be located at the specified address space. The segment is ignored.   
========================================= 
 
如果你仍要坚持自己的观点,只能去问 keil 公司的 
 
 
前面有些兄弟的说法有二点是不确切的: 
①就是超过变量128后必须使用compact模式编译 
     实际的情况是只要编译指示data=xxx 不超过 256.0 就可以用 small 编译 
②128以上的某些地址为特殊寄存器使用,不能给程序用 
     特殊寄存器虽然使用重复的地址,但是用不同的指令访问,并不会占用RAM空间 
 
 
但 small 模式下未指存储类型的变量默认为data型,即直接寻址,只能访问低 128 个字节,但这 128 个字节也不是全为你程序所有,寄存器 R0-R7必须映射到低RAM,要占去 8 个字节,如果使用寄存组切换,占用的更多。 
 
所以你可以使用 data 区最大为 120 字节,超出 120 个字节则必须用 idata 显示的指定为间接寻址,另外堆栈至少要占用一个字节,所以你最多能使用 127 上字节(如果) 
 
就是说极限情况下你可以定义的变量可占 247 个字节 
当然,实际应用中堆栈为一个字节肯定是不够用的,但如果嵌套调用层数不深,有十几个字节也够有了,所以你的 217.6 个字节的占用量应该是可以满足的 
 
为了验上面的观点,写了个例子 
 
#define LEN 120 
data UCHAR tt1[LEN]; 
idata UCHAR tt2[127]; 
 
void main() 
     UCHAR i,j; 
 
     for(i = 0;   i < LEN; ++i ) 
     
         j = i; 
         tt1[j] = 0x55; 
     
 
可以计算 R0-7(8) + tt1(120) + tt2(127) + SP(1) 总共 256 个字节 
 
keil 编译的结果如下: 
Program Size: data=256.0 xdata=0 code=30 
creating hex file from ".DebugTest"... 
".DebugTest" - 0 Error(s), 0 Warning(s). 
(我的测试环境为 XP + Keil C 7.5) 
 
这段程序已经达到了内存分配的极限,再定义任何全局变量或将数组加大,编译都会报错 107,也就是跟你碰到的一样的错误信息 
 
这里就要引出一个问题:为什么变量 i、j 不计算在内? 
这是因为 i、j 是局部变量,编译器会试着将其优化到寄存器 Rx 或栈。问题也就在这了,如果局部变量过多中定义了局部数组,编译器无法将其优化,就必须使用 RAM 空间,虽然全局变量的分配经过精心计算没有超出使用范围,仍会产生内存溢出的错误! 
 
而编译器是否能成功的优化变量是根据你的代码来的 
上面的代码中,循环是臃肿的,变量 j 是完全不必要,那么将代码改成 
 
UCHAR i; 
UCHAR j; 
 
for(i = 0;   i < LEN; ++i ) 
     tt1[i] = 0x55; 
 
再编译看看,出错了吧! 
因为编译器不知道该如何使用 j,所以没能优化,j 须占 RAM 空间,RAM 就溢出了。(有些编译器会自动将这个无用的变量去掉,但这个不在讨论之列了) 
 
 
 
综上所述,我建议你重新审查你程序中的变量定义,或者将你的程序帖出来(不需要代码,只要变量定义部分,包括子程序) 
 
从你的两次编译提法来看,改为 compact 后有 111 个字节移到了 xdata,有个简单的方法就是打开你的输出文件夹中的 .M51 符号表文件,查找哪些变量被移到了 xdata,然后修改你的程序,在这些变量前加上 idata,再编译看看 
 
另外,对 idata 的定义的变量最好放在 data 变量之后 
 
对于这一种定义 
uchar c1; 
idata uchar c2; 
uchar c3; 
 
变量 c2 肯定会以间接寻址,但它有可以落在 data 区域,就浪费了一个可直接寻址的空间
关键字:Keil  ERROR 引用地址:Keil的ERROR L107:ADDRESS SPACE OVERFLOW问题

上一篇:单片机两个PIT中断不能同时运行的解决方法
下一篇:单片机学习之动态数码管

推荐阅读最新更新时间:2024-03-16 14:41

keil4中头文件路径设置的方法汇总
个人记录: 感觉相对路径比较方便。 keil是从project文件所在目录找头文件,头文件的相对目录是相对.uvproj文件的。 目前我的个人习惯是 建立:Doc、Listing、Output、Project、User几个文件夹 Doc放文档和readme Listing设置为配置中的清单选项卡输出文件夹 Output设置为输出文件夹 Project放建立的工程文件 User放自己写的.c和.h(这部分后期可能做更改) 还可以有OS等操作系统的文件夹。 在这种情况下,包含头文件用相对方式写的话就是类似于: #include ..Userallkeillibrary.h #include ..UserS
[单片机]
<font color='red'>keil</font>4中头文件路径设置的方法汇总
让Ultra Edit和Keil结合的更紧密
搞单片机的工程人员一般都喜欢用Ultra Edit编辑器,因为它可以把编程的语言关键字能够高亮彩色显示,还能够很好的支持中文。虽然keil也可以把关键字高亮彩色显示,但对中文的支持不是很好。另外,Ultra Edit编辑器与keil编辑器还有 感知 能力,当我们在其中的一个编辑器改变了编辑的内容再打开另一个编辑器的时候,就会出现一个提示窗口,提示我们编辑的内容已经被别的程序更改,是不是要重新加载?点击 是 后就会把被改变的内容重新加载上来。但是我们要打开两个窗口,要来回的切换,有时候感到很不方便,其实我们可以让它们更紧密的结合起来。 让Ultra Edi也具有编译能力 打开Ultra Edit,选择菜单 高级 的 项目工具配置 ,
[单片机]
单片机成长之路(51基础篇) - 018 keil51的STARTUP.A51
STARTUP.A51原始文件: 1 $NOMOD51;Ax51宏汇编器控制命令,禁止预定义的8051。使编译器不使能预定义的;8051符号,避免产生重复定义的错误。 2 ;------------------------------------------------------------------------------ 3 ; This file is part of the C51 Compiler package 4 ; Copyright (c) 1988-2005 Keil Elektronik GmbH and Keil Software, Inc. 5 ; Version 8.01 6 ;
[单片机]
KEIL下搭建基于 STM32 和 rt-thread 的开发环境
RT_thread开发人员是用MDK(Keil)进行开发管理的,当然也提供了IAR等开发环境的配置。针对初学者都提供了相关的教程和案例,不过项目开发,还是得讲究一下如何有效搭建开发环境和配置。 MDK(Keil)的安装和配置(破解)就略过了。能进行开发移植系统的程序员如果还不会最基础的开发环境搭建,那……去闭关修炼吧。 芯片选择:ST(意法半导体)-STM32F103ZE 原因: 开发必备。大多单片机爱好者,学习过程基本是:菜鸟52- 逐步深入stm32- 深度中毒ARM。 ST芯片应用广泛。ST的性价比(点赞)和高性能在各领域都发挥着重要作用(好用吖)。 ST开发容易。固件库和资料都很全,网上大把教程和学习板(
[单片机]
在<font color='red'>KEIL</font>下搭建基于 STM32 和 rt-thread 的开发环境
Keil C51 之LST文件,类似MDK.map文件
展开 Keil C51编译器在编译程序时,会生成一个扩展名为LST的列表文件,也被称为listing file。 这个文件包含了有关编译过程的丰富信息,该文件由多个段组成,其中Symbol Listing 和 Module Information两个段对于用户分析调试程序尤其有用,下面按照各个段在 listing file中出现的先后顺序加以说明: 一、页头段(Page Header) 每个lst文件都有一个包含了编译器版本号、源文件名称、日期、时间、页号的头部。示例: C51 COMPILER V7.20 MEASURE 10/01/2004 14:05:05 PAGE 1 二、命令段
[单片机]
JTAG error:can not read register while CPU is running
前言 本博文的代码用STM32CubeMX生成,MDK调试。 出现这个问题可能不止一种,所以下面我只列举几个解决办法,后续遇到问题再添加; 如有不足,多多指教; 解决办法 https://blog.csdn.net/a379039233/article/details/73742325 打开魔法棒,重新选择调试方式
[单片机]
JTAG <font color='red'>error</font>:can not read register while CPU is running
Keil5.15使用GCC编译器链接.a库文件
我们知道,当使用第三方的代码时,人家有可能会扔个Lib文件给你.这时候,别人只要提供header文件给你,则你就可以通过Lib文件及header的函数声明,对Lib中的函数进行调用.在Keil中如果使用ARMCC调用Lib文件,相信大家都能从网上找到方法.那如果在Keil中使用GCC来链接第三方GCC编译好的Lib文件—— .a 应该如何呢? 在告诉大家方法之前,我们写个简单的函数,然后用GCC编译器编译产生.a文件,便于我们进行测试. 首先,在Keil中配置gcc编译环境,这个可以参考我的文章. Keil5.15使用GCC编译器编译STM32工程,里面有交大家配置方法. 接下来,将工程配置成生成库方式.这个跟Keil ARMCC
[单片机]
<font color='red'>Keil</font>5.15使用GCC编译器链接.a库文件
Keil精确测量代码运行时间
在工程设置中“Debug”下,选右边硬件仿真,点下拉框选“J-LINK/J-TRACE”,再点“Setting” 在弹出窗口中“Debug”下,选“JTAG”或“SW”,在后面选好下载速率。 点到Trace”标签下,如果是选择的“SW” 则勾选“Enable”选项,在“Core”框中输入MCU实际工作时钟频率(就是单片机以什么频率来执行指令的,MDK会用它来计算时间),再勾选“Autodetect max SW0 Clock” 如果是选择的“JTAG”, 先勾选“Enable”,在“Core”中设好时钟频率,最后去掉刚才勾选的“Enable” 因为“JTAG”模式不支持“Trace”
[单片机]
<font color='red'>Keil</font>精确测量代码运行时间
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多每日新闻
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved