最近需要在板子上加上一块WatchDog,以确保在系统出错时自动重启,所以看了一些在嵌入式系统中使用看门狗的资料,现在总结如下:

一、看门狗原理
    在产品化的嵌入式系统中,为了使系统在异常情况下能自动复位,一般都需要引入看门狗。
    看门狗其实就是一个可以在一定时间内被复位的计数器。当看门狗启动后,计数器开始自动计数,经过一定时间,如果没有被复位,计数器溢出就会对CPU产生一个复位信号使系统重启(俗称“被狗咬”)。系统正常运行时,需要在看门狗允许的时间间隔内对看门狗计数器清零(俗称“喂狗”),不让复位信号产生。如果系统不出问题,程序保证按时“喂狗”,一旦程序跑飞,没有“喂狗”,系统“被咬”复位。
    这就好比你的身边有一只时刻饥饿的狗,你不按时给它肉吃,它就会吃你的肉,你被吃了......挂了,投胎转世,彻底重新做人了。不幸的是来世你还得喂狗-_-!!

二、看门狗的种类
    在现在的嵌入式系统中主要可以分为两种类型的看门狗:
    1、CPU内部自带的看门狗:此类看门狗一般是将一个芯片中的定时器来作为看门狗,通过程序的初始化,写入初值,设定溢出时间,并启动定时器。程序按时对定时器赋初值(或复位),以免被咬。这种看门狗是可以被禁用的(只要停止这个定时器即可),好比对那只要咬你的狗来个“葵花点穴手”。大部分CPU都内置看门狗,硬件原理可参考各芯片数据手册。
   优点:可以通过程序改变溢出时间;可以随时禁用
   缺点:需要初始化;如果程序在初始化、启动完成前跑飞或在禁用后跑飞,看门狗就无法复位系统,这样看门狗的作用就没有了,系统恢复能力降低。

 2、独立的看门狗芯片:这种看门狗主要有一个用于喂狗的引脚(一般与CPU的GPIO相连)和一个复位引脚(与系统的RESET引脚相连),如果没有在一定时间内改变喂狗脚的电平,复位引脚就会改变状态复位CPU。此类看门狗一上电就开始工作,无法禁用。现在常用的芯片有:CAT705/CAT706、IMP706等等,溢出时间在1.6秒左右。 硬件原理可以参考各芯片数据手册和《基于Linux的嵌入式系统全程喂狗策略》。
  优点:无须配置,上电即用。无法禁用,系统必须按时喂狗,系统恢复能力高。
  缺点:无法灵活配置溢出时间,无法禁用,灵活性降低。

------------------------------------------------

  1. 当然还有所谓的软件看门狗,这其实是也是一种监控软件。
  2. 一些重要的程序,必须让它一直跑着;而且还要时时关心它的状态——不能让它出现死锁现象。(当然,如果一个主程序会出现死锁,肯定是设计或者编程上的失误。首要做的事是Debug。)但如果时间紧迫可以用软件看门狗,暂时应急。
  3. 这种监控软件运行不出现界面窗口,具有一定的隐蔽性;它定时判断目标进程是否运行在当前系统中,如果没有则启动目标进程;判断目标进程是否“无响应”,如果是则终止目标进程;如果目标进程“无响应”的次数超过一定的数量,则重启整个系统。它的目的也是复位,但是它主要市复位进程,实在不行才复位CPU。
  4. 这种软件属于监控软件,不在本文的叙述范围之内。

------------------------------------------------ 
三、看门狗的选择
     在一般的民用产品,对系统的稳定性没有太高要求的场合,可以使用内置看门狗,可以简化软件开发和硬件成本。
    在工控产品和对系统的稳定性有较高要求的关键场合,基本都选用硬件独立看门狗,确保系统在面对严重错误时的恢复能力。增加了硬件成本,稍微加大了软件的开发难度(必须确保在正常情况下的不断喂狗)。

----------------------------------------------------------
四、在bootloader下的使用
   如果是CPU内置的看门狗,一般在这阶段可以禁用,所有没什么特殊的操作。
