看门狗分和 软件看门狗。硬件看门狗是利用一个定时器电路,其定时输出连接到电路的复位端,程序在一定时间范围内对定时器清零(俗称“喂狗”),因此程序正常工作时, 定时器总不能溢出,也就不能产生复位信号。如果程序出现故障,不在定时周期内复位看门狗,就使得看门狗定时器溢出产生复位信号并重启系统。软件看门狗原理 上一样,只是将硬件电路上的定时器用处理器的内部定时器代替,这样可以简化硬件电路设计,但在可靠性方面不如硬件定时器,比如系统内部定时器自身发生故障 就无法检测到。当然也有通过双定时器相互监视,这不仅加大系统开销,也不能解决全部问题,比如中断系统故障导致定时器中断失效。

看门狗本身不是用来解决系统出现的问题,在调试过程中发现的故障应该要查改设计本身的错误。加入看门狗目的是对一些程序潜在错误和恶劣环 境干扰等因素导致系统死机而在无人干预情况下自动恢复系统正常工作状态。看门狗也不能完全避免故障造成的损失,毕竟从发现故障到系统复位恢复正常这段时间 内怠工。同时一些系统也需要复位前保护现场数据,重启后恢复现场数据,这可能也需要一笔软硬件的开销。

图1:(a)看门狗示意图;(b) 相应的看门狗复位逻辑图。

在单任务系统中看门狗工作原理如上所述,容易实现。在多任务系统中情况稍为复杂。假如每个任务都像单任务系统那么做,如图1(a)所示,只要有一个 任务正常工作并定期“喂狗”,看门狗定时器就不会溢出。除非所有的任务都故障,才能使得看门狗定时器溢出而复位,如图1(b)。

而往往我们需要的是只要有一个任务故障,系统就要求复位。或者选择几个关键的任务接受监视,只要一个任务出问题系统就要求复位,如图2(a)所示,相应的看门狗复位逻辑如图2(b)所示。

在多任务系统中通过创建一个监视任务TaskMonitor,它的优先级高于被监视的任务群Task1、Task2...Taskn。 TaskMonitor在Task1~Taskn正常工作情况下,一定时间内对硬件看门狗定时器清零。如果被监视任务群有一个Task_x出现故 障,TaskMonitor就不对看门狗定时器清零,也就达到被监视任务出现故障时系统自动重启的目的。另外任务TaskMonitor自身出故障时,也 不能及时对看门狗定时器清零,看门狗也能自动复位重启。接下来需要解决一个问题是:监视任务如何有效监视被监视的任务群。

图2:(a) 多任务系统看门狗示意图;(b) 正确的看门狗复位逻辑图。

在TaskMonitor中定义一组结构体来模拟看门狗定时器组,

typedef struct

{

UINT32 CurCnt, LastCnt;

BOOL RunState;

int taskID;

} STRUCT_WATCH_DOG;

该结构体包括被监视的任务号taskID,用来模拟“喂狗”的变量CurCnt、LastCnt(具体含义见下文),看门狗状态标志RunState用来控制当前任务是否接受监视。

被监视的任务Task1~Taskn调用自定义函数CreateWatchDog(int taskid)来创建看门狗,被监视任务一段时间内要求“喂狗”,调用ResetWatchDog(int taskid),这个“喂狗”动作实质就是对看门狗定时器结构体中的变量CurCnt加1操作。TaskMonitor大部分时间处于延时状态,假设硬件 看门狗定时是2秒,监视任务可以延时1.5秒,接着对创建的看门狗定时器组一一检验,延时前保存CurCnt的当前值到LastCnt,延时后比较 CurCnt与LastCnt是否相等,都不相等系统才是正常的。需要注意的是CurCnt和LastCnt数据字节数太小,而“喂狗”过于频繁,可能出 现CurCnt加1操作达到一个循环而与LastCnt相等。

如果有任意一组的CurCnt等于LastCnt,认为对应接受监视的任务没有“喂狗”动作,也就检测到该任务出现故障需要重启,这时候 TaskMonitor不对硬件看门狗定时器清零,或者延时很长的时间,比如10秒,足以使得系统重启。反之,系统正常,Task1~Taskn定期对 TaskMonitor“喂狗”,TaskMonitor又定期对硬件看门狗“喂狗”,系统就得不到复位。还有一点,被监视任务可以通过调用 PauseWatchDog(int taskid)来取消对应的看门狗,实际上就是对STRUCT_WATCH_DOG结构体中的RunState操作,该标志体现看门狗有效与否。

