一种新的单片机“看门狗”电路软件设计方法

2006-05-07 15:49:37来源: 国外电子元器件

2 “看门狗”电路软件设计方法

    以往的“看门狗”电路复位指令(即“喂狗”)一般总是插入在主程序中,而且“喂狗”指令一般是脉冲式,可以连续用两条取反指令(如CPL P1.0)。这是因为一般情况下,程序跑飞或者陷入“死循环”时,中断功能可能不受影响,CPU仍能象正常运行时一样响应和执行中断子程序。这时如果中断子程序中插有“喂狗”指令,则“看门狗”定时器始终处于正常无溢出状态,无法对已经混乱的微机系统重新启动以投入正常运转状态。

    在主程序中适当插入“喂狗”指令,大多数场合的单片机系统都能够比较可靠地工作。但是有一种特殊情况,即中断响应功能已经失效,而主程序仍然能够正常运行,这时“看门狗”电路对恢复单片机系统正常工作时无能为力的。例如:当程序正在执行中断子程序时,系统突然受到强烈干扰,程序跑飞,而且PC指针刚好落在主程序的指令字节上,堆栈也不溢出,使主程序能够继续正常运行。这时“看门狗”的“喂狗”动作正常,而中断再也不法响应了。这时因为在MCS-51的中断系统中有两个不可寻址的优先级状态触发器,分别指标两级中断响应状态。当CPU响应中断时,首先置位相应的优先级状态触发器(该触发器能指出CPU正在处理的中断优先级别),这时会屏蔽掉同级别的所有中断申请,直到执行RETI指令时,才由CPU硬件清零该优先级状态触发器,从而使以后的中断请求能被正常地响应[3]。如果响应中断后而不执行RETI指令,那么同级别中断申请就不会被响应了。

    当然,象上述这种情况是比较少见的。大多数情况下,程序跑飞后都会使PC指针越出有效程序区,造成“死机”。这时“看门狗”就起作用了。在大多数系统中,中断子程序执行的时间占总运行时间的百分比都非常小,而在执行中断程序时,PC指针跑飞越过RETI指令,而主程序又能正常运行的机会就更少。但是如果中断子程序处理数据比较复杂或带有一些函数运算的功能时,则出现这种系统失常的情况就有可能发生了。以前,在笔者设计的智能流量计中就曾经出现过这种现象:键盘显示操作都正常,看起来不象“死机”,但是在设定参数时,数据位该内烁的不闪烁,总流量不会累计上去,显然是T0定时中断系统失效,而主程序仍然在运行,因为“喂狗”指令插在主程序中。那么,针对这种情形,有没有彻底解决的方法呢?“喂狗”指令直接插在中断子程序中是不合适的,而单独插在主程序中又显然是不够的。笔者通过仔细推敲后,将“喂狗”指令分解开来,取反指令变成置位和清零两种指令(即SETB P1.0和CLR P1.0),将置位指令插在主程序中,而将清零指令插在T0中断子程序中,这样将两者联系起来,缺一不可,无论主程序运行失效,还是T0中断请求失效,都不能完成完整的“喂狗”指令,造成“看门狗”动作,从而确保了系统安全可靠地工作。

    具体做法如下:

    ORG 0000H

    LJMP START

    ORG 000BH

    LJMP INTT0

    ……

    ORG 0030H

    START:MOV SP,#30H

    ……

    MAIN:NOP

    NOP

    SETB P1.0

    NOP

    NOP

    SETB EA

    NOP

    SETB ET0

    ……

    LJMP MAIN

    ……

    INTT0:NOP

    NOP

    CLR P1.0

    NOP

    NOP

    ……

    RETI

    这样,在整个用户程序中只唯一的一对指令(SETB P1.0及CLR P1.0)能使“看门狗”定时器复位。也就是说不会有任何“非法”的指令能使“看门狗”定时器误复位,致使系统已经“死机”而“看门狗”失效。当然,对对没有中断的用户系统,只需将清零指令(CLR P1.0)也插在主程序中就可以了;对于有多种中断的用户系统,如果没有中断嵌套,则清零指令(CLR P1.0)可以插在任一个中断子程序中,而在主程序中适当加入一些有关中断的冗余指令(如SETB ET0等),以免因有关中断的特殊功能寄存器数据受到干扰时导致中断功能失效;对于有二级中断嵌套的用户系统,清零指令(CLR P1.0)可以插在中断种数比较多的那一级中的任一个中断子程序中,插有“喂狗”指令的那一级中断系统将会受到“看门狗”的保护,而另一级中断系统如果失效,“看门狗”是“无动于衷”的,这时只能尽量减少这种中断子程序的执行时间以减少受到干扰的可能性。如果二级中断嵌套系统者受到“看门狗”的保护,就必需设计一个非常复杂的“看门狗”电路,其“喂狗”指令要由三部分来保证各个部分都能正常工作,需要说明的是,如果主程序运行一次的时间(包括可能被中断的时间)超过1.6秒,则要适当再插入一条SETB P1.0指令,而T0中断时间间隔是不能超过1.6秒的。

    另外,为了消除可能的“喂狗”误动作,建议对所应用的用户程序进行彻底仔细的检查,以防程序错乱时生成多余的SETB P1.0(指令码 D290H)或者CLR P1.0(指令码 C290H)指令。利用通用编程软件(如EDIT)的查找功能可搜索用户程序在LST文件中的“90”字符串,就能方便地找到所有可能的非法“SETB P1.0或CLR P1.0”指令,然后用NOP指令将其分离开来就可以了。如

    ROM地址 指令码 源程序

    ……

    0306 C2 MOV A,#0C2H

    0308 901000 MOV DPTR,#1000H

    ……

    B4D290 CJNE A,#0D2H,STEP1

    ……

    0401 B4D290 CJNE A,#0D2H,STEP1

    0494 00 STEP1:NOP

    ……

    可以修改为

    ……

    0306 74C2 MOV A,#0C2H

    0308 00 NOP

    0309 901000 MOV DPTR,#1000H

    ……

    0402 B4D291 CJNE A,#0D2H,STEP1

    0405 00 NOP

    ……

    0496 00 STEP1:NOP

    ……

    其它情况下可以灵活处理,以使其消除以上两种可以出错的组合即可。

    通过采取以上几种措施,对于没有二级中断嵌套的用户系统,能够绝对安全地受到监控而不会“死机”;对于有二级中断嵌套的用户系统,也可大大提高其可靠性。当然,一个单片机系统能够准确可靠地运行,除了不“死机”,还需保护数据免受干扰,这属于软件容错、数据冗余、系统重入等范畴,这里不作介绍。

编辑: 引用地址:http://www.eeworld.com.cn/designarticles/control/200605/1634.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。
论坛活动 E手掌握
微信扫一扫加关注
论坛活动 E手掌握
芯片资讯 锐利解读
微信扫一扫加关注
芯片资讯 锐利解读
推荐阅读
全部

小广播

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 安防电子 医疗电子 工业控制

北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2016 EEWORLD.com.cn, Inc. All rights reserved