对于那些无法被人类持续监控的嵌入式系统,看门狗芯片可能是一个很好的解决方案。据银根MCU的开发工程师介绍,大多数嵌入式系统都需要独立处理异常。如果操作出错,一般不可能再等人来指导。在这种情况下,需要一个复位芯片来引导嵌入式系统重启。
看门狗芯片是一种硬件,可用于自动检测软件异常,并在任何异常发生时重置处理器。一般来说,看门狗芯片基于从初始值递减到零的计数器。嵌入式软件选择计数器的初始值,并定期重启。如果在软件重启前计数器达到零,则认为软件已经失效,处理器的复位信号有效。处理器(及其运行的嵌入式软件)将重新启动,就像操作员关闭电源并再次打开电源一样。
如下图所示,看门狗芯片是处理器外部的芯片。然而,它也可以包含在与CPU相同的芯片中。这在许多单片机中都是这样做的。在任何情况下,看门狗芯片的输出与处理器的复位信号直接相关。
一、什么是踢狗(也叫:喂狗)
看门狗芯片计数器重启的过程有时被称为“踢狗(喂狗)”。踢狗的作用主要是复位重启机器,保证它能一直运行。
如在下面的情况1中,进行简单的示例。这里,我们有一个无限循环来控制系统的整体行为。这种软件架构常见于许多具有低端处理器和基于单一工作频率的行为的嵌入式系统。看门狗的硬件实现允许通过存储器映射寄存器设置计数器值。
uint16 volatile * pWatchdog=
(uint 16 volatile *)0x ff 0000;
主要(无效)
{
HW init();
for(;)
{
* pWatchdog=10000
read _ sensors();
control _马达();
display_status()。
}
}
案例一:踢狗
假设循环必须至少每五毫秒执行一次。(假设必须至少频繁地向电机提供新的控制参数。)如果看门狗芯片的计数器被初始化为对应于经过时间(即10,000毫秒)的5毫秒值,并且软件没有错误,则看门狗芯片将永远不会过期,并且软件将总是在计数器到达零之前重新启动计数器。
二、软件异常
看门狗芯片可以使系统摆脱许多危险情况。然而,为了有效,在整个软件设计中必须考虑复位看门狗芯片。设计者必须知道他们的软件可能有什么问题,并确保看门狗芯片可以检测到它们(如果有的话)。
系统挂起的原因有很多。导致执行无限循环的逻辑谬误是最简单的。让我们假设这发生在案例1的read_sensors()调用中。任何其他软件(除了ISR,如果中断仍然启用)将不会再次运行。
另一种可能性是,在一次循环中出现异常数量的中断。花费在ISR上的任何额外时间都不是花费在执行主循环上的时间。这可能会给电机的新控制指令带来危险的延迟。
使用多任务内核时可能会出现死锁。比如一组任务可能会被对方卡住等待,其中一个任务需要一些外部信号,这样整个任务组就会无限期挂起。
如果这种故障是暂时的,在每次看门狗复位后,系统可能会正常运行一段时间。但是,有故障的硬件可能会导致系统不断复位。因此,明智的做法可能是计算看门狗导致的复位次数,并在固定次数的失败后放弃尝试。
三、空手道框架接口测试
的实际看门狗实现通常具有比情况1中的软件更复杂的软件接口。当重置看门狗所需的指令集非常简单时,易受攻击的软件可能会偶尔执行此操作。考虑一个错误,它导致值10000被一次又一次地写入内存中的每个位置。这段代码会定期重启看门狗计数器,看门狗可能永远不会咬人。为了防止这种情况,许多看门狗方案要求利用两次或更多次连续写操作的复杂序列来重启看门狗芯片。
如果看门狗内置在微控制器中,当器件复位时,它可能不会自动启用。您必须确保在硬件初始化期间启用它。为了防止意外禁用看门狗的错误,硬件设计通常会使看门狗芯片一旦启用就无法禁用。
如果你的软件可以比看门狗周期更快的完成一个完整的周期,那么情况1的结构可能对你有好处。如果软件的某些部分需要很长时间才能完成,那么挑战就更大了。假设你有一个循环,等待元素加热到一定温度再返回。许多看门狗芯片的最长持续时间约为两秒。如果你不得不延迟超过这个时间长度,你可能不得不在等待周期中踢狗。如果你的软件中有很多这样的地方,可能是看门狗的控制有问题。
系统初始化是代码的一部分,通常比看门狗芯片的最大时间要长。也许内存测试或者从rom到RAM的数据传输会降低这个速度。因此,一些看门狗可以等待更长的时间,为他们的第一次踢比他们随后的踢。
随着控制线程被添加到软件中(以ISR和软件任务的形式),仅在代码中放置一个看门狗变得无效。因此,选择合适的踢球间隔也是一个重要的问题,只能通过系统特定的方式来解决。
标签:芯片软件系统