在预定的裸机嵌入式应用程序中使用内部硬件监视程序的最安全方法是什么(以及为什么)? [关闭]

问题描述 投票:0回答:2

我已经在几个无操作系统的嵌入式应用程序(使用静态调度程序)中使用了内部硬件监视程序。

我所做的是:

  • 我寻找最慢的周期性和最低优先级的任务
  • 我将看门狗超时设置为超过最慢任务的时间
  • 然后我在最慢的任务开始时踢狗

我认为这是一种极简主义但安全的方法。

有没有最好的做法? (个人经验或经过验证的来源)

我听说/看到人们做不同的事情,比如在不同的任务中不止一次踢狗,或者只在所有任务都在超时内被调用时踢,...

c embedded watchdog bare-metal irq
2个回答
1
投票

您的问题有点主观,但实时应用程序有一些行业事实上的标准,如下所示:

  • 指定系统允许的最大响应时间。如同,允许某项任务采取的最长时间段。考虑ISR等。例如1ms。
  • 将狗设置为略长于指定响应时间的时间。
  • 从整个程序中的一个地方踢狗,最好是从main()循环或类似的合适位置(RTOS没有标准来执行此操作,AFAIK)。

这是最严格的要求 - 理想情况下,狗对您的各种任务一无所知,但远离应用逻辑。

在实践中,对于某些系统来说这可能很难做到 - 假设你有闪存引导加载程序和类似的,其本质上只需要很长时间。那么你可能不得不做一些肮脏的事情,比如在特定的驱动程序中放置看门狗。但这是一个努力的最佳实践。

理想情况下,您可以在应用程序的最顶层使用它:

void main (void)
{
  /* init stuff */

  for(;;)
  {
    kick_dog();
    result = execute();
    error_handler(result);
  }
}

作为这项政策的副作用,它消除了让“有才华”的人最终在ISR中踢狗的风险。


4
投票

您的方法存在的问题是,您无法通过运行所有其他任务运行的最慢任务来保证。

作为多任务环境中的扩展,您通常会得到一些高优先级的任务,这些任务是确保您并不真正关心的功能和其他任务(IO,hw-monitoring等)所必需的。

因此,只有重要的人才需要看门狗,但你必须全部观察它们。确保您需要一个非常简单的解决方案,如下所示的运行状态结构:

struct{
  bool task1HaRun;
  bool task2HasRun;
  bool task3HasRun;
};

用它周围的互斥量。每个任务都设置自己的hasRunFlag并检查是否还设置了所有其他任务。如果设置了所有其他设置,则重置所有设备并触发监视器。如果您不让每个任务检查自己,您可能会错过被阻止的任务。

这个问题还有更优雅的方法,但是这个方法是可移植的,可以让你知道该怎么做。

© www.soinside.com 2019 - 2024. All rights reserved.