前言
在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:使用不同的存储器,将使程序执行效率不同,在编写程序时,最好指定变量的存储类型,这样将有利于提高程序执行效率。