原创 C51热启动代码的编制

2010-2-24 00:59 2107 6 6 分类: MCU/ 嵌入式

C51热启动代码的编制<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


时间:2009-10-03 02:53:38  来源:我爱单片机  作者:


对于工业控制计算机,往往设有有看门狗电路,当看门狗动作,使计算机复位,这就是热启动。热启动时,一般不允许从头开始,这将导致现有的已测量到或计算到的值复位,导致系统工作异常。因而在程序必须判断是热启动还是冷启动,常用的方法是:确定某内存单位为标志位(0x7f位和0x7e),启动时首先读该内存单元的内容,如果它等于一个特定的值(例如两个内存单元的都是0xaa),就认为是热启动,否则就是冷启动,程序执行初始化部份,并将0xaa赋与这两个内存单元。


根据以上的设计思路,编程时,设置一个指针,让其指向特定的内存单元如0x7f,然后在程序中判断,程序如下:


void main()


{ char data *HotPoint=(char *)0x<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />7f;


if((*HotPoint==0xaa)&&(*(--HotPoint)==0xaa))


{ /*热启动的处理 */


}


else


{ HotPoint=0x7e; /*冷启动的处进


*HotPoint=0xaa;


*(++HotPoint)=0xaa;


}


/*正常工作代码*/


}


然而实际调试中发现,无论是热启动还是冷启动,开机后所有内存单元的值都被复位为0,当然也实现不了热启动的要求。这是为什么呢?原来,用C语言编程时,开机时执行的代码并非是从main()函数的第一句语句开始的,在main()函数的第一句语句执行前要先执行一段起始代码。正是这段代码执行了清零的工作。C编译程序提供了这段起始代码的源程序,名为CSTARTUP.A51,打开这个文件,可以看到如下代码:


IDATALEN EQU 80H ; the length of IDATA memory in bytes.


STARTUP1:


IF IDATALEN <> 0


MOV R0,#IDATALEN - 1


CLR A


IDATALOOP: MOV @R0,A


DJNZ R0,IDATALOOP


ENDIF


可见,在执行到判断是否热启动的代码之前,起始代码已将所有内存单元清零。如何解决这个问题呢?好在启动代码是可以更改的,方法是:修改startup.a51源文件,然后用编译程序所附带的a51.exe程序对 startup.a51编译,得到startup.obj文件,然后用这段代码代替原来的起始代码。具体步骤是(设C源程序名为HOTSTART.C):



  1. 修改startup.a51源文件(这个文件在C51LIB目录下)


  2. 执行如下命令:


  3. A51 startup.a51 得到startup.obj文件。将此文件拷入HOTSTART.C所在目录


  4. 将编好的C源程序用C51.EXE编译好,得到目标文件HOTSTART.OBJ


  5. L51 HOTSTART, STARTUP.OBJ 命令连接,得到绝对目标文件HOTSTART


  6. OHS51 HOTSTART 得到HOTSTART.HEX文件,即可。


对于startup.a51的修改,根据自已的需要进行,如将IDATALEN EQU 80H中的80H改为70H,就可以使6F7F16字节内存不被清零。


本文来自单片机开发网,转载请保留链接

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
6
关闭 站长推荐上一条 /3 下一条