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