说起看门狗这个名字还是蛮有趣的,它的作用就是在主人走神的时候咬他一口,把他咬醒。实际点来说,就是当MCU运行过程中,在某处进入了死循环,或者受到干扰造成PC指针指向了无程序区,都会导致程序没反应,按键失效,屏幕内容不变等问题。这时如果正确使用了看门狗,就会让PC指针复位,从头开始执行程序。
看门狗复位的应用技巧包括三个方面:
一: 判断是否需要使用。 如果要使用看门狗的话,需要做一些寄存器的配置,在程序区的某些地方也要加入喂狗指令来防止看门狗复位,有一定的工作量,所以用与不用需要考虑一下。能不使用看门狗的场合,要求是系统即使死机也问题不大,等待人过来断电复位即可的情况。但是这种情况已经很少了,所以绝大多数情况下看门狗都要加上。比如有温控功能的电热水器,假如电加热已经启动,但是系统死机了,温控失效,电加热也不会关闭,这时水温就会一直升高,直到水被蒸干,然后电加热损坏或引发火灾,或者人被开水烫伤。这时有看门狗复位,系统就会恢复正常,检测到温度够了,就会关闭电加热的。
二、保证看门狗工作正常。看门狗除了进行寄存器配置之外,喂狗函数的位置也很重要,没处理好就会发生不该复位时复位了,或改复位的时候没有复位,可能的原因是在可能出现的死循环里喂狗了。
三、保证看门狗复位时不会引起系统异常。能否做到这一点,是工程师水平高低的重要体现。单片机系统一般都是和某个外在的系统连接的,可以是机械系统,水系统,电气系统等,要保证单片机系统的复位不会造成这些外接系统的异常。主要的问题点在于单片机复位时IO口状态会改变为初始值,寄存器会复位,内存会清空。比如电梯,单片机发出一个向上的信号,于是轿厢开始向上,但是这时因为某种干扰,单片机死机触发看门狗复位,IO初始化为关闭,轿厢失去了向上信号,这时是让轿厢迅速下坠?还是单片机反应过来之后重新输出向上信号,又拉住了轿厢?工程师需要去思考并解决这些问题,做控制的人需要对安全性有充足的认识。
好了,前面是常规知识,下面讲一个有创意的技巧。基于软件复位的优势和必要性,我设计的软件一般会定时主动地进行自复位,目的是让变量清零,消除一些长时间运行可能造成的问题。这个功能有些型号的单片机提供了便利的设计,直接赋值给某个寄存器就可以立刻复位了,大部分芯片不支持这个功能。
那怎么办呢,这时可以活用看门狗功能, 就是通过一个标志来控制某个地方是否喂狗,软件想主动复位的时候,关闭标志,然后系统就不喂狗了。这样到了看门狗复位的时间,就会发生复位了。这里主要要处理好停止喂狗和看门狗复位之间的时间,可以进行一些变量保存,IO关闭等,目的是保证上面提到的第三点。