详解多任务看门狗及喂狗方法

发布者:自由探索最新更新时间:2018-11-21 来源: eefocus关键字:多任务  看门狗  喂狗方法 手机看文章 扫描二维码
随时随地手机看文章

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


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


图1:(a) 多任务系统看门狗示意图;(b) 相应的看门狗复位逻辑图


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


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


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


21ic

图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长时间得不到调度,使得看门狗错误复位。良好的任务划分,配置是不应该出现这种高优先级任务长期执行状况的。


关键字:多任务  看门狗  喂狗方法 引用地址:详解多任务看门狗及喂狗方法

上一篇:看门狗复位的应用技巧
下一篇:单片机IO口工作方式详细分析

推荐阅读最新更新时间:2024-03-16 16:17

PIC16C5X的复位电路
PIC16C5X的复位电路可以由系统上电,把MCLR输入拉为低电平,或看门狗定时器溢出而产生。振荡启动定时器OST作用或MCLR输入为低电平,单片机将保持复位状态,复位时单片机处于以下状态: · 振荡器启动或工作,包括电源上升启动或睡眠唤醒启动。 · I/O控制寄存器设定为全“1”,使所有I/O引脚(PA0-PA3、PB0-PB7、PC0-PC7)处于高阻状态。 · 程序计数器PC设为全“1”,对于PIC16C54/55为1FFH,对于PIC16C56为3FFH,对于PIC16C57为7FFH。 · OPTION寄存器设为全“1”。 · 看门狗定时器WDT及其分频器清“0”。 · 状态寄存器f3的程序页
[单片机]
PIC16C5X的复位电路
关于STM32的看门狗总结
一、独立看门狗 STM32的独立看门狗有内部的40kHz低速时钟驱动,即使主时钟发生故障,他也仍然有效。需要注意:独立看门狗的时钟是一个内部RC时钟,所以并不是准确的40kHz,而是在30kHz~60kHz之间变化的时钟,所以独立看门狗的时间并不精确。 在键值寄存器(IWDG_KR)中写入0xCCCC,开始启动独立看门狗;此时计数器开始从复位值0xFFF递减计数;当计数到末尾0x000时,会产生一个信号(IWDG_RESET)。无论何时只要键值寄存器(IWDG_KR)中写入0xAAAA,IWDG_RLR中的值就会被重新加载到计数器中去,从而避免产生看门狗复位。 独立看门狗时钟来自内部低速时钟LSI,需使能 RCC_LSICmd(
[单片机]
51单片机上实时多任务操作系统-教程
RTX51是用与8051系列的实时多任务RTOS 1。 RTX 两个版本区别: RTX51 FULL:允许4个优先任务循环和切换,并行利用终端,支持邮箱系统的信号和消息传递 RTX TINY 子集,不支持占先式任务切换,不能进行信息处理 RTX的循环任务调度 准并行 利用内部定时器的中断实现定时 使用时不需要包含main()函数,自动从任务0开始 如果包含main()函数,则需要利用os-start-system 或 os-creat-task来启动 Example1: ps:注意事项: 关于Keil报错 *** FATAL ERROR L210: I/O ERROR ON INPUT FILE:缺少RTX51.LIB
[单片机]
STM32---IWDG独立看门狗的使用
独立看门狗(IWDG)由专用的40kHz的低速时钟驱动, 即使主时钟发生故障它也仍然有效。 窗口看门狗由从APB1时钟分频后得到的时钟驱动, 通过可配置的时间窗口来检测应用程序非正常的过迟或过早的操作。 IWDG最适合应用于那些需要看门狗作为一个在主程序之外, 能够完全独立工作,并且对时间精度要求较低的场合。 WWDG最适合那些要求看门狗在精确计时窗口起作用的应用程序。 IWDG主要性能 ●自由运行的递减计数器 ●时钟由独立的RC振荡器提供(可在停止和待机模式下工作) ●看门狗被激活后,则在计数器计数至0x000时产生复位 在键寄存器(IWDG_KR)中写入0xCCCC,开始启用独立看门狗; 此时计数器开始从其复位值0
[单片机]
ATmega48 看门狗复位
看门狗定时器溢出时将产生持续时间为1个CK周期的复位脉冲。在脉冲的下降沿,延时定时器开始对tTOUT 记数。请参见P44 以了解看门狗定时器的具体操作过程。
[单片机]
ATmega48 <font color='red'>看门狗</font>复位
STM32芯片如何使用片内参考电压实现模拟看门狗
STM32芯片的ADC模块往往都支持模拟看门狗功能,即可以对单个或多个通道开启模拟转换值的监测。当模拟通道ADC值超出设定的阈值时可以产生模拟看门狗事件并可触发看门狗中断。【注:下面截图或数据都是基于STM32L4系列芯片的,其它STM32系列与其类似。】 结合上图,当选定的ADC通道的转换结果比设置的阈值上限还高或比设定的阈值下限还低时都可以通过硬件触发模拟看门狗事件或中断。 假设现有STM32用户有这样一个应用需求,他希望STM32的供电电压低于一定程度时就提示低压报警,然后软件将进行相关处理。 关于这个应用需求,我们就可以利用片内的一个参考电压和模拟看门狗来实现。 我们知道,STM32芯片内部都内置了一个比
[单片机]
STM32芯片如何使用片内参考电压实现模拟<font color='red'>看门狗</font>
S5PC100看门狗定时器源码解读
看门狗(WatchDog)定时器和PWM定时功能目的不一样。它的特点是,需要不停地接受信号(一些外置看门狗芯片)或重新设置计数值(如S5PC100的看门狗控制器),保持计数值不为0。一旦一段时间接收不到信号,或计数值到0,看门狗将发出复位信号复位系统或产生中断。(扩展阅读:脉冲宽度调制定时器) 看门狗的作用是微控制器受到干扰进入错误状态后,使系统在一定时间间隔内复位。因此看门狗是保证系统长期、可靠和稳定运行的有效措施。目前大部分的嵌入式芯片内都集成了看门狗定时器来提高系统运行的可靠性。 S5PC100处理器的看门狗是当系统被故障(如噪声或者系统错误)干扰时,用于微处理器的复位操作,也可以作为一个通用的16位定时器来请求中断操作。看
[单片机]
S5PC100<font color='red'>看门狗</font>定时器源码解读
MSP430单片机的看门狗使用方法
以MSP430F2274为例。其中汇编实现采用的是IAR汇编,CCE汇编实现稍作修改即可。 1. 看门狗有三种工作模式:停止模式,计时器模式,看门狗模式。 2. 其中后两种模式可以选择的时钟源有:SMCLK和ACLK。 3. 在使用后两种模式时候要注意单片机所处的状态下看门狗能否工作,如单片机处在LPM3时候只有ACLK时钟,处在LPM4下,没有时钟可以使用。 4. 看门狗模式的使用方法:当看门狗计数溢出时,程序复位。在程序中开启看门狗,在计数溢出前清空看门狗,或重置看门狗,以使其重新计数。若程序跑飞,看门狗可能没有被清空或重置,就会溢,使程序复位。 5. 在MSP430F2274中,看门狗模式下可以计时最长为1s,若需要以
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved