由于51内核的资源有限,所以在进行程序编写时常会出现下列内存区关键字,如XDATA,DATA,CODE,IDATA,PDATA等等,具体意思请参阅Keil相关帮助文档。
假如我们想在XDATA区初始化数组时,就可能会出现程序没有初始化之前是可以运行的,但初始化之后就不能运行了。这也是我遇到的一个问题,明明程序是对的,怎么就不能运行了呢?原因就是我在程序里在XDATA区初始化了128bytes的数组。有人可能觉得初始化128bytes的数组后程序怎么可能不会运行了呢?难道是超过了XDATA区的范围了吗?当初我也这么想过,于是在XDATA区声明了一个同样大小的数组但没有初始化值,但程序同样是能运行,这说明并不是超范围的原因,因为编译后的XDATA区的大小远小于DATASHEET中给出的大小,将这一数组换成关键字CODE后同样可以运行,一时间真是没有明白。经过上论坛求助,网友给出的说法是当你在程序开头时在XDATA区初始化大量数组时,由于XDATA区的寻址较慢而C8051F单片机的看门狗复位时间又较短,于是还没有初始化完成程序就已经复位了,同样经过调试器的帮助发现确实我的128个字节并没有全部初始化成功,只有一小部分是成功的,后部分是乱码,同样也验证了网友的这一说法,网友给出的解决方法是在51的启动文件STARTUP.A51中事先就将WDT关闭,由于很多人都忘记了51的汇编所以给出例子,在STARTUP.A51中需要加入的语句是STARTUP1:
EXTRN CODE(SysInit) // SysInit是主程序中的函数,里面应该关闭WDT。
CALL SysInit
通过这种方式就事先关闭了WDT,经过重新编译下载,程序正常运行。个人觉得51分出众多的内存区确实比较麻烦·!
用户1505736 2013-9-2 08:54