这种方式可监视的最大任务数由STRUCT_WATCH_DOG结构数据的个数决定。程序中应该有一个变量记录当前已创建的看门狗数,判断被监视任务Task1~Taskn是否“喂狗”只需比较CurCnt与LastCnt的值n次。

图3:系统复位逻辑图。

硬件看门狗监视TaskMonitor任务,TaskMonitor任务又监视其他的被监视任务Task1~Taskn,形成这样一种链条。这种方 式系统的故障图表示如图3所示。被监视任务Task1~Taskn及TaskMonitor都是或的关系,因此被监视的任一任务发生故障,硬件电路看门狗 就能复位。

为实现多任务系统的看门狗监视功能额外增加了TaskMonitor任务,这个任务占用执行时间多少也是一个重要问题。假设 TaskMonitor任务一个监视周期延时1.5秒,此外需要执行保存当前计数值,判断是否“喂狗”等语句,它的CPU占用时间是很小的。用一个具体的 试验证实,使用50M工作频率的CPU(S3C4510),移植vxWorks操作系统,cache不使能条件下监视10个任务,每个监视周期占用 220~240微秒。可见该任务绝大多数时间都处于任务延时状态。

被监视任务可能有获取消息、等待一个信号量等的语句,往往这个消息、信号量的等待是无限期的等待。这就需要将这类语句作一些修改。比如在vxWorks中将一次无期限的获取信号量操作

semTake(semID, WAIT_FOREVER); // WAIT_FOREVER为无限时间等待

分解为

do

{

ResetWatchDog; // “喂狗”操作

}while(semTake(semID, sysClkRateGet( )) != OK); // 1s内的等待信号量操作

多次的时间范围内的获取信号量操作,这样才能保证及时“喂狗”。

另外需要注意的是系统中是否有的任务优先级比TaskMonitor高并且长时间处于执行状态,TaskMonitor长时间得不到调度,使得看门狗错误复位。良好的任务划分,配置是不应该出现这种高优先级任务长期执行状况的。

PS:

第二种,方案

小弟在uClinux的应用中需要同时启动5个进程,并行运行,且工作环境比较恶劣。为保证系统能够在无人职守的情况下运行正常(至少要保证某个进程出现 问题时系统能够自动重启这几个进程,有严重问题进程重启失败时,整个系统能够自动重新启动),我使用了一个软看门狗机制,其工作机制如下:

系统启动时自动启动一个后台监控进程,由后台进程启动5个功能进程。后台监控进程负责清除硬件看门狗和监控各个功能进程通过FIFO发过来的注册信息(注 册信息中带有系统时间time),如果某个进程超过10s没有新的注册信息到,则监控进程认为此功能进程已经出现问题,它将终止所有功能进程,重新启动各 个进程。如果重新启动功能进程失败,则监控进程将停止喂狗,让整个系统重新启动。

各个功能进程中每个处理周期都要通过FIFO向后台监控进程发送注册信息。由于进程都是信号唤醒的,因而各个功能进程中都使用定时器信号SIGALRM唤醒进程(一般定时2s),并在信号句柄中设置标志,由进程判断此标志并进行注册。

在实际应用中测试发现,有时候会出现进程超时未注册的情况,但检查进程源代码并没有发现问题,系统的心跳时间是10ms,正常情况下应该不会出现注册超时的现象啊?是我的处理机制有问题吗?这种情况下有更好的监控机制吗?

