最近在SEGGER的博客上看到一篇有关在实时操作系统使用看门狗的文章。从一个失败的太空项目出发,分析了看门狗的作用及使用,自我感觉很有启发,特此翻译此文并推荐给各位同仁。为了阅读方便,有些航天领域名词本人添加了注释,读者也可自行搜索更详细的解释。当然限于个人水平,有不当之处恳请指正。大家也可以看原文:https://blog.segger.com/using-a-watchdog-in-a-multi-task-rtos-environment/。作者为Til Stork,其全文如下:

Clementine是美国航空航天局在1994年1月25日发射的空间环境下测试传感器和航天器部件的卫星。由于缺乏几条看门狗程序,她的任务于1994年5月7日失效。

【注】Clementine是美国的一个航天器,官方称为深度空间计划科学实验,由NASA和导弹防御组织联合发射。

Clementine在连续两个月进行了月球测绘后,离开月球轨道并连续前往她的下一个目标——近地球小行星Geographos。然而,Clementine所载电脑很快发生了故障,并切断了NASA对航天器的有效操作,并导致其中一个推进器不受控制。

【注】Geographos1620号小行星颗阿波罗型小行星离地球近时400余万公里,其形状为极规则长条形,长宽比为45倍。

NASA花了20分钟试图使系统得到恢复,但是无济于事。硬件复位命令终于使Clementine重新上线,但为时已晚。她已经耗尽了所有的燃料,而任务的延续必须被取消。

在他们实施的软件超时明显失效时。负责Clementine软件的开发团队希望他们使用了硬件的看门狗定时器。

看门狗有什么作用?

看门狗是一种直接集成到微控制器中或者外部连接到微控制器的硬件。其主要目的是在可以安全地假设系统已挂起或以其他方式执行不正确的情况下执行错误处理(通常为硬件复位)。

看门狗的主要组件是一个计数器,最初被配置为一个特定的值,然后倒数为零。软件必须经常将该计数器重新设置为其初始值,以确保其不会达到零。否则,会出现故障,通常会重置CPU。这表明看门狗是最后的手段,只有当其他一切都失败时才采取这种选择。就像Clementine的情况一样。

如何喂狗

然而,正确使用看门狗定时器并不像重新启动计数器那样简单(通常被称为喂狗或者踢狗)的过程。在其系统中运行看门狗定时器时,开发人员必须仔细选择看门狗的超时时间,以便看门狗在发生故障的系统可以执行任何不可逆转的恶意动作之前进行干预。

在简单的应用中,特别是没有使用RTOS,开发人员通常会从主循环中提供看门狗。该方法仅需要配置适当的初始计数器值,它可以简单地选择任何超过整个主循环最坏的执行时间的值,至少有一个计时器周期。这通常是一个非常有效的方法,虽然有一些系统需要立即恢复,但更多系统只需要确保它们不会被无限期地挂起,这一方法能很好的实现之一目的。

在多任务(RTOS)环境中喂狗

然而,在更复杂的系统中,特别是多任务系统,各种线程可能会因为各种原因潜在地挂起。一些线程可以长时间运行,例如线程等待潜在的网络通信。一个干净的方法可以定期喂养看门狗,同时确保每个不同的过程都处于健康状态,成为这些系统开发人员面临的主要挑战,例如需要关注的是:

  • 操作系统是否正常执行
  • 高优先级任务是否耗尽CPU,完全阻止低优先级任务运行
  • 是否发生了阻止执行一个或多个任务的死锁
  • 任务程序是否正确执行

开发人员还需要确保对其源代码执行的任何修改(无论是专用监视任务还是受监视任务的特定修改)都必须很小,并针对效率进行优化,以将侵扰性保持在最低限度。

RTOS增加看门狗支持

因此,最先进的RTOS如SEGGER的embOS为客户提供综合的看门狗解决方案,以简化看门狗处理,从而减少任何开发过程的时间花费。

这些解决方案应用的一般原则可能会因不同的RTOS而异。然而,在SEGGER,多功能性和易用性被认为是首要的,同时在内存使用和执行时间内将所需的占用空间最小化。因此,对于嵌入式专家来说,显然需要一套全面的API函数来实现:

  • 单独注册任务,计时器,甚至带embOS看门狗模块的ISR。
  • 从任何所需的上下文灵活地测试预期看门狗状态的可能性。

现在最终的实现只包括五个API函数,但功能足以满足任何预期的目的。

使用这些API函数,一个任务可以简单地将其自身注册到embOS看门狗模块,并可以单独配置其超时时间。然后,任务可以通过调用一个简单的embOS API函数来定期发出正确的执行。所有被监视的任务是否在指定的超时时间内发出正确的执行信号,随后通过另一个单独的embOS API调用进行检查,该调用可以在专用看门狗任务内从OS_Idle()内执行,甚至从定期操作系统定时器中断服务程序或任何其他ISR。

用户只需要提供和注册两个功能:第一个执行看门狗的硬件依赖的馈送,而另一个则在看门狗计数器达到零时指定进一步的动作。例如,这可以将日志文件存储到非易失性存储器中,在执行硬件复位或执行任何其他操作之前,包含有关系统状态的进一步信息。

结论

当开始设计和开发具有看门狗的应用程序时,需要确保尽早决定如何使用它 。并考虑可以帮助您更快地实现的可用工具。至少,你不想被困在太空中,是吗?

在多任务(RTOS)环境中使用看门狗的更多相关文章

  1. WINCE平台下C#应用程序中使用看门狗

    看门狗定时器(WDT,Watch Dog Timer)是单片机的一个组成部分,它实际上是一个计数器,一般给看门狗一个大数,程序开始运行后看门狗开始倒计数.如果程序运行正常,过一段时间CPU应发出指令让 ...

  2. [ZigBee] 12、ZigBee之看门狗定时器——饿了就咬人的GOOD DOG

    引言:硬件中的看门狗,不是门卫的意思,而是一只很凶的狗!如果你不按时喂它,它就会让系统重启!这反而是我们想要的功能~ 1.看门狗概述 看门狗定时器(WDT,Watch Dog Timer)是单片机的一 ...

  3. 嵌入式 uboot以及kernel添加看门狗临时记录(个人记录未整理乱)

    Uboot_Kernerl_Add_Watch_Dog: U-Boot 2010.06 (Nov 01 2013 - 15:28:44) DRAM:  128 MiBCheck spi flash c ...

  4. 给NIOS II CPU增加看门狗定时器并使用

    给NIOS II CPU增加看门狗定时器并使用   配置看门狗定时器: 设置计时溢出时间为1秒 计数器位宽为32位 勾选No Start/Stop control bits 勾选Fixed perio ...

  5. linux设备驱动归纳总结(十一):写个简单的看门狗驱动【转】

    本文转载自:http://blog.chinaunix.net/uid-25014876-id-112879.html linux设备驱动归纳总结(十一):写个简单的看门狗驱动 xxxxxxxxxxx ...

  6. STM8|STM32 看门狗使用

    源:STM8|STM32 看门狗使用 STM8和STM32都配备了独立看门狗,其作用之大不言而喻.以下为STM8及STM32的独立看门狗使用例: 对于STM32单片机: #define SYS_IWD ...

  7. S5PV210时钟,看门狗定时器

    晶振:时钟源(操作主要有两个,倍频,分频) A8的时钟源: 时钟域,每个时钟域(不同的最高频率和最低频率)管理着不同的电路模块: 不同的时钟域对应不同电路模块表 时钟电路:懂得看时钟电路(时钟源选择开 ...

  8. linux内核中断之看门狗

    一:内核中断 linux内核中的看门狗中断跟之前的裸板的中断差不多,在编写驱动之前,需要线把内核自带的watch dog模块裁剪掉,要不然会出现错误:在Device Drivers /Watchdog ...

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

    转自:http://blog.csdn.net/erickhuang1989/article/details/8721548 在嵌入式系统中,为了使系统在异常情况下能自动恢复,一般都会引入看门狗电路. ...

随机推荐

  1. 使用Hexo在github上搭建个人博客

    最近正好在学习前端开发,想着搭建一个属于自己的个人博客,把自己的技能树整理整理,温故而知新. 如果你有前端开发经验,那么搭建这样的博客就很简单了. 一 什么是Hexo     Hexo 是一个快速.简 ...

  2. DNN网络(二)反向传播算法

    本文摘自: https://www.cnblogs.com/pinard/p/6422831.html http://www.cnblogs.com/charlotte77/p/5629865.htm ...

  3. UE4 编译笔记

    UE4 的功能被分成了很多的模块,在API文档里每个类都有 Module 这个属性(值为模块名)每个模块使用其他模块要在Build.cs里导入,像vs里的引入库.在构建时 PublicDependen ...

  4. luogu P4491 [HAOI2018]染色

    传送门 这一类题都要考虑推式子 首先推出题目要求的式子,枚举正好有\(s\)个颜色的种类(范围\([0,p=min(\lfloor\frac{n}{s}\rfloor,m)]\)),然后对于后面的颜色 ...

  5. ThinkPHP5基础学习(慕课版)

    一.thinkphp 5.0 的安装及配置 二.URL和路由 三.请求和相应 四.视图和模板 五.数据库的操作 六.模型的操作

  6. Spark SQL自定义外部数据源

    1 涉及到的API BaseRelation: In a simple way, we can say it represents the collection of tuples with know ...

  7. java作业(1)

    第一题: 模仿JavaAppArguments.java示例,编写一个程序,此程序从命令行接收多个数字,求和之后输出结果. (1)设计思想 程序中设置字符串的个数,从键盘进行输入,并且将字符串转化为数 ...

  8. 博客里的第一篇随笔!QWQ

    这里是一个信息蒟蒻,开始自己的博客之旅!!QWQQQQ

  9. LOJ #2542「PKUWC2018」随机游走

    $ Min$-$Max$容斥真好用 $ PKUWC$滚粗后这题一直在$ todolist$里 今天才补掉..还要更加努力啊.. LOJ #2542 题意:给一棵不超过$ 18$个节点的树,$ 5000 ...

  10. BFS与DFS算法解析

    1)前言 和树的遍历类似,图的遍历也是从图中某点出发,然后按照某种方法对图种所有顶点进行访问,且仅访问一次. 但是图的遍历相对树的遍历更为复杂,因为图中任意顶点都能与其他顶点相邻,所以在图的遍历中必须 ...