开篇:润墨网以专业的文秘视角,为您筛选了一篇C51环境下W77E58Watchdog的应用范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!
摘 要:在单片机的应用中,逐步引入了高级语言,C语言就是其中一种。但是如果C语言应用不当很可能会引起单片机系统无法正常运行,重点介绍了利用c51作为编程语言在使用W77E58时,如果程序在定义全局变量或静态变量时进行了初始化会对Watchdog的复位产生的影响及其解决方法。
关键词:C51;Watchdog;W77E58
引言
W77E58是华邦公司设计的一片增强型MCS-51单片机,它的最高工作频率40MHZ,指令系统采用4个机器周期,具有3个16位定时器,12个中断,32KB flashEPROM程序空间,两个UART串口等特性。尤其适用于对存储器资源有一定要求和对软件运行速度有特别要求的场合,目前在工业控制中得到了广泛应用。单片机系统受干扰后,经常出现的问题是程序执行进入一种“跑飞”或“死机”状态,为此,可以采用Watchdog技术保持系统的正常运行。在W77E58已经集成了一个用户可编程的看门狗定成器,因此只要硬件接法正确,在软件设计中调用相应语句即可启动Watchdog。
C语言可以缩短开发周期,降低开发成本,而且开发出的系统易于维护、可靠性高、可移植性好,笔者编制程序使用的是C51。程序中开启使用watchdog定时器后,发现当看门狗定时器溢出引起系统复位后系统无法重新
开始正常运行,即复位后程序运行到main()函数之前一直在不停的复位,经过详细分析之后发现是由于在定义全局变量或静态变量时进行变量初始化使得初始化程序执行时间长于看门狗设置的最长时间引起的。
W77E58Watchdog简介
W77E58自带有看门狗定时器,此定时器是一个独立于CPU自行运行的定时器,系统可通过编程将其设置为系统监控器,时基发生器或事件定时器。该定时器基于一组分频器,对系统时钟频率进行分割。分频器输出可选,并决定溢出时间。溢出时,如果看门狗有效(且看门狗定时器打开),将引起系统复位,系统复位将使“飞掉”的程序重新恢复运行,以达到提高程序运行的可靠性。看门狗溢出中断以及看门狗复位可利用软件进行设置,将两者合并或分离(即看门狗定时器溢出并使系统复位以及看门狗定时器仅溢出而不引起系统复位)。
看门狗定时器先用RWT来启动,这保证看门狗定时器从一个确定的状态开始运行。RWT位用来启动看门狗定时器。该位会自动清零,就是说在软件向该位写入1后,系统会自动把该位清为0。将RWT设为1后,看门狗定时器会对时钟周期进行计数。超时时间由WDl和WD0位来决定(CKCON.7和CKCON.6)。超时时间到以后,WDIF位置位,之后看门狗定时器将等待512个时钟周期,如果EWT=1且在等待期间没有对RWT进行操作,那么512个时钟周期以后会产生看门狗定时器复位。这个复位会连续两个周期同时WTRF标志位置位,软件可以用此来判断是否是看门狗定时器复位。
表1给出了看门狗定时器的溢出值,对于不同的时钟频率,看门狗定时器就会产生不同的溢出时间。当使能看门狗定时器复位后,这个复位会在其溢出并经过512个时钟周期后结束。看门狗定时器在上电或掉电复位后,看门狗定时器复位不会关闭看门狗定时器,但会将其重新启动,软件应重新启动定时器把它放入一个确定的状态。
CPU使用W77E58,主程序由C语言开发的系统,最初在设计编制Watchdog定时器程序时发现开启Watchdog定时器后,当定时器溢出引起系统复位后系统无法重新开始正常运行,即复位后程序运行到main()函数之前一直在不停的复位。经过认真分析发现原来是在定义全局变量或静态变量时对这些变量进行初始化引起的。
问题产生的原因
用C语言编程时,系统复位Reset后所执行的第一个程序模块并不是使用者的主程序main(),而是一个隐藏在KEIL―C51标准程序库中称为startup.a51的程序模块。startup.a51的主要作用是将单片机内部所有RAM单元清零,接着startup.a51被执行的仍然是一个隐藏在KEIL-C51标准程序库中被称为init.a51的程序模块,init.a51的主要工作是初始化程序的全局变量或静态变量。完成上述初始化程序之后,才会开始执行main()程序。由前面的介绍可知看门狗定时器在上电或掉电复位后,看门狗定时器复位不会关闭看门狗定时器,即在系统热启动(看门狗或其他原因引起的复位)程序重新开始运行startup.a51、init.a51时,看门狗定时器仍在继续运行;由于运行startup.a51、init.a51花费的时间比较长,即使将看门狗定时器中断时间设置为最长,程序运行到main()程序之前看门狗定时器将溢出并引起系统复位。所以由热启动引起系统复位时,看门狗定时器在运行到main()函数之前将反复引起系统复位此时系统将无法进入main()程序运行。
问题解决的方法
针对上述情况W77E58C51编程环境下初始化程序执行时间长于看门狗设置的最长时间,如果想使watchdog正常运行下面提供了两种方法:
1.最简单的方法是在程序中定义全局变量和静态变量时不要对这些变量赋以初值,对这些变量的赋置可以放在程序中进行。这样系统复位(Reset)后程序在运行到main()函数之前只运行startup.a5l,运行startup.a51所占用的时间比较短,程序运行到main()函数时看门狗定时器将不溢出。当程序运行到main()函数时可以将main()的第一条语句写为“喂狗”(将看门狗定时器值复零)指令,这样可以确保热启动时看门狗定时器不溢出,系统得以正常运行。对于W77E58单片机来说其内部资源有限,程序代码空间为32K,如果程序量比较大,精简指令减少程序代码是非常有必要的,采用这种方法时程序代码中不包含有init.a51初始化程序全局变量或静态变量的代码,可以有效的缩减程序代码。
如果程序量比较少,为了简便在定义全局变量和静态变量时对这些变量进行了初始化,在这种情况下可以在将init.a51添加到项目程序中。Init.a51模块中包含有watchdog宏,在初始化程序执行时间长于看门狗设置的最长时间的时候可以设置这个宏,即在系统热启动程序重新运行到init.a51时,首先执行“喂狗”指令,这样可以确保程序在运行到main()之前看门狗不溢出,系统可以正常运行。
结语
在恶劣的现场环境下受到外部干扰,单片机系统会出现“死机”、程序“跑飞”等现象,Watchdog技术是恢复系统的有效方法之一。随着C语言在开发单片机系统中越来越广泛的被应用,确保C51环境下正常运行Watchdog也尤为重要。文中给出了使用W77E58作为系统CPU,在利用C语言编制程序时定义全局变量或静态变量时进行变量初始化对Watchdog的使用产生的影响及解决方法,当然利用C语言编程在使用其他CPU的Watchdog时也可以借鉴此种方法,利用这种方法可以保证Watchdog的正常运行,有效提高单片机系统运行的可靠性。