查看原文
其他

看门狗你确定会用了?(经验干货满满)

bug菌 最后一个bug 2021-01-31

                   看门狗?

看门狗(watchdog)-字面上的意思就是一条看门的dog,如果一切正常dog就不回叫,如出现异常dog就会叫,并且把你逼到门外!
其实看门狗不是什么特殊的外设,一般我们叫看门狗也叫做看门狗定时器,其实他就是一个计数器,在使用看门狗得时候给其一个值,然后计数器从0开始不断的累计(根据计数方向),在计数器到达预设值的值之前我们可以重置看门狗,简称喂狗。那么如果我们程序没有及时喂狗,当计数器到达预设值值时便会复位芯片。
好了,看门狗知识就这么多!今天的文章就结束了吗?不是的,大家也可以看到下面还有很多内容,那我这里问大家一个问题:看门狗就是程序跑飞了没及时喂狗就复位了,程序重新运行,这样有什么意义?带着这个问题继续往下看。

                   看门狗分类

按照看门狗实现方式分为:硬件看门狗和软件看门狗。

硬件看门狗

  我们大部分单片机都会有看门狗这一个功能,不过有少数芯片没有,那些个时候我们想使用该功能我们就需要外扩对应的硬件看门狗芯片,比如MAX813等。

  大体工作方式:硬件看门狗芯片会有接收单片机的置位信号和控制单片机复位的引脚。单片机可以根据看门狗芯片信号需求,可以通过io口进行喂狗;如果程序异常,看门狗会由于收不到单片机给的信号而发出单片机复位信号给单片机,让单片机进行复位。

  (如果我们单片机存在watchdog其实也是实现类似的原理都属于硬件看门狗)


软件看门狗

  我们都知道看门狗其实就是一个定时器,不过当定时器到达系统就会复位,那么我们完全可以采用我们普通的定时器进行模拟。

  大体实现方式:定时器模拟,我们在主程序中喂狗,就可以对定时器进行计数器清零即可,当我们没有及时喂狗,会进入定时器中断,在中断中我们可以触发软件复位,或者通过程序跳转到程序入口处。

  软件watchdog的缺点是其本质上也是软件,可能当遇到中断无法触发的异常,复位MCU就会失效。

从依赖性角度:看门狗也可以分为独立看门狗和窗口看门狗,独立看门狗不受系统影响有自己内部独立的时钟源等,监控整个系统异常。而窗口看门狗主要是监控软件上的错误,且其时钟来源于控制器的时钟。下面重点讲讲窗口看门狗:

窗口看门狗

独立看门狗在0-重载值之间都可以进行喂狗操作,这样如果程序跑飞反复在喂狗,这样程序无法复位。所以就有了窗口看门狗,窗口看门狗存在喂狗窗口上限和下限​,喂狗只能在窗口里才能喂狗,其他时间喂狗都会复位。


                看门狗如何使用?

1)一定要注意并不是所有的系统都适合使用看门狗,比如说在我们的比较精密的控制系统,一旦我们程序除了一些小异常而导致芯片复位,可能会导致系统时续混乱而造成较大得设备损害!
2)对于看门狗一般用在,比如温控系统,显示系统等复位系统对整个系统影响不是很大的延时系统等!这样能够在系统异常后复位系统让系统继续运行。
3)对于部分MCU在看门狗复位之前会出发一个中断服务函数,给程序最后进行喂狗的机会。这个是系统给我们的机会,我们可以对当前MCU的状态进行保存等日志信息记录,供软件研发人员进行系统的分析。
4)同时对于喂狗每个人持有不同的态度,有些人认为需要在主程序中喂狗,有些则认为需要在中断里面喂狗;不过在中断里面喂狗存在一个问题是,对于MCU主程序处于死循环的时候,而我们的中断服务函数可以正常运行,这样无法出发看门狗复位。
所以常用做法是,通过中断置位相关标志位,然后主程序检测标志位进行喂狗操作,至于更加强大的看门狗机制,我们需要在实际的项目中根据需求来制定相关策略。
好了,今天的watchdog就讲这么多吧,这里是公众号“最后一个bug”,感谢大家的关注!我们下期见!

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存