我已经在几个无操作系统的嵌入式应用程序(使用静态调度程序)中使用了内部硬件监视程序。
我所做的是:
我认为这是一种极简主义但安全的方法。
有没有最好的做法? (个人经验或经过验证的来源)
我听说/看到人们做不同的事情,比如在不同的任务中不止一次踢狗,或者只在所有任务都在超时内被调用时踢,...
您的问题有点主观,但实时应用程序有一些行业事实上的标准,如下所示:
这是最严格的要求 - 理想情况下,狗对您的各种任务一无所知,但远离应用逻辑。
在实践中,对于某些系统来说这可能很难做到 - 假设你有闪存引导加载程序和类似的,其本质上只需要很长时间。那么你可能不得不做一些肮脏的事情,比如在特定的驱动程序中放置看门狗。但这是一个努力的最佳实践。
理想情况下,您可以在应用程序的最顶层使用它:
void main (void)
{
/* init stuff */
for(;;)
{
kick_dog();
result = execute();
error_handler(result);
}
}
作为这项政策的副作用,它消除了让“有才华”的人最终在ISR中踢狗的风险。
您的方法存在的问题是,您无法通过运行所有其他任务运行的最慢任务来保证。
作为多任务环境中的扩展,您通常会得到一些高优先级的任务,这些任务是确保您并不真正关心的功能和其他任务(IO,hw-monitoring等)所必需的。
因此,只有重要的人才需要看门狗,但你必须全部观察它们。确保您需要一个非常简单的解决方案,如下所示的运行状态结构:
struct{
bool task1HaRun;
bool task2HasRun;
bool task3HasRun;
};
用它周围的互斥量。每个任务都设置自己的hasRunFlag并检查是否还设置了所有其他任务。如果设置了所有其他设置,则重置所有设备并触发监视器。如果您不让每个任务检查自己,您可能会错过被阻止的任务。
这个问题还有更优雅的方法,但是这个方法是可移植的,可以让你知道该怎么做。