但是如果是独立的看门狗芯片就必须喂了。或者为了保险,你在bootloader中就启动了看门狗,也得喂了。
   bootloader有很多,基本原理都是一样的,喂狗的过程也基本一样,在这里以uboot为例讲解如何喂狗。
u-boot的运行分为以下几个阶段:

  1. 最早的简单初始化,代码重定位的自拷贝阶段
  2. 系统详细初始化阶段
  3. 控制台阶段(如果使用了自动启动,则跳过)
  4. OS内核拷贝(可能带有解压过程),跳入操作系统

(待完善)

五、在Linux下使用
     在bootloader加载了内核之后,系统就开始由Linux内核接管。而喂狗的工作自然也开始由内核来承担。在bootloader将控制权给内核之后,时间上可以分为以下几个部分:

  1. 内核自解压阶段(压缩内核才有:zImage或bzImage)
  2. 内核启动到看门狗驱动加载之前
  3. 看门狗驱动加载后到根文件系统启动前
  4. 根文件系统启动后到看门狗守护进程启动前
  5. 看门狗守护进程启动后

对于使用CPU内置的看门狗,在1~4阶段,看门狗一般都没有启动,无需喂狗。只有在看门狗守护进程启动后,由守护进程打开看门狗,并根据配置文件监控其他进程的状态来开始喂狗。如果被监控进程出现不可修复的问题,守护进程停止喂狗,CPU复位。

对于独立的看门狗芯片,系统一上电就必须不断喂狗,接过bootloader的接力棒继续喂狗。
    首先在第1阶段,内核的自解压一般时间较长,必须在自解压的循环过程中加入喂狗代码(可能还要是汇编形式的)。一旦在这过程中跑飞,就不会喂狗,CPU复位。

在第2阶段,这段时间一般不会很长,可以不用喂狗。但是这也和你的内核有关,如果在这个阶段正好有比较耗时的模块启动的话,你可以在这个模块的初始化函数或者比较耗时的循环和等待中添加喂狗代码。具体在哪些模块中加,要尝试启动几次就知道了,靠实验和经验。

在看门狗驱动加载时,一般会在模块初始化代码中喂一次狗。

在第3阶段,和第2阶段类似,如果在这个阶段正好有比较耗时的模块启动的话,你可以在这个模块的初始化函数或者比较耗时的循环和等待中添加喂狗代码。但是在根文集系统挂载时,根据文件系统的性质和大小,可能需要在文件系统代码中添加喂狗指令。

第4阶段是一个比较耗时的阶段,一般会在系统启动脚本中添加一些简单的喂狗的shell命令,例如:“echo V > /dev/watchdog”,加的位置根据系统的启动过程而异。

在第5阶段,一切都由看门狗守护进程来实现喂狗了。

-----------------------------------------------------------------------------

内核看门狗的框架分析

(待续)

------------------------------------------------------------------------------

其实对于看门狗在Linux系统中的使用还有一种形式是双狗:

在内核中用内核线程硬件的看门狗,这个硬件看门狗的作用在于保证内核宕机时可以复位。

在内核产生软件看门狗,用守护进程或者需要监控的进程去喂狗,这个看门狗保证关键进程可以复位。

