关于KEIL5编译出现“Target not createt”全系列解决办法——情况2:程序溢出错误 ERROR: PUBLIC REFERS TO IGNORED SEGMEN

前言

在KEIL5编程,往往遇到许多“Target not createt”,即目标不能实现这类情况。由此为帮助大家解决这些问题特开此贴。

目录如下:

1、2K字节限制错误 ERROR:RESTRICTED VERSION WITH 0800H BYTE CODE SIZE LIMIT 或者 ADDRESS SPACE OVERFLOW

     直达链接:https://blog.csdn.net/SumubeiFZ/article/details/125344372

2、程序溢出错误 ERROR: PUBLIC REFERS TO IGNORED SEGMEN

      直达链接:https://blog.csdn.net/SumubeiFZ/article/details/125346305

一、问题产生

当编译出现如上情况时候,其实是由于地址空间溢出

这其实是因为(默认配置下)系统会将变量分配到data空间,即内部RAM空间,大小取决于你所选用的单片机。如果你定义了太多的函数及变量,超出了地址空间,导致有些变量或者函数没有空间定义了。

二、解决办法:

解决的核心是使用其他的空间进行存储实变量及函数。有以下两种方法:

1、代码上直接将变量存储到其他存储器

(1)使用默认存储区的示例:

int a;

上述代码中:若KEIL的Target中默认设置为data存储区,则直接存入data存储区。

(2)使用指定存储器区:

int xdata b;

int pdata c;

int code temp[]={0, 0, 0, 0, 0, 0};

上述代码中:指定了变量的存储区,则变量b直接存入xdata外部存储区,变量c直接存入pdata外部存储区,数组temp 直接存入了code程序存储区

PS:外部存储区可读可修改,code程序存储区数据不可被修改。

        当然若将数据存入外部存储器,将会降低程序运行的速度。

2、修改默认存储区

(1)首先,打开 Options for target ,如图所示。

(2)然后在 Target 里修改存储的空间,其中有以下三项:

  • 内部存储区DATA:内部RAM,固定指前面0x00~0x7f的128个RAM,可以用acc直接读写的,速度最快,生成的代码也最小。
  • 外部扩展区XDATA:外部扩展RAM,一般指外部0x0000~0xffff空间,用DPTR访问。这里推荐使用该存储区。
  • 外部存储区PDATA:外部扩展RAM的低256个字节,地址出现在A0-A7上时读写,用movx ACC,@Rx读写。这个比较特殊,而且C51好像对此有BUG,建议少用。

 

 这里建议改为XDATA。

但是由于代码量实在过大,也会超出XDATA的存储范围,导致编译不能实现。因此建议使用第一种方法自行定义变量存储区。

当然这里有点是要注意的。自己的Code Rom Size是否设置正确,可自行参考自己的单片手册。

如果设置不正确也会导致编译无法实现。

PS:使用不同的存储器,将使程序执行效率不同,在编写程序时,最好指定变量的存储类型,这样将有利于提高程序执行效率。

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值