原创 C8051F在XDATA区初始化大量数据时需注意的问题

2013-8-1 13:23 4667 17 18 分类: 消费电子

由于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分出众多的内存区确实比较麻烦·!

 

文章评论1条评论)

登录后参与讨论

用户1505736 2013-9-2 08:54

和MSP430F5438这类大RAM的单片机类似,用C语言编译器最容易产生的问题,先关看门狗或者不对大RAM区初始化就好了。
相关推荐阅读
huhaomcu_856934054 2014-08-19 20:54
uCOS-Ⅱ
启动uCOS-Ⅱ的学习与移植!...
huhaomcu_856934054 2014-07-20 10:08
多通道电路原理图
简单说说关于Protel中提供的多通道原理绘制与PCB布局布线. Protel(不知99SE是否可以)有提供多通道电路原理图的设计,这项功能在有些方面还是很有用处的,比如说:当部分原理图在一张图...
huhaomcu_856934054 2014-04-07 09:10
IAR制作工程模板
我个人学习新的MCU过程一般会是如下过程,建立一个个的DEMO工程,每个DEMO工程学习一个外设,所以每个DEMO程序都很简单,但是在建立一个个DEMO程序的过程中,会发现开始的步骤基本上就是相同...
huhaomcu_856934054 2014-03-14 18:06
新公司与老公司的比较
在新公司上了几天班真心有点想念以前的老公司了! 下面来比较比较新公司与老公司吧: 1.业务量。新公司的项目更多,人员更多,涉及的面也较广,整体的技术水平要大大强于以前的老公司。以前老公司里...
huhaomcu_856934054 2014-02-24 15:01
辞职了!
辞职了,但愿柳暗花明又一村!!...
huhaomcu_856934054 2014-02-21 09:22
回来啦!
之前因为身体原因一直在家休息,直到今天才来武汉上班。但愿今年个人的工作能有所上升!...
我要评论
1
17
关闭 站长推荐上一条 /2 下一条