嵌入式系统中看门狗的使用相关推荐

  1. 嵌入式系统中看门狗概述。。。

    一直以来对于嵌入式中的watch dog(看门狗)都比较陌生,一直都不知道它到底是做什么的,单从名字上看也不知其所以然,然后就在网上找到了一篇blog,就是再说看门狗的作用和概述,原文如下: 1.概述 ...

  2. 看门狗(Watch Dog)是嵌入式系统中一种常用的保证系统可靠性的技术,()会产生看门狗中断。【详细!小白也能看懂!】

    看门狗(Watch Dog)是嵌入式系统中一种常用的保证系统可靠性的技术,()会产生看门狗中断. A. 软件喂狗 B. 处理器温度过高 C. 外部中断 D. 看门狗定时器超时 解析: 思考方式: 每个 ...

  3. [看门狗]基于Linux的嵌入式系统全程喂狗策略

    https://www.cnblogs.com/aaronLinux/p/8073898.html https://github.com/aaronRong [看门狗]基于Linux的嵌入式系统全程喂 ...

  4. RTOS 系统篇-看门狗 WatchDog 2

    RTOS 系统篇-看门狗 WatchDog 2 概述 上一节在 RTOS 系统篇-看门狗 WatchDog[不喂狗就咬你] 讲解了 看门狗的基本原理,以及任务.中断中触发看门狗的原因.解决方法. 本小 ...

  5. RTOS 系统篇-看门狗 WatchDog[不喂狗就咬你]

    RTOS 系统篇-看门狗 WatchDog[不喂狗就咬你] 概述 程序设计完成后,要开始考虑系统整体的稳定性了. 在设备上线后,可能因为程序设计不合理.硬件设计有 bug,电气干扰.静电噪声.电源故障 ...

  6. 嵌入式系统中时间的应用以及rtc的验证过程

    在嵌入式系统中时间分为3种,分别为当前时间,系统时间,硬件时间,三种之间有一定的关联关系,如果开发板没有电池,用于保持开发板的时钟,那么当开发板断电后,时钟恢复为默认时间,一般为1970年1月1日,0 ...

  7. 嵌入式系统中进程间通信的监视方法

    概述 复杂的嵌入式系统中,常常同时运行着相当多的进程.这些进程之间频繁的进行着大量的通信动作.进程的运行状态与这些不断发生的通信有着直接和紧密的联系.通过对进程间通信的监视,开发人员可以掌控系统内部运 ...

  8. python好还是c+-嵌入式系统中,Python与C/C++哪方更为适用?

    [51CTO.com快译]长久以来,C/C++一直编译着嵌入式系统编程领域,但二者亦拥有自己的缺陷.相比之下,Python则成为嵌入式系统中的另一大***语言选项.在今天的文章中,我们将共同探讨双方的 ...

  9. 【原创】QT在嵌入式系统中显示中文的方法

    [原创]QT在嵌入式系统中显示中文的方法 此篇文章主要借鉴:http://zzqh007.blog.163.com/blog/static/44434847201011312168296/ 移植QT4 ...

最新文章

  1. CentOS7(64位)查看CPU和NVIDIA显卡温度
  2. c语言把地址用%d输出字符串,C语言必须要记住的经典程序
  3. mysql多实例访问代理_MySql-Proxy之多路结果集归并
  4. 概率dp——处理分母为0的情况hdu3853
  5. iscsi网络存储介绍及客户端配置操作
  6. Web.XML配置详细说明
  7. 如何写_家长如何为老师写评语
  8. CodeForces 48C D - The Race (Fraction,数学)
  9. bash脚本之case语句应用,while、until和select循环应用及其示例
  10. 仙人掌(cactus)
  11. lin通讯从节点同步间隔场_LIN总线入门
  12. C语言项目-俄罗斯方块
  13. 输出字符串中匹配最多的括号数
  14. 网站网页快速变灰方法
  15. 学习OpenCV(1)概述
  16. JS实现网站的简体字与繁体字转换
  17. GPS失锁和丢包区别
  18. Java大佬是怎样炼成的3-4
  19. win10 1903 1909 Realtek 声卡均衡器 调节失效 解决
  20. 物联网|ZETA无线通信技术助力工厂节能减排,数字化低碳化运营

热门文章

  1. JavaScript高级程序设计 第四章---变量 作用域 内存
  2. 视觉-不同镜头的认识
  3. mysql 服务器如何优化_mysql服务器优化
  4. python编写游戏怎么打包——详解python+pygame游戏开发之使用Py2exe打包游戏为exe文件
  5. 宋宝华:Docker 最初的2小时(Docker从入门到入门)
  6. JavaScript 数组filter方法完整介绍
  7. java 字节转字符_Java 字符串 之 字符,字节,字符串的转换
  8. Qt实现一个隐式共享类(使用QSharedDataPointer)
  9. 技术文章里那么多的问号与叹号
  10. SQL每日一题(20210824)假设计算日期是从2021-7-13开始计算,PENDING_DAYS表示到货还需要的天数