linux需要看门狗喂狗程序,多任务看门狗, 喂狗方法相关推荐

  1. Linux系统中创建C语言程序文件并编译执行的方法

    使用vim编辑器创建并编辑C语言源程序文件           执行命令"vim button_led.c"打开Button_Led目录下button_led.c源程序文件并进行编 ...

  2. linux 喂狗时间,看门狗喂狗时间及程序

    什么是看门狗定时器 看门狗定时器(WDT,Watch Dog TImer)是单片机的一个组成部分,它实际上是一个计数器,一般给看门狗一个数字,程序开始运行后看门狗开始倒计数.如果程序运行正常,过一段时 ...

  3. linux看门狗树莓派,给树莓派安装看门狗

    你还在担心树莓派死机吗?给他装个看门狗吧! 什么是看门狗程序? 看门狗程序就是一个健康监控程序,每间隔一定时间(默认10秒)检查一次是否在设定的健康工作范围内,如果超过即启动硬件复位程序,让设备重新启 ...

  4. 多任务看门狗, 喂狗方法

    看门狗分硬件看门狗和 软件看门狗.硬件看门狗是利用一个定时器电路,其定时输出连接到电路的复位端,程序在一定时间范围内对定时器清零(俗称"喂狗"),因此程序正常工作时, 定时器总不能 ...

  5. c语言软件看门狗程序,X25045看门狗电路硬件连接图及C语言看门狗程序

    采用89C51单片机和X25045组成的看门狗电路,X25045硬件连接图如图2所示.X25045芯片内包含有一个看门狗定时器,可通过软件预置系统的监控时间.在看门狗定时器预置的时间内若没有总线活动, ...

  6. 看门狗子程序 c语言,X25045看门狗电路硬件连接图及C语言看门狗程序

    采用89C51单片机和X25045组成的看门狗电路,X25045硬件连接图如图2所示.X25045芯片内包含有一个看门狗定时器,可通过软件预置系统的监控时间.在看门狗定时器预置的时间内若没有总线活动, ...

  7. stm32看门狗_STM32单片机:独立看门狗、窗口看门狗的配置

    SATM32单片机的看门狗有独立看门狗和窗口看门狗之分,这两者的工作原理却完全不同,今天来看一下他们的具体区别和配置方法.▍STM32独立看门狗由专门的低速时钟(LSI)驱动,即便是主时钟发生故障它仍 ...

  8. 一款好玩的关联微信运动的云遛狗微信小程序

    一款好玩的关联微信运动的云遛狗微信小程序 superpet_dog 介绍 微信小程序搜索 "汪汪旺旺旺" 进行体验. ​ 使用微信小程序云开发技术,开发的一款好玩的小程序.关联微信 ...

  9. 程序员每天累成狗,是为了什么

    HI,想我了吗 了吗 了吗?自从上次情人节一别,我已经接近20天没更新文章了. 至于原因:是,办点其他私事,这一段压根没怎么联网,所以不太好意思,我也很想你们了.大家也不要问为什吗,辣么帅的人有什么事 ...

最新文章

  1. 10大常见的安全漏洞!你知道吗?
  2. 学习excel的使用技巧一空格替换为0
  3. 如何把你的搜索引擎也加入到Firefox中
  4. JS中的this的应用总结
  5. VCG(VisualCodeGrepper)安装使用教程
  6. VTK:vtkBoxWidget用法实战
  7. boost::callable_traits的is_reference_member的测试程序
  8. Apollo进阶课程㉙丨Apollo控制技术详解——控制器的类型
  9. 两种DIV水平居中的方法
  10. Docker入门之运行原理及常用命令
  11. GitHub 车牌检测识别项目调研
  12. 图像处理基础(2):自适应中值滤波器(基于OpenCV实现)
  13. 堆栈平衡(子程序调用)
  14. 中国银行网点全集数据
  15. Win10 + Ubuntu 安装教程(痛苦踩坑)
  16. python作排产计划_排产计划表
  17. MFC ListCtrl的cheek框的全选和反选
  18. Ubuntu18.04平台下用GitHub搭建个人博客(含域名绑定和更换主题)
  19. 2021年电工(初级)报名考试及电工(初级)理论考试
  20. 邻接矩阵与拉普拉斯矩阵

热门文章

  1. 大三老学姨想说。。。
  2. 串的一些基础操作(c语言)~DS笔记⑤
  3. 九、python学习之HTTP协议
  4. 串行外设接口(Serial Peripheral Interface, SPI)逻辑设计部分 - spi_slave
  5. linux 下载文件到本地
  6. 气候变化如何影响致命的龙卷风?
  7. 论文阅读《PatchMatch Stereo - Stereo Matching with Slanted Support Windows》(PMS-双目立体匹配)
  8. MySQL启动服务提示:某些服务在未由其他服务或程序使用时将自动停止
  9. Hello, World! 发明者布莱恩·W.克尼汉的传奇人生
  10. 笔记本电脑如何选购并安装内存条