看门狗
看门狗的工作原理、应用和设计思路
demi 在 提交
作者:Jon Gabay
由于多线程、实时和多任务嵌入式系统的情况纷繁复杂,使我们越来越难以预料微处理器会在什么时候出现问题。 在某种程度上独立运行的服务程序是如此之多,其中一些很有可能会生存下来,而其它的则被锁定、废弃或者执行无用代码。
因此,嵌入式系统设计人员要在一些低级别服务程序或者内核出现偏差时保护整个系统并防止出现故障,现在已是难上加难。
本文介绍看门狗功能的发展需要,且技术工程师们能通过这些功能确保 MCU 可靠工作。 本文将详细考察需要在硬件中从外部、在软件中从内部克服的不足之处,并介绍一些看门狗零件样件。 本文件所引用的所有零件、规格书、指南和开发工具均可在 Digi-Key 网站在线找到。
简单保护
从 4 位到至高级的 32 位及以上的机器都需要有看门狗功能。 在潜在危险情况下工作的简单处理器不在少数。 例如,一个节流阀控制回路仅需一个简单的 8 位混合信号微控制器,以本地方式实现稳定的闭环控制。 该控制器能够在车辆 CAN 总线上接受指令,从远程车载电脑卸载全部处理任务。 然而,如果这个简单的处理器出现故障,那么整个节流阀将起不到任何作用。
可以肯定地说,几乎每一个现代微控制器都具有一些简单的看门狗功能——专门的看门狗硬件块或者能够用来执行软件控制型看门狗功能的定时器。 这些设备均与处理器中的系统时钟实现了同步。
随着处理器越来越复杂,处理器内部的时钟结构和时钟分布也更加复杂。 振荡器特别容易遭受 ESD 冲击,例如,如果时钟性能下降,同步看门狗将毫无用处。
R/C 振荡器和时间常数虽然保守,但能提供独立时钟机制和复位机制,作为应急或后备之用。 同样,冗余型内部和外部振荡器源能实现某种形式的心跳效果,以确保在严重故障期间监视电路。 此外,可选择的时钟集成性与结构树中的时钟位置同样重要(图 1)。
图 1:系统时钟和后备 R/C 振荡器组合在一起可节省功耗,并能在系统时钟崩溃时提供一个可靠独立的后备时钟,确保看门狗功能正常。 请注意此处两个 R/C 振荡器的使用方式。
对于低压检测电路来说,也是如此。 虽然采用内部电压基准、比较器和检测器能够实现基本精度,但通过外部电路可实现更高的分辨率和更精确的电压电平选择性。 例如,如果您的部分电压故障模式软件包括写入 EEPROM 功能,您可能希望低压检测器阈值提早跳变,以使容性电荷存储器有足够的时间在按顺序关断之前执行 EEPROM 写入功能。 现代电压检测器能够达到低至 0.05 V 的电压分辨率,以便精确使用所有能量。 通常,这个分辨率要远胜于您利用微控制器从内部实现的分辨率。
还需要了解的一点是单独的最大超时并非始终有效。 大多数看门狗解决方案基本上在执行一个可再触发式单稳态多谐振荡器(可再触发式单触发)的功能。 如果软件或者硬件周期时钟不能在最大允许时间帧内使定时器复位,看门狗跳变并会使处理器复位(或者启动故障恢复服务程序)。
最小时间要求也应考虑。 例如,如果一个服务程序与 60 Hz 电源线的过零点同步,那么脉冲间隔应是 8.33 ms。 如果这些脉冲过早达到,则必须克服通常会影响安全的噪声或者故障条件。
多处理器和多核设计的情况特殊。 应对单独的看门狗进行设置,以利用当时在每个理器中运行的唯一代码条件来监视这些处理器或内核。 也就是说,针对多核环境中某个内核的部分软件开发应带有能指示特定代码块故障的看门狗条件。
此外,看门狗报告应采用层级结构。 每个内核应向更高层级的看门狗报告,该看门狗把由所有子核和流程报告的全部故障模式联系在一起。 作为一个高层级系统功能,看门狗执行程序与为特定内核分配代码块的主任务执行程序同步工作。 另外,也与外部看门狗系统密切合作。
线或类型多看门狗模功能块能很容易地进行扩展,以使用特定于某个内核的 I/O 进行报告(图 2)。 该功能块可以是 FPGA 或者 CPLD 中的独立逻辑块,且易于扩展,能应对多个处理器和功能块。 寄存器能够累加所有报告功能块的独立状态,以试图单独恢复那个内核。 如您所想,这个层级的恢复程序会变得更复杂,就像在保持系统其余部分运行的同时重新启动内核那样。
图 2:看门狗层级结构的顶层能使用可扩展线或功能,以使所有微处理器或内核能按照各自的速率进行报告。 每个“单触发”都应允许受其监视的进程按持续间隔进行编程。 每个代码块均携带看门狗参数。
具有特殊看门狗功能的零件
在涉及到如何实现看门狗功能时,有多种微处理器具有唯一或不同的功能。 以 16 位 Maxim MaxQ 系列微控制器为例,为提升有用性,该系列将类型丰富而灵活地定时器和设计巧妙的电路组合在一起。 象 Maxim MAXQ2000-RBX+ 这样的零件具有次级报警。 如果没有报警且 MAXQ2000 的看门狗 (WTD) 发生溢出,那么,再次经过另外 512 个系统时钟周期计数后该微控制器会触发一个中断。 然后,如果未被禁用或覆盖,它会使全部定时器复位。
这种中断为保存调试信息提供了“最后的机会”——一个得到了大多数设计人员的一致认可、在电路开发、故障清除期间非常有用的机会。 而且,该中断可用于将看门狗从错误中恢复并将其清空,而不是保存调试信息。 然而,后一种方法在系统发生故障时会削弱系统可靠性。
与其它内部 WDT 类似,MAXQ2000 的看门狗可通过软件禁用。 不过应当注意,这种功能就像一把双刃剑:失控代码禁用看门狗后仍处于失控状态。
一些微处理器的 WDT 会与独立于系统时钟的内部振荡器连接。 还有一些微处理器使用内部或外部 R/C 振荡器,有的同时使用这些振荡器。 Maxim MAXQ2000 的 WDT 上有一个令人感兴趣的功能:虽然从系统时钟驱动看门狗定时功能,但能在主振荡器故障时切换至备用振荡器。
另一种让人关注并具有独特看门狗功能的 MCU 便是采用两个看门狗定时器的 STM32F100 系列(由 STMicroelectronics 提供)。 象 STM32F100CBT6B 这样的零件均针对要求高可靠性的智能电网和智能健康应用。 同大多数微处理器一样,该器件也采用了多个定时器(此处为六个),且另外有两个 16 位定时器专用于看门狗功能。
每个看门狗都具有一个为看门狗定时器提供时钟的可选择预分频器 (1 - 64 K),同时还能触发 DMA 请求并捕获比较通道。 另一种独立的看门狗基于一个 112 位下变频器和 8 位预分频器,并采用独立的 40 kHz 内部 R/C 振荡器提供时钟。 注意这两种零件如何依赖 R/C 元件,将其作为超可靠的后备技术。
STMicroelectronics 零件吸引人的一个特性就是模拟看门狗功能。 对经过 A/D 转换的一个或两个电压电平进行精确监视,能在模拟电平超过预设阈值时使复位跳变。 对于那些通过传感器与人体局域网连接且用于健康监视或主动给药的医疗应用,该功能会非常有用(图 3)。 为方便设计,STMicroelectronics 向工程师们提供有关健康和医疗保健设计的产品培训模块。
图 3:随着医疗设备越来越积极地与我们的人体局域网集成在一起,一些设备(心脏起搏器、除颤器、胰岛素泵等)在维持人的生命中可能会发挥至关重要的作用。 需要在这些系统中集成可靠的看门狗。
由外向内看
许多好的构造块外部解决方案包括简单的 R/C 阈值发生器、偏置晶体管、低功耗定时器,以及专用上电复位和看门狗协处理器。 此外,现在已有可用的开发环境,鼓励人们进行实验和简化测试。Texas Instruments 利用其 TPL5000 毫微功耗可编程定时器提供了一种令人感兴趣的解决方案,该方案在 1.8 - 5 VCC 宽电压范围内的电流消耗仅 30 nA。 TPL5000EVM 评估套件能让您在一个小而精致的自足式模块中测试、优化该功能。
目前,已有多种分立式看门狗可与其它有用的功能组合在一起,如实时时钟 和 监视功能。 Lattice Semiconductor 提供了一个值得关注的组合品,带有其 ISPPAC-POWR607-01SN32I 电源监控器、看门狗和复位发生器(图 4)。 请注意 1% 的模拟跳变点步长值以及用于状态机和组合式定制的在系统编程宏单元。
图 4:利用在系统用户可编程参数,可通过使用组合式和基于状态机的用户可配置逻辑,实现看门狗功能的动态确定。
总结
谨记有时候做何事情都无助于系统恢复。 有些故障是不可恢复的。 例如,如果系统存储器崩溃,那么就再没有什么可值得信任了。
另一种情况是如果存在很高级别的噪音。 即使看门狗使处理器复位,这种噪声仍能影响处理器的看门狗级初始化。 如果看门狗功能未被初始化,看门狗就如形同虚设。
任何人都不能指望任何 MCU 在任何时候都能百分之百无故障运行。 微处理器也可能出错。 然而,是仅出现轻微故障,还是灾难性财产损坏或者甚至死亡,关键在于能否合理使用内外资源。
如需详细了解本文讨论的零件,请使用文中提供的链接访问 Digi-Key 网站上的产品信息页。
文章来源:digikey
https://www.digikey.cn/zh/articles/the-growing-importance-of-watchdog-fu...
硬件看门狗
硬件看门狗是利用了一个定时器,来监控主程序的运行,也就是说在主程序的运行过程中,我们要在定时时间到之前对定时器进行复位如果出现死循环,或者说PC指针不能回来。那么定时时间到后就会使单片机复位。常用的WDT芯片如MAX813,5045,IMP 813等,价格4~10元不等。
软件看门狗
软件看门狗技术的原理和这差不多,只不过是用软件的方法实现,我们还是以51系列来讲,我们知道在51单片机中有两个定时器,我们就可以用这两个定时器来对主程序的运行进行监控。我们可以对T0设定一定的定时时间,当产生定时中断的时候对一个变量进行赋值,而这个变量在主程序运行的开始已经有了一个初值,在这里我们要设定的定时值要小于主程序的运行时间,这样在主程序的尾部对变量的值进行判断,如果值发生了预期的变化,就说明T0中断正常,如果没有发生变化则使程序复位。
对于T1我们用来监控主程序的运行,我们给T1设定一定的定时时间,在主程序中对其进行复位,如果不能在一定的时间里对其进行复位,T1 的定时中断就会使单片机复位。在这里T1的定时时间要设的大于主程序的运行时间,给主程序留有一定的的余量。而T1的中断正常与否我们再由T0定时中断子程序来监视。这样就够成了一个循环,T0监视T1,T1监视主程序,主程序又来监视T0,从而保证系统的稳定运行。
系统软件"看门狗"的设计思路:
1. 看门狗定时器T0的设置。
在初始化程序块中设置T0的工作方式,并开启中断和计数功能。系统Fosc=12 MHz,T0为16位计数器,最大计数值为(2的16次方)-1=65 535,T0输入计数频率是.Fosc/12,溢出周期为(65 535+1)/1=65 536(μs)。
2. 计算主控程序循环一次的耗时。
考虑系统各功能模块及其循环次数,本系统主控制程序的运行时间约为16.6 ms。系统设置"看门狗"定时器T0定时30 ms(T0的初值为65 536-30 000=35 536)。主控程序的每次循环都将刷新T0的初值。如程序进入"死循环"而T0的初值在30 ms内未被刷新,这时"看门狗"定时器T0将溢出并申请中断。
3. 设计T0溢出所对应的中断服务程序。
此子程序只须一条指令,即在T0对应的中断向量地址(000BH)写入"无条件转移"命令,把计算机拖回整个程序的第一行,对单片机重新进行初始化并获得正确的执行顺序。
来源:电子发烧友网
一、WWDG 简介
窗口看门狗通常被用来监测由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。除非递减计数器的值在T6 位变成 0前被刷新,看门狗电路在达到预置的时间周期时,会产生一个MCU 复位。在递减计数器达到窗口寄存器数值之前,如果 7位的递减计数器数值(在控制寄存器中)被刷新,那么也将产生一个MCU 复位。这表明递减计数器需要在一个有限的时间窗口中被刷新。
二、WWDG 主要特征
• 可编程的自由运行递减计数器
• 条件复位
- 当递减计数器的值小于 0x40,(若看门狗被启动)则产生复位。
- 当递减计数器在窗口外被重新装载,(若看门狗被启动)则产生复位。
• 如果启动了看门狗并且允许中断,当递减计数器等于0x40 时产生早期唤醒中断(EWI),它可以被用于重装载计数器以避免WWDG 复位。
三、WWDG功能描述
如果看门狗被启动(WWDG_CR寄存器中的WDGA 位被置1),并且当 7位(T[6:0])递减计数器从0x40 翻转到0x3F(T6位清零)时,则产生一个复位。如果软件在计数器值大于窗口寄存器中的数值时重新装载计数器,将产生一个复位。
应用程序在正常运行过程中必须定期地写入WWDG_CR 寄存器以防止MCU 发生复位。只有当计数器值小于窗口寄存器的值时,才能进行写操作。储存在WWDG_CR 寄存器中的数值必须在0xFF 和0xC0 之间:
1、启动看门狗
在系统复位后,看门狗总是处于关闭状态,设置WWDG_CR 寄存器的WDGA 位能够开启看门狗,随后它不能再被关闭,除非发生复位。
2、控制递减计数器
递减计数器处于自由运行状态,即使看门狗被禁止,递减计数器仍继续递减计数。当看门狗被启用时,T6 位必须被设置1,以防止立即产生一个复位。
T[5:0]位包含了看门狗产生复位之前的计时数目;复位前的延时时间在一个最小值和一个最大值之间变化,这是因为写入WWDG_CR寄存器时,预分频值是未知的。
配置寄存器(WWDG_CFR)中包含窗口的上限值:要避免产生复位,递减计数器必须在其值小于窗口寄存器的数值并且大于0x3F 时被重新装载,上图描述了窗口寄存器的工作过程。
另一个重装载计数器的方法是利用早期唤醒中断(EWI)。设置WWDG_CFR 寄存器中的WEI 位开启该中断。当递减计数器到达0x40 时,则产生此中断,相应的中断服务程序(ISR)可以用来加载计数器以防止WWDG 复位。
在WWDG_SR 寄存器中写0可以清除该中断。注:T6 位可以被用来产生一个软件复位(WDGA 位被置位,T6 位清零)
四、如何编写看门狗超时程序
下图显示了装载到看门狗计数器(CNT)中的 6 位计数值和看门狗的延迟时间之间的线性关系(以 mS为单位)。此图可用来做为快速计算的参考,而未将时间的偏差考虑在内。如果需要更高的精度,可以使用下图提供的计算公式。
当写入 WWDG_CR 寄存器时,始终置 T6 位为1以避免立即产生一个复位。
五、设置WWDG实验分析
• 实验内容简介
环境MM32L073PF Miniboard、MDK,设置WWDG,通过观察喂狗与不喂狗的复位现象。
• 实验代码分析
首先看main函数
先初始化一个串口,方便我们观察复位现象,然后通过函数Wwdg_reset_ON 进行设置WWDG。最后在循环里通过WWDG_SetCounter函数不停的喂狗。
在函数Wwdg_reset_ON中设置窗口值,和计数器的初值。
• 实验现象
1、当注释掉喂狗函数时,通过串口在不断打印可以看出,MCU一直在复位。
2、当不注释喂狗函数时,串口只打印一次,MCU没有复位。
来源:灵动微电子
一、IWDG简介
MM32 MCU内置两个看门狗,提供了更高的安全性、时间的精确性和使用的灵活性。两个看门设备(独立看门狗和窗口看门狗)可用来检测和解决由软件错误引起的故障;当计数器达到给定的超时值时,触发一个中断(仅适用于窗口型看门狗)或产生系统复位。
独立看门狗(IWDG)由专门的低速时钟(LSI)驱动,即使主时钟发生故障它也仍然有效。窗口看门狗从APB1时钟分频后得到的时钟驱动,通过可配置的时间窗口来检测应用程序非正常的过迟或过早的操作。
IWDG最适合应用于那些需要看门狗作为一个正在主程序外,能够完全独立工作,并且对时间精度要求低的场合。WWDG最适合那些要求看门狗在精确计时窗口起作用的应用程序。
二、IWDG主要性能
自由运行的递减计数器
时钟由独立的振荡器提供(可在停止和待机模式下工作)
看门狗被激活后,则在计数器计数至 0x0000 时产生复位。
三、IWDG 功能描述
下图为独立看门狗模块的功能框图。
在键寄存器(IWDG_KR)中写入 0xCCCC。开始启动独立看门狗;此时计数器开始从其复位值 0xFFF递减计数。当计数器计数到末尾 0x000 时,会产生一个复位信号(IWGD_RESET)。
无论何时,只要在键寄存器 IWDG_KR 中写入 0xAAAA, IWDG_RLR 中的值就会被重新加载到计数器,从而避免产生看门狗复位。
此外,即使振荡器的频率是精确的,确切的时序仍然依赖于 APB 接口时钟与振荡器时钟之间的相位差,因此总会有一个完整的振荡器周期是不确定的。
IWDG_PR 和 IWDG_RLR 寄存器具有写保护功能。要修改这两个寄存器的值,必须先向 IWDG_KR 寄存器中写入 0x5555。以不同的值写入这个寄存器将会打乱操作顺序,寄存器将重新被保护。重装载操作(即写入 0xAAAA)也会启动写保护功能。
状态寄存器指示预分频值和递减计数器是否正在被更新。
当微控制器进入调试模式时(CPU 核心停止),根据调试模块中的 DBG_IWDG_STOP 配置位的状态,IWDG 的计数器能够继续工作或停止。
四、独立看门狗代码配置
MM32L073系列独立看门狗初始化和启动设置:
喂狗函数:
五、实验实现窗口看门狗
测试方法:在main函数中先进行串口打印后初始和打开IWDG,然后让程序进入while(1)的死循环。
测试代码main函数如下:
测试结果:
1、当我们在while(1)里进行喂狗操作时,串口只会进行一次打印。。
2、当我们在while(1)里不进行喂狗操作时,串口每隔大约看门狗复位的时间1.6s进行一次打印。
实验总结:实现了看门狗复位的功能。
转自:灵动微电子
看门狗分硬件看门狗和 软件看门狗。硬件看门狗是利用一个定时器电路,其定时输出连接到电路的复位端,程序在一定时间范围内对定时器清零(俗称“喂狗”),因此程序正常工作时, 定时器总不能溢出,也就不能产生复位信号。如果程序出现故障,不在定时周期内复位看门狗,就使得看门狗定时器溢出产生复位信号并重启系统。软件看门狗原理 上一样,只是将硬件电路上的定时器用处理器的内部定时器代替,这样可以简化硬件电路设计,但在可靠性方面不如硬件定时器,比如系统内部定时器自身发生故障 就无法检测到。当然也有通过双定时器相互监视,这不仅加大系统开销,也不能解决全部问题,比如中断系统故障导致定时器中断失效。
看门狗本身不是用来解决系统出现的问题,在调试过程中发现的故障应该要查改设计本身的错误。加入看门狗目的是对一些程序潜在错误和恶劣环 境干扰等因素导致系统死机而在无人干预情况下自动恢复系统正常工作状态。看门狗也不能完全避免故障造成的损失,毕竟从发现故障到系统复位恢复正常这段时间 内怠工。同时一些系统也需要复位前保护现场数据,重启后恢复现场数据,这可能也需要一笔软硬件的开销。
在单任务系统中看门狗工作原理如上所述,容易实现。在多任务系统中情况稍为复杂。假如每个任务都像单任务系统那么做,如图1(a)所示,只要有一个 任务正常工作并定期“喂狗”,看门狗定时器就不会溢出。除非所有的任务都故障,才能使得看门狗定时器溢出而复位,如图1(b)。
而往往我们需要的是只要有一个任务故障,系统就要求复位。或者选择几个关键的任务接受监视,只要一个任务出问题系统就要求复位,如图2(a)所示,相应的看门狗复位逻辑如图2(b)所示。
在多任务系统中通过创建一个监视任务TaskMonitor,它的优先级高于被监视的任务群Task1、Task2...Taskn。 TaskMonitor在Task1~Taskn正常工作情况下,一定时间内对硬件看门狗定时器清零。如果被监视任务群有一个Task_x出现故 障,TaskMonitor就不对看门狗定时器清零,也就达到被监视任务出现故障时系统自动重启的目的。另外任务TaskMonitor自身出故障时,也 不能及时对看门狗定时器清零,看门狗也能自动复位重启。接下来需要解决一个问题是:监视任务如何有效监视被监视的任务群。
在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次。
硬件看门狗监视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长时间得不到调度,使得看门狗错误复位。良好的任务划分,配置是不应该出现这种高优先级任务长期执行状况的。
来源: 21ic.com