在多任务(RTOS)环境中使用看门狗

        最近在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对航天器的有效操作,并导致其中一个推进器不受控制。

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

        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。

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

结论

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

欢迎关注:


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/499488.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

天池竞赛-津南数字制造算法挑战赛【赛场二】解决方案分享

天池竞赛-津南数字制造算法挑战赛【赛场二】解决方案分享 一、前言 竞赛页面 团队名BugFlow,最终排名35/2157 虽然成绩一般,但是作为一支目标检测领域的新手队伍,仅仅有一块1070显卡,从零开始拿到这个排名,也算有一…

信息摘要算法之三:SHA256算法分析与实现

前面一篇中我们分析了SHA的原理,并且以SHA1为例实现了相关的算法,在这一片中我们将进一步分析SHA2并实现之。 1、SHA简述 前面的篇章中我们已经说明过,SHA实际包括有一系列算法,分别是SHA-1、SHA-224、SHA-256、SHA-384以及SHA-…

focal loss的几种实现版本(Keras/Tensorflow)

起源于在工作中使用focal loss遇到的一个bug,我仔细的学习多个靠谱的focal loss讲解及实现版本 通过测试,我发现了这样一个奇怪的现象,几乎每个版本的focal loss实现对同样的输入计算出的loss都是不同的。 通过仔细的比对和思考&#xff0c…

基于ARM Cortex-M和Eclipse的SWO单总线输出

最近在MCU on Eclipse网站上看到Erich Styger所写的一篇有关通过SWD的跟踪接口SWO获取ARM Cortex-M相关信息的文章,文章结构明晰,讲解透彻,本人深受启发,特意将其翻译过来供各位同仁参考。当然限于个人水平,有不当之处…

PID控制器开发笔记之九:基于前馈补偿的PID控制器的实现

对于一般的时滞系统来说,设定值的变动会产生较大的滞后才能反映在被控变量上,从而产生合理的调节。而前馈控制系统是根据扰动或给定值的变化按补偿原理来工作的控制系统,其特点是当扰动产生后,被控变量还未变化以前,根…

借助百度识图爬取数据集

背景 一个能够实际应用的深度学习模型,背后的数据集往往都花费了大量的人力财力,通过聘用标注团队对真实场景数据进行标注生产出来,大多数情况不太可能使用网络来源的图片。但在项目初期的demo阶段,或者某些特定的场合下&#xf…

通过printf从目标板到调试器的输出

最近在SEGGER的博客上看到Johannes Lask写的一篇关于在调试时使用printf函数从目标MCU输出信息到调试器的文章,自我感觉很有启发,特此翻译此文并推荐给各位同仁。当然限于个人水平,有不当之处恳请指正。原文网址:https://blog.seg…

小心使用tf.image.resize_images,填坑经验分享给你

上上周,我在一个项目上线前对模型进行测试时出现了问题,这个问题困扰了我近两周,终于找到了问题根源,做个简短总结分享给你,希望对大家有帮助。 问题描述: 线上线下测试结果不一致,且差异很大…

PID控制器开发笔记之十:步进式PID控制器的实现

对于一般的PID控制系统来说,当设定值发生较大的突变时,很容易产生超调而使系统不稳定。为了解决这种阶跃变化造成的不利影响,人们发明了步进式PID控制算法。 1、步进式PID的基本思想 所谓步进式PID算法,实际就是在设定值发生阶跃…

AutoML 与 Bayesian Optimization 概述

1. AutoML 概述 AutoML是指对于一个超参数优化任务(比如规定计算资源内,调整网络结构找到准确率最高的网络),尽量减少人为干预,使用某种学习机制,来调节这些超参数,使得目标问题达到最优。 这…

使用Eclipse进行Makefile项目

最近在MCU on Eclipse网站上看到Erich Styger所写的一篇有关在Eclipse中使用Makefile创建项目的文章,文章讲解清晰明了非常不错,所以呢没人将其翻译过来供各位同仁参考。当然限于个人水平,有不当之处恳请指正。原文网址:https://m…

C语言学习及应用笔记之一:C运算符优先级及使用问题

C语言中的运算符绝对是C语言学习和使用的一个难点,因为在2011版的标准中,C语言的运算符的数量超过40个,甚至比关键字的数量还要多。这些运算符有单目运算符、双目运算符以及三目运算符,又涉及到左结合和右结合的问题,真…

使用FreeRTOS进行性能和运行时分析

在MCU on Eclipse网站上看到Erich Styger在2月25日发的博文,一篇关于使用FreeRTOS进行性能和运行分析的文章,本人觉得很有启发,特将其翻译过来以备参考。当然限于个人水平,有描述不当之处恳请指正。原文网址:https://m…

生成微信公众号对应二维码的两种简单方法

方法1 在浏览器中打开下面的链接 https://open.weixin.qq.com/qr/code?usernameName 其中Name替换为对应公众号的微信号 例如,我们打算生成公众号 AI算法联盟 的二维码 只需首先关注这个公众号 在其详细信息中,查找到微信号信息:AIReport…

在Amazon FreeRTOS V10中使用运行时统计信息

在MCU on Eclipse网站上看到Erich Styger在8月2日发的博文,一篇关于在Amazon FreeRTOS V10中使用运行时统计信息的文章,本人觉得很有启发,特将其翻译过来以备参考。原文网址:https://mcuoneclipse.com/2018/08/02/tutorial-using-…

github无法加载图片的解决办法

最近发现我的github上面项目README里面的图片全裂了,一直以为是github最近服务器不稳定。今天通过简单的查询,发现原来这个问题可以解决,但是不能永久有效,之后还会用到,因此记录在这里, 也分享给大家。 解…

C语言学习及应用笔记之二:C语言static关键字及其使用

C语言有很多关键字,大多关键字使用起来是很明确的,但有一些关键字却要相对复杂一些。我们这里要说明的static关键字就是如此,它的功能很强大,相应的使用也就更复杂。 一般来说static关键字的常见用法有三种:一是用作局…

μCUnit,微控制器的单元测试框架

在MCU on Eclipse网站上看到Erich Styger在8月26日发布的博文,一篇关于微控制器单元测试的文章,有很高的参考价值,特将其翻译过来以备学习。原文网址:https://mcuoneclipse.com/2018/08/26/tutorial-%CE%BCcunit-a-unit-test-fram…

PID控制器开发笔记之十一:专家PID控制器的实现

前面我们讨论了经典的数字PID控制算法及其常见的改进与补偿算法,基本已经覆盖了无模型和简单模型PID控制经典算法的大部。再接下来的我们将讨论智能PID控制,智能PID控制不同于常规意义下的智能控制,是智能算法与PID控制算法的结合&#xff0c…

Modbus协议栈开发笔记之七:Modbus ASCII Slave开发

与Modbus RTU在串行链路上分为Slave和Master一样,Modbus ASCII也分为Slave和Master,这一节我们就来开发Slave。对于Modbus ASCII从站来说,需要实现的功能其实与Modbus RTU的Slave是一样的。其操作过程也是一样的。首先接收到主站的访问命